From 17762653ad089f1c9bbf7704f45dc39bdcb419bf Mon Sep 17 00:00:00 2001 From: Jeremy White Date: Wed, 27 Dec 2023 12:46:16 -0600 Subject: [PATCH 01/11] initial renaming commit --- .cookiecutter.json | 14 +++--- .../pull_request_template.md | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/upstream_testing.yml | 2 +- CHANGELOG.md | 48 +++++++++---------- GETTING_STARTED.md | 22 ++++----- README.md | 38 +++++++-------- docs/admin/compatibility_matrix.md | 4 +- docs/admin/uninstall.md | 4 +- docs/dev/dev_environment.md | 22 ++++----- docs/index.md | 2 +- mkdocs.yml | 6 +-- nautobot_secrets_providers/__init__.py | 4 +- .../providers/delinea.py | 4 +- nautobot_secrets_providers/tests/__init__.py | 2 +- .../tests/test_providers.py | 2 +- nautobot_secrets_providers/urls.py | 2 +- nautobot_secrets_providers/views.py | 4 +- pyproject.toml | 6 +-- tasks.py | 2 +- 20 files changed, 96 insertions(+), 96 deletions(-) diff --git a/.cookiecutter.json b/.cookiecutter.json index 3fa6a8e..b9a79ca 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -4,16 +4,16 @@ "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", - "plugin_name": "nautobot_secrets_providers", - "verbose_name": "Nautobot's Secrets Providers Plugin", - "plugin_slug": "nautobot-secrets-providers", - "project_slug": "nautobot-plugin-secrets-providers", - "repo_url": "https://github.com/nautobot/nautobot-plugin-secrets-providers", + "app_name": "nautobot_secrets_providers", + "verbose_name": "Nautobot's Secrets Providers App", + "app_slug": "nautobot-secrets-providers", + "project_slug": "nautobot-app-secrets-providers", + "repo_url": "https://github.com/nautobot/nautobot-app-secrets-providers", "base_url": "secrets-providers", "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSecretsProviders", - "project_short_description": "Nautobot's Secrets Providers Plugin", + "project_short_description": "Nautobot's Secrets Providers App", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", @@ -32,4 +32,4 @@ "baked_commit_ref": "7aafeac5f8c1fb13196084cd328043b2e9d74a3a" } } -} +} \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index 3950227..b1eba07 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -31,5 +31,5 @@ - [ ] Attached Screenshots, Payload Example - [ ] Unit, Integration Tests - [ ] Documentation Updates (when adding/changing features) -- [ ] Example Plugin Updates (when adding/changing features) +- [ ] Example App Updates (when adding/changing features) - [ ] Outline Remaining Work, Constraints from Design diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 55f7b13..6180da1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ on: # yamllint disable-line rule:truthy rule:comments pull_request: ~ env: - PLUGIN_NAME: "nautobot-plugin-secrets-providers" + PLUGIN_NAME: "nautobot-app-secrets-providers" jobs: black: diff --git a/.github/workflows/upstream_testing.yml b/.github/workflows/upstream_testing.yml index e1835ae..d8875bf 100644 --- a/.github/workflows/upstream_testing.yml +++ b/.github/workflows/upstream_testing.yml @@ -10,4 +10,4 @@ jobs: uses: "nautobot/nautobot/.github/workflows/plugin_upstream_testing_base.yml@develop" with: # Below could potentially be collapsed into a single argument if a concrete relationship between both is enforced invoke_context_name: "NAUTOBOT_SECRETS_PROVIDERS" - plugin_name: "nautobot-plugin-secrets-providers" + plugin_name: "nautobot-app-secrets-providers" diff --git a/CHANGELOG.md b/CHANGELOG.md index 2930ebb..5a994d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,81 +4,81 @@ ### Added -- [#113](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/113) Added the missing fix for [issue](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/91) that was not included for v2.0.0 +- [#113](https://github.com/nautobot/nautobot-app-secrets-providers/pull/113) Added the missing fix for [issue](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) that was not included for v2.0.0 ## v2.0.0 (2023-09-23) ### Changed -- [#105](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/106) Updated `nautobot` to `2.0`. +- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) Updated `nautobot` to `2.0`. ### Removed -- [#105](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/106) Removed `slug` field from `Secret` model. Can be replaced with `name` field or [natural keys](https://docs.nautobot.com/projects/core/en/next/development/apps/migration/model-updates/global/#replace-the-usage-of-slugs-with-composite-keys). +- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) Removed `slug` field from `Secret` model. Can be replaced with `name` field or [natural keys](https://docs.nautobot.com/projects/core/en/next/development/apps/migration/model-updates/global/#replace-the-usage-of-slugs-with-composite-keys). ## v1.4.1 (2023-06-07) ### Fixed -- [#91](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/91) Fixed Hashicorp Vault Authentication with AWS Credentials when region is not set. +- [#91](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) Fixed Hashicorp Vault Authentication with AWS Credentials when region is not set. ## v1.4.0 (2023-04-19) ### Added -- [#48](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/48) Add token as secret type choice for Delinea/Thycotic -- [#51](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/51) Add support for AWS Systems Manager Parameter Store -- [#53](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/53) Add support for Hashicorp Key/Value v1 response -- [#66](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/66) Add support for Vault Enterprise Namespace parameter +- [#48](https://github.com/nautobot/nautobot-app-secrets-providers/issues/48) Add token as secret type choice for Delinea/Thycotic +- [#51](https://github.com/nautobot/nautobot-app-secrets-providers/issues/51) Add support for AWS Systems Manager Parameter Store +- [#53](https://github.com/nautobot/nautobot-app-secrets-providers/pull/53) Add support for Hashicorp Key/Value v1 response +- [#66](https://github.com/nautobot/nautobot-app-secrets-providers/pull/66) Add support for Vault Enterprise Namespace parameter ### Changed -- [#45](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/45) Change references of Thycotic to Delinea -- [#47](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/47) Change version constraint of HVAC module to allow non-major upgrades -- [#56](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/56) Change minimum supported Nautobot version to `1.4.0` -- [#63](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/63) Update plugin description when installed in Nautobot +- [#45](https://github.com/nautobot/nautobot-app-secrets-providers/pull/45) Change references of Thycotic to Delinea +- [#47](https://github.com/nautobot/nautobot-app-secrets-providers/pull/47) Change version constraint of HVAC module to allow non-major upgrades +- [#56](https://github.com/nautobot/nautobot-app-secrets-providers/pull/56) Change minimum supported Nautobot version to `1.4.0` +- [#63](https://github.com/nautobot/nautobot-app-secrets-providers/pull/63) Update app description when installed in Nautobot ## v1.3.0 (2022-08-29) ### Added -- [#32](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/32) Add support for skipping certificate validation when connecting to HashiCorp Vault. -- [#34](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/34) Add support for alternate authentication to HashiCorp Vault via AWS and Kubernetes authentication methods. -- [#38](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/38) Add support for Python 3.10. -- [#40](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/40) Add `default_mount_point` config option for HashiCorp Vault. +- [#32](https://github.com/nautobot/nautobot-app-secrets-providers/issues/32) Add support for skipping certificate validation when connecting to HashiCorp Vault. +- [#34](https://github.com/nautobot/nautobot-app-secrets-providers/issues/34) Add support for alternate authentication to HashiCorp Vault via AWS and Kubernetes authentication methods. +- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/pull/38) Add support for Python 3.10. +- [#40](https://github.com/nautobot/nautobot-app-secrets-providers/issues/40) Add `default_mount_point` config option for HashiCorp Vault. ### Changed -- [#42](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/42) Now requires python-tss-sdk version v1.2 or later +- [#42](https://github.com/nautobot/nautobot-app-secrets-providers/issues/42) Now requires python-tss-sdk version v1.2 or later ### Fixed -- [#31](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/31) Fixed NameError at startup when installed as `nautobot_secrets_providers[thycotic]`, i.e. without HashiCorp Vault support. -- [#37](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/37) Various fixes and improvements to the development environment. +- [#31](https://github.com/nautobot/nautobot-app-secrets-providers/issues/31) Fixed NameError at startup when installed as `nautobot_secrets_providers[thycotic]`, i.e. without HashiCorp Vault support. +- [#37](https://github.com/nautobot/nautobot-app-secrets-providers/pull/37) Various fixes and improvements to the development environment. ### Removed -- [#38](https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/38) - Dropped support for end-of-life Python 3.6 +- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/pull/38) - Dropped support for end-of-life Python 3.6 ## v1.2.0 (2022-05-25) ### Added -- [#8](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/8) Add support for authentication to HashiCorp Vault via AppRole as an alternative to token authentication -- [#23](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/23) Add support for non-default HashiCorp Vault mountpoints +- [#8](https://github.com/nautobot/nautobot-app-secrets-providers/issues/8) Add support for authentication to HashiCorp Vault via AppRole as an alternative to token authentication +- [#23](https://github.com/nautobot/nautobot-app-secrets-providers/issues/23) Add support for non-default HashiCorp Vault mountpoints ## v1.1.0 (2022-03-10) ### Added -- [#21](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/21) Add Thycotic Secret Server plugin +- [#21](https://github.com/nautobot/nautobot-app-secrets-providers/issues/21) Add Thycotic Secret Server plugin **Requires Python 3.7 or greater** ## v1.0.1 (2022-01-06) ### Fixed -- [#17](https://github.com/nautobot/nautobot-plugin-secrets-providers/issues/17) Fixed `ModuleNotFoundError` when not installing AWS dependencies +- [#17](https://github.com/nautobot/nautobot-app-secrets-providers/issues/17) Fixed `ModuleNotFoundError` when not installing AWS dependencies ## v1.0.0 (2021-12-22) diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md index b53a27e..13b21d8 100644 --- a/GETTING_STARTED.md +++ b/GETTING_STARTED.md @@ -15,7 +15,7 @@ - [To Rebuild or Not to Rebuild](#to-rebuild-or-not-to-rebuild) - [Updating Environment Variables](#updating-environment-variables) - [Installing Additional Python Packages](#installing-additional-python-packages) - - [Installing Additional Nautobot Plugins](#installing-additional-nautobot-plugins) + - [Installing Additional Nautobot Apps](#installing-additional-nautobot-apps) - [Updating Python Version](#updating-python-version) - [Updating Nautobot Version](#updating-nautobot-version) - [Local Development Environment](#local-development-environment) @@ -169,11 +169,11 @@ This will safely shut down all of your running Docker containers for this projec Your environment should now be fully setup, all necessary Docker containers are created and running, and you're logged into Nautobot in your web browser. Now what? -Now you can start developing your plugin in the folder generated for you by Cookiecutter. +Now you can start developing your app in the folder generated for you by Cookiecutter. ## Docker Magic -The magic here is the root directory is mounted inside your Docker containers when built and ran, so **any** changes made to the files in here are directly updated to the Nautobot plugin code running in Docker. This means that as you modify the code in your `nautobot-plugin` folder (or whatever you named your plugin when generating it via Cookiecutter), the changes will be instantly updated in Nautobot. +The magic here is the root directory is mounted inside your Docker containers when built and ran, so **any** changes made to the files in here are directly updated to the Nautobot app code running in Docker. This means that as you modify the code in your `nautobot-app` folder (or whatever you named your app when generating it via Cookiecutter), the changes will be instantly updated in Nautobot. > NOTE: There are a few exceptions to this, as outlined in the section [To Rebuild or Not To Rebuild](#to-rebuild-or-not-to-rebuild). @@ -191,7 +191,7 @@ When trying to debug an issue, one helpful thing you can look at are the logs wi > NOTE: The `-f` tag will keep the logs open, and output them in realtime as they are generated. -So for example, our plugin is named `secrets`, the command would most likely be `docker logs nautobot_secrets_providers_nautobot_1 -f`. You can find the name of all running containers via `docker ps`. +So for example, our app is named `secrets`, the command would most likely be `docker logs nautobot_secrets_providers_nautobot_1 -f`. You can find the name of all running containers via `docker ps`. If you want to view the logs specific to the worker container, simply use the name of that container instead. @@ -217,7 +217,7 @@ Once completed, the new/updated environment variables should now be live. ### Installing Additional Python Packages -If you want your plugin to leverage another available Nautobot plugin or another Python package, you can easily add them into your Docker environment. +If you want your app to leverage another available Nautobot app or another Python package, you can easily add them into your Docker environment. ```bash ➜ poetry shell @@ -232,18 +232,18 @@ Once the dependencies are resolved, stop the existing containers, rebuild the Do ➜ invoke start ``` -### Installing Additional Nautobot Plugins +### Installing Additional Nautobot Apps -Let's say for example you want the new plugin you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps Plugin. +Let's say for example you want the new app you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps app. ```bash ➜ poetry shell -➜ poetry add nautobot-chatops-plugin +➜ poetry add nautobot-chatops-app ``` -Once you activate the virtual environment via Poetry, you then tell Poetry to install the new plugin. +Once you activate the virtual environment via Poetry, you then tell Poetry to install the new app. -Before you continue, you'll need to update the file `development/nautobot_config.py` accordingly with the name of the new plugin under `PLUGINS` and any relevant settings as necessary for the plugin under `PLUGINS_CONFIG`. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier. +Before you continue, you'll need to update the file `development/nautobot_config.py` accordingly with the name of the new app under `PLUGINS` and any relevant settings as necessary for the app under `PLUGINS_CONFIG`. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier. ```bash ➜ invoke stop @@ -251,7 +251,7 @@ Before you continue, you'll need to update the file `development/nautobot_config ➜ invoke start ``` -Once the containers are up and running, you should now see the new plugin installed in your Nautobot instance. +Once the containers are up and running, you should now see the new app installed in your Nautobot instance. You can even launch an `ngrok` service locally on your laptop, pointing to port 8080 (such as for chatops development), and it will point traffic directly to your Docker images. How cool! diff --git a/README.md b/README.md index 971eac4..8e414bb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Nautobot Secrets Providers -Nautobot Secrets Providers is a plugin for [Nautobot](https://github.com/nautobot/nautobot) 1.4.0 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.4.0 added support for integrating with retrieving secrets from various secrets providers. +Nautobot Secrets Providers is a app for [Nautobot](https://github.com/nautobot/nautobot) 1.4.0 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.4.0 added support for integrating with retrieving secrets from various secrets providers. -This plugin publishes secrets providers that are not included in the within the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. +This app publishes secrets providers that are not included in the within the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. ## Supported Secrets Backends -This plugin supports the following popular secrets backends: +This app supports the following popular secrets backends: | Secrets Backend | Supported Secret Types | Supported Authentication Methods | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | @@ -17,27 +17,27 @@ This plugin supports the following popular secrets backends: ## Screenshots -![Screenshot of installed plugins](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot01.png "Plugin landing page") +![Screenshot of installed apps](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot01.png "App landing page") --- -![Screenshot of plugin home page](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot02.png "Plugin Home page") +![Screenshot of app home page](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot02.png "App Home page") --- -![Screenshot of secret using AWS Secrets Manager](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot03.png "Secret using AWS Secrets Manager") +![Screenshot of secret using AWS Secrets Manager](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot03.png "Secret using AWS Secrets Manager") --- -![Screenshot of secret using HashiCorp Vault](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot04.png "Secret using HashiCorp Vault") +![Screenshot of secret using HashiCorp Vault](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot04.png "Secret using HashiCorp Vault") --- -![Screenshot of secret using Delinea/Thycotic Secret Server by ID](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot05.png "Secret using Thycotic Secret Server by ID") +![Screenshot of secret using Delinea/Thycotic Secret Server by ID](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot05.png "Secret using Thycotic Secret Server by ID") --- -![Screenshot of secret using Delinea/Thycotic Secret Server by Path](https://raw.githubusercontent.com/nautobot/nautobot-plugin-secrets-providers/develop/docs/images/screenshot06.png "Secret using Thycotic Secret Server by Path") +![Screenshot of secret using Delinea/Thycotic Secret Server by Path](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot06.png "Secret using Thycotic Secret Server by Path") ## Installation @@ -57,13 +57,13 @@ pip install nautobot-secrets-providers[all] ### Dependencies -For this plugin to operate you must install at least one of the dependent libraries required by the secrets providers. +For this app to operate you must install at least one of the dependent libraries required by the secrets providers. **You must install the dependencies for at least one of the supported secrets providers or a `RuntimeError` will be raised.** #### AWS -AWS Secrets Manager and Systems Manager Parameter Store are supported. Both providers require the `boto3` library. This can be easily installed along with the plugin using the following command: +AWS Secrets Manager and Systems Manager Parameter Store are supported. Both providers require the `boto3` library. This can be easily installed along with the app using the following command: ```no-highlight pip install nautobot-secrets-providers[aws] @@ -71,7 +71,7 @@ pip install nautobot-secrets-providers[aws] #### HashiCorp Vault -The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the plugin using the following command: +The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the app using the following command: ```no-highlight pip install nautobot-secrets-providers[hashicorp] @@ -79,7 +79,7 @@ pip install nautobot-secrets-providers[hashicorp] #### Delinea/Thycotic Secret Server -The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` library. This can easily be installed along with the plugin using the following command: +The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` library. This can easily be installed along with the app using the following command: ```no-highlight pip install nautobot-secrets-providers[thycotic] @@ -93,7 +93,7 @@ To ensure Nautobot Secrets Providers is automatically re-installed during future echo nautobot-secrets-providers >> local_requirements.txt ``` -Once installed, the plugin needs to be enabled in your `nautobot_config.py`: +Once installed, the app needs to be enabled in your `nautobot_config.py`: ```python # In your nautobot_config.py @@ -110,7 +110,7 @@ PLUGINS = ["nautobot_secrets_providers"] Before you proceed, you must have **at least one** of the dependent libaries installed as detailed above. -Please do not enable this plugin until you are able to install the dependencies, as it will block Nautobot from starting. +Please do not enable this app until you are able to install the dependencies, as it will block Nautobot from starting. ### AWS @@ -177,7 +177,7 @@ PLUGINS_CONFIG = { ### Delinea/Thycotic Secret Server (TSS) -The Delinea/Thycotic Secret Server plugin includes two providers: +The Delinea/Thycotic Secret Server app includes two providers: - **`Thycotic Secret Server by ID`** @@ -237,7 +237,7 @@ The project is packaged with a light development environment based on `docker-co The project is following Network to Code software development guidelines and is leveraging: - Black, Pylint, Bandit and pydocstyle for Python linting and formatting. -- Django unit test to ensure the plugin is working properly. +- Django unit test to ensure the app is working properly. ### Development Environment @@ -351,8 +351,8 @@ Each command can be executed with `invoke `. Environment variables `INV flake8 This will run flake8 for the specified name and Python version. pydocstyle Run pydocstyle to validate docstring formatting adheres to NTC defined standards. pylint Run pylint code analysis. - tests Run all tests for this plugin. - unittest Run Django unit tests for the plugin. + tests Run all tests for this app. + unittest Run Django unit tests for the app. ``` ### Project Documentation diff --git a/docs/admin/compatibility_matrix.md b/docs/admin/compatibility_matrix.md index 7dbac9b..70013dc 100644 --- a/docs/admin/compatibility_matrix.md +++ b/docs/admin/compatibility_matrix.md @@ -1,8 +1,8 @@ # Compatibility Matrix !!! warning "Developer Note - Remove Me!" - Explain how the release models of the plugin and of Nautobot work together, how releases are supported, how features and older releases are deprecated etc. + Explain how the release models of the app and of Nautobot work together, how releases are supported, how features and older releases are deprecated etc. -| Nautobot's Secrets Providers Plugin Version | Nautobot First Support Version | Nautobot Last Support Version | +| Nautobot's Secrets Providers App Version | Nautobot First Support Version | Nautobot Last Support Version | | ------------- | -------------------- | ------------- | | 1.0.X | 1.4.0 | 1.99.99 | diff --git a/docs/admin/uninstall.md b/docs/admin/uninstall.md index eed653f..1cc7de8 100644 --- a/docs/admin/uninstall.md +++ b/docs/admin/uninstall.md @@ -4,10 +4,10 @@ Here you will find any steps necessary to cleanly remove the App from your Nauto ## Database Cleanup -Prior to removing the plugin from the `nautobot_config.py`, run the following command to roll back any migration specific to this plugin. +Prior to removing the app from the `nautobot_config.py`, run the following command to roll back any migration specific to this app. ```shell -nautobot-server migrate nautobot_plugin_secrets_providers zero +nautobot-server migrate nautobot_secrets_providers zero ``` !!! warning "Developer Note - Remove Me!" diff --git a/docs/dev/dev_environment.md b/docs/dev/dev_environment.md index 3d2b1f0..1ff6d77 100644 --- a/docs/dev/dev_environment.md +++ b/docs/dev/dev_environment.md @@ -127,8 +127,8 @@ Each command can be executed with `invoke `. All commands support the a flake8 Run flake8 to check that Python files adhere to its style standards. pydocstyle Run pydocstyle to validate docstring formatting adheres to NTC defined standards. pylint Run pylint code analysis. - tests Run all tests for this plugin. - unittest Run Django unit tests for the plugin. + tests Run all tests for this app. + unittest Run Django unit tests for the app. ``` ## Project Overview @@ -290,9 +290,9 @@ This will safely shut down all of your running Docker containers for this projec Your environment should now be fully setup, all necessary Docker containers are created and running, and you're logged into Nautobot in your web browser. Now what? -Now you can start developing your plugin in the project folder! +Now you can start developing your app in the project folder! -The magic here is the root directory is mounted inside your Docker containers when built and ran, so **any** changes made to the files in here are directly updated to the Nautobot plugin code running in Docker. This means that as you modify the code in your plugin folder, the changes will be instantly updated in Nautobot. +The magic here is the root directory is mounted inside your Docker containers when built and ran, so **any** changes made to the files in here are directly updated to the Nautobot app code running in Docker. This means that as you modify the code in your app folder, the changes will be instantly updated in Nautobot. !!! warning There are a few exceptions to this, as outlined in the section [To Rebuild or Not To Rebuild](#to-rebuild-or-not-to-rebuild). @@ -316,7 +316,7 @@ When trying to debug an issue, one helpful thing you can look at are the logs wi !!! info Want to limit the log output even further? Use the `--tail <#>` command line argument in conjunction with `-f`. -So for example, our plugin is named `nautobot-secrets-providers`, the command would most likely be `docker logs nautobot_secrets_providers_nautobot_1 -f`. You can find the name of all running containers via `docker ps`. +So for example, our app is named `nautobot-secrets-providers`, the command would most likely be `docker logs nautobot_secrets_providers_nautobot_1 -f`. You can find the name of all running containers via `docker ps`. If you want to view the logs specific to the worker container, simply use the name of that container instead. @@ -342,7 +342,7 @@ Once completed, the new/updated environment variables should now be live. ### Installing Additional Python Packages -If you want your plugin to leverage another available Nautobot plugin or another Python package, you can easily add them into your Docker environment. +If you want your app to leverage another available Nautobot app or another Python package, you can easily add them into your Docker environment. ```bash ➜ poetry shell @@ -357,18 +357,18 @@ Once the dependencies are resolved, stop the existing containers, rebuild the Do ➜ invoke start ``` -### Installing Additional Nautobot Plugins +### Installing Additional Nautobot Apps -Let's say for example you want the new plugin you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps Plugin. +Let's say for example you want the new app you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps App. ```bash ➜ poetry shell ➜ poetry add nautobot-chatops ``` -Once you activate the virtual environment via Poetry, you then tell Poetry to install the new plugin. +Once you activate the virtual environment via Poetry, you then tell Poetry to install the new app. -Before you continue, you'll need to update the file `development/nautobot_config.py` accordingly with the name of the new plugin under `PLUGINS` and any relevant settings as necessary for the plugin under `PLUGINS_CONFIG`. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier. +Before you continue, you'll need to update the file `development/nautobot_config.py` accordingly with the name of the new app under `PLUGINS` and any relevant settings as necessary for the app under `PLUGINS_CONFIG`. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier. ```bash ➜ invoke stop @@ -376,7 +376,7 @@ Before you continue, you'll need to update the file `development/nautobot_config ➜ invoke start ``` -Once the containers are up and running, you should now see the new plugin installed in your Nautobot instance. +Once the containers are up and running, you should now see the new app installed in your Nautobot instance. !!! note You can even launch an `ngrok` service locally on your laptop, pointing to port 8080 (such as for chatops development), and it will point traffic directly to your Docker images. diff --git a/docs/index.md b/docs/index.md index c540710..dbfdad4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # NautobotSecretsProviders -TODO: Write plugin documentation, the outline here is provided as a guide and should be expanded upon. If more detail is required you are encouraged to expand on the table of contents (TOC) in `mkdocs.yml` to add additional pages. +TODO: Write app documentation, the outline here is provided as a guide and should be expanded upon. If more detail is required you are encouraged to expand on the table of contents (TOC) in `mkdocs.yml` to add additional pages. ## Description diff --git a/mkdocs.yml b/mkdocs.yml index 44ec061..ad67a3c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,10 +1,10 @@ --- dev_addr: "127.0.0.1:8001" -edit_uri: "edit/main/nautobot-plugin-secrets-providers/docs" +edit_uri: "edit/main/nautobot-app-secrets-providers/docs" site_dir: "nautobot_secrets_providers/static/nautobot_secrets_providers/docs" -site_name: "Nautobot's Secrets Providers Plugin Documentation" +site_name: "Nautobot's Secrets Providers App Documentation" site_url: "https://docs.nautobot.com/projects/secrets-providers/en/latest/" -repo_url: "https://github.com/nautobot/nautobot-plugin-secrets-providers" +repo_url: "https://github.com/nautobot/nautobot-app-secrets-providers" copyright: "Copyright © The Authors" theme: name: "material" diff --git a/nautobot_secrets_providers/__init__.py b/nautobot_secrets_providers/__init__.py index 12e4c7c..317b14b 100644 --- a/nautobot_secrets_providers/__init__.py +++ b/nautobot_secrets_providers/__init__.py @@ -1,4 +1,4 @@ -"""Plugin declaration for nautobot_secrets_providers.""" +"""App declaration for nautobot_secrets_providers.""" # Metadata is inherited from Nautobot. If not including Nautobot in the environment, this should be added from importlib import metadata @@ -8,7 +8,7 @@ class NautobotSecretsProvidersConfig(NautobotAppConfig): - """Plugin configuration for the nautobot_secrets_providers plugin.""" + """App configuration for the nautobot_secrets_providers app.""" name = "nautobot_secrets_providers" verbose_name = "Secrets Management Extensions" diff --git a/nautobot_secrets_providers/providers/delinea.py b/nautobot_secrets_providers/providers/delinea.py index aed6f68..ae56a1a 100644 --- a/nautobot_secrets_providers/providers/delinea.py +++ b/nautobot_secrets_providers/providers/delinea.py @@ -51,9 +51,9 @@ class ThycoticSecretServerSecretsProviderBase(SecretsProvider): @classmethod def get_value_for_secret(cls, secret, obj=None, **kwargs): # pylint: disable=too-many-locals - """Return the value stored under the secret’s key in the secret’s path.""" + """Return the value stored under the secret's key in the secret's path.""" # This is only required for Thycotic Secret Server therefore not defined in - # `required_settings` for the plugin config. + # `required_settings` for the app config. plugin_settings = settings.PLUGINS_CONFIG["nautobot_secrets_providers"] if "thycotic" not in plugin_settings: raise exceptions.SecretProviderError(secret, cls, "Thycotic Secret Server is not configured!") diff --git a/nautobot_secrets_providers/tests/__init__.py b/nautobot_secrets_providers/tests/__init__.py index 40ccc72..1ce0a46 100644 --- a/nautobot_secrets_providers/tests/__init__.py +++ b/nautobot_secrets_providers/tests/__init__.py @@ -1 +1 @@ -"""Unit tests for nautobot_secrets_providers plugin.""" +"""Unit tests for nautobot_secrets_providers app.""" diff --git a/nautobot_secrets_providers/tests/test_providers.py b/nautobot_secrets_providers/tests/test_providers.py index 24f2998..d8eba67 100644 --- a/nautobot_secrets_providers/tests/test_providers.py +++ b/nautobot_secrets_providers/tests/test_providers.py @@ -248,7 +248,7 @@ def test_v1(self, requests_mocker): @requests_mock.Mocker() def test_v2_fallback(self, requests_mocker): """ - Before https://github.com/nautobot/nautobot-plugin-secrets-providers/pull/53 was merged, the Hashicorp + Before https://github.com/nautobot/nautobot-app-secrets-providers/pull/53 was merged, the Hashicorp provider would only support KV v2 and did not include a way to specify the KV version. This test ensures that the provider will still work without the kv_version parameter. """ diff --git a/nautobot_secrets_providers/urls.py b/nautobot_secrets_providers/urls.py index 18f342f..7a00e21 100644 --- a/nautobot_secrets_providers/urls.py +++ b/nautobot_secrets_providers/urls.py @@ -1,4 +1,4 @@ -"""Django urlpatterns declaration for nautobot_secrets_providers plugin.""" +"""Django urlpatterns declaration for nautobot_secrets_providers app.""" from django.urls import path from nautobot_secrets_providers import views diff --git a/nautobot_secrets_providers/views.py b/nautobot_secrets_providers/views.py index 92678a8..ea5be32 100644 --- a/nautobot_secrets_providers/views.py +++ b/nautobot_secrets_providers/views.py @@ -1,4 +1,4 @@ -"""Plugin UI views for Secrets Providers.""" +"""App UI views for Secrets Providers.""" from django.views.generic import TemplateView @@ -6,7 +6,7 @@ class SecretsProvidersHomeView(TemplateView): - """Plugin home page for Secrets Providers.""" + """App home page for Secrets Providers.""" template_name = "nautobot_secrets_providers/home.html" diff --git a/pyproject.toml b/pyproject.toml index ab5e058..65f9801 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,9 +5,9 @@ description = "Nautobot Secrets Providers App" authors = ["Network to Code, LLC "] license = "Apache-2.0" readme = "README.md" -homepage = "https://github.com/nautobot/nautobot-plugin-secrets-providers" -repository = "https://github.com/nautobot/nautobot-plugin-secrets-providers" -keywords = ["nautobot", "nautobot-plugin"] +homepage = "https://github.com/nautobot/nautobot-app-secrets-providers" +repository = "https://github.com/nautobot/nautobot-app-secrets-providers" +keywords = ["nautobot", "nautobot-plugin", "nautobot-app"] classifiers = [ "Intended Audience :: Developers", "Development Status :: 5 - Production/Stable", diff --git a/tasks.py b/tasks.py index 23142e9..bf2f545 100644 --- a/tasks.py +++ b/tasks.py @@ -671,7 +671,7 @@ def unittest_coverage(context): } ) def tests(context, failfast=False, keepdb=False, lint_only=False): - """Run all tests for this plugin.""" + """Run all tests for this app.""" # If we are not running locally, start the docker containers so we don't have to for each test if not is_truthy(context.nautobot_secrets_providers.local): print("Starting Docker Containers...") From 71143c788535253feb685c9ab5534e17cc81025d Mon Sep 17 00:00:00 2001 From: Jeremy White Date: Wed, 27 Dec 2023 12:49:37 -0600 Subject: [PATCH 02/11] initial renaming commit --- .cookiecutter.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.cookiecutter.json b/.cookiecutter.json index b9a79ca..99a6cf3 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -32,4 +32,5 @@ "baked_commit_ref": "7aafeac5f8c1fb13196084cd328043b2e9d74a3a" } } -} \ No newline at end of file +} + From 52bbbaa61b6fe9c4b7ac49fd69400daf2ef56cf7 Mon Sep 17 00:00:00 2001 From: Jeremy White Date: Mon, 8 Jan 2024 12:38:40 -0600 Subject: [PATCH 03/11] swap to APP_NAME --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6180da1..d6ce8f7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ on: # yamllint disable-line rule:truthy rule:comments pull_request: ~ env: - PLUGIN_NAME: "nautobot-app-secrets-providers" + APP_NAME: "nautobot-app-secrets-providers" jobs: black: @@ -116,7 +116,7 @@ jobs: context: "./" push: false load: true - tags: "${{ env.PLUGIN_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + tags: "${{ env.APP_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" file: "./development/Dockerfile" cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" @@ -159,7 +159,7 @@ jobs: context: "./" push: false load: true - tags: "${{ env.PLUGIN_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + tags: "${{ env.APP_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" file: "./development/Dockerfile" cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" @@ -206,7 +206,7 @@ jobs: context: "./" push: false load: true - tags: "${{ env.PLUGIN_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + tags: "${{ env.APP_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" file: "./development/Dockerfile" cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" From 4af24d2354cd0dddc189ea17b04b76fc8db82537 Mon Sep 17 00:00:00 2001 From: Nautobot-Bot <79372327+nautobot-bot@users.noreply.github.com> Date: Fri, 1 Mar 2024 09:33:58 -0600 Subject: [PATCH 04/11] Cookie updated by NetworkToCode Cookie Drift Manager Tool (#124) * Cookie updated by NetworkToCode Cookie Drift Manager Tool Template: ``` { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "dir": "nautobot-app", "ref": "refs/tags/nautobot-app-v2.1.0", "path": null } ``` Cookie: ``` { "remote": "https://github.com/nautobot/nautobot-app-secrets-providers.git", "path": "/tmp/tmp32begwjf/nautobot-app-secrets-providers", "repository_path": "/tmp/tmp32begwjf/nautobot-app-secrets-providers", "dir": "", "branch_prefix": "drift-manager", "context": { "codeowner_github_usernames": "@smith-ntc", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_secrets_providers", "verbose_name": "Nautobot's Secrets Providers App", "app_slug": "nautobot-secrets-providers", "project_slug": "nautobot-app-secrets-providers", "repo_url": "https://github.com/nautobot/nautobot-app-secrets-providers", "base_url": "secrets-providers", "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSecretsProviders", "project_short_description": "Nautobot's Secrets Providers App", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", "docs_app_url": "https://docs.nautobot.com/projects/secrets-providers/en/latest", "_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "_output_dir": "/tmp/tmp32begwjf", "_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app", "_checkout": "refs/tags/nautobot-app-v2.1.0" }, "base_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.CREATE", "post_actions": [ "PostAction.BLACK" ], "baked_commit_ref": "7aafeac5f8c1fb13196084cd328043b2e9d74a3a", "draft": true } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "", "template_dir": "", "template_ref": "refs/tags/nautobot-app-v2.1.0", "pull_request": null, "post_action": [], "disable_post_actions": false, "draft": null } ``` * chore: Manual fixes * chore: Poetry lock * chore: Added changelog fragment * fix: PR comments --------- Co-authored-by: bakebot Co-authored-by: Jan Snasel --- .cookiecutter.json | 6 +- .../pull_request_template.md | 2 +- .github/workflows/ci.yml | 49 ++- .github/workflows/rebake.yml | 118 ------ LICENSE | 2 +- README.md | 13 +- changes/.gitignore | 1 + changes/124.changed | 1 + development/Dockerfile | 6 +- development/docker-compose.base.yml | 6 +- development/docker-compose.dev.yml | 12 + development/nautobot_config.py | 3 - development/towncrier_template.j2 | 30 ++ docs/admin/compatibility_matrix.md | 1 + docs/admin/uninstall.md | 6 + docs/assets/extra.css | 5 + docs/dev/dev_environment.md | 7 +- nautobot_secrets_providers/__init__.py | 8 +- .../migrations/__init__.py | 0 .../tests/test_basic.py | 12 - poetry.lock | 348 ++++++++++++++++-- pyproject.toml | 130 +++++-- tasks.py | 153 ++++++-- 23 files changed, 686 insertions(+), 233 deletions(-) delete mode 100644 .github/workflows/rebake.yml create mode 100644 changes/.gitignore create mode 100644 changes/124.changed create mode 100644 development/towncrier_template.j2 delete mode 100644 nautobot_secrets_providers/migrations/__init__.py diff --git a/.cookiecutter.json b/.cookiecutter.json index 99a6cf3..8e969ef 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -13,7 +13,7 @@ "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSecretsProviders", - "project_short_description": "Nautobot's Secrets Providers App", + "project_short_description": "Nautobot App that provides direct integrations with Enterprise secrets management systems. Provides patterns to securely fetch secrets for use by other Nautobot Apps and Nautobot Jobs.", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", @@ -21,7 +21,7 @@ "_drift_manager": { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "template_dir": "nautobot-app", - "template_ref": "develop", + "template_ref": "refs/tags/nautobot-app-v2.1.0", "cookie_dir": "", "branch_prefix": "drift-manager", "pull_request_strategy": "create", @@ -29,7 +29,7 @@ "black" ], "draft": true, - "baked_commit_ref": "7aafeac5f8c1fb13196084cd328043b2e9d74a3a" + "baked_commit_ref": "19d14aa7031336b5872b82806f71d7b1856d4fe1" } } } diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index b1eba07..688ff03 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -1,5 +1,5 @@ " +issue_format = "[#{issue}](https://github.com/nautobot/nautobot-app-secrets-providers/issues/{issue})" + +[[tool.towncrier.type]] +directory = "security" +name = "Security" +showcontent = true + +[[tool.towncrier.type]] +directory = "added" +name = "Added" +showcontent = true + +[[tool.towncrier.type]] +directory = "changed" +name = "Changed" +showcontent = true + +[[tool.towncrier.type]] +directory = "deprecated" +name = "Deprecated" +showcontent = true + +[[tool.towncrier.type]] +directory = "removed" +name = "Removed" +showcontent = true + +[[tool.towncrier.type]] +directory = "fixed" +name = "Fixed" +showcontent = true + +[[tool.towncrier.type]] +directory = "dependencies" +name = "Dependencies" +showcontent = true + +[[tool.towncrier.type]] +directory = "documentation" +name = "Documentation" +showcontent = true + +[[tool.towncrier.type]] +directory = "housekeeping" +name = "Housekeeping" +showcontent = true diff --git a/tasks.py b/tasks.py index bf2f545..c257d86 100644 --- a/tasks.py +++ b/tasks.py @@ -13,6 +13,8 @@ """ import os +from pathlib import Path +from time import sleep from invoke.collection import Collection from invoke.tasks import task as invoke_task @@ -67,6 +69,25 @@ def _is_compose_included(context, name): return f"docker-compose.{name}.yml" in context.nautobot_secrets_providers.compose_files +def _await_healthy_service(context, service): + container_id = docker_compose(context, f"ps -q -- {service}", pty=False, echo=False, hide=True).stdout.strip() + _await_healthy_container(context, container_id) + + +def _await_healthy_container(context, container_id): + while True: + result = context.run( + "docker inspect --format='{{.State.Health.Status}}' " + container_id, + pty=False, + echo=False, + hide=True, + ) + if result.stdout.strip() == "healthy": + break + print(f"Waiting for `{container_id}` container to become healthy ...") + sleep(1) + + def task(function=None, *args, **kwargs): """Task decorator to override the default Invoke task decorator and add each task to the invoke namespace.""" @@ -216,11 +237,46 @@ def stop(context, service=""): docker_compose(context, "stop" if service else "down --remove-orphans", service=service) -@task -def destroy(context): +@task( + aliases=("down",), + help={ + "volumes": "Remove Docker compose volumes (default: True)", + "import-db-file": "Import database from `import-db-file` file into the fresh environment (default: empty)", + }, +) +def destroy(context, volumes=True, import_db_file=""): """Destroy all containers and volumes.""" print("Destroying Nautobot...") - docker_compose(context, "down --remove-orphans --volumes") + docker_compose(context, f"down --remove-orphans {'--volumes' if volumes else ''}") + + if not import_db_file: + return + + if not volumes: + raise ValueError("Cannot specify `--no-volumes` and `--import-db-file` arguments at the same time.") + + print(f"Importing database file: {import_db_file}...") + + input_path = Path(import_db_file).absolute() + if not input_path.is_file(): + raise ValueError(f"File not found: {input_path}") + + command = [ + "run", + "--rm", + "--detach", + f"--volume='{input_path}:/docker-entrypoint-initdb.d/dump.sql'", + "--", + "db", + ] + + container_id = docker_compose(context, " ".join(command), pty=False, echo=False, hide=True).stdout.strip() + _await_healthy_container(context, container_id) + print("Stopping database container...") + context.run(f"docker stop {container_id}", pty=False, echo=False, hide=True) + + print("Database import complete, you can start Nautobot with the following command:") + print("invoke start") @task @@ -424,27 +480,43 @@ def dbshell(context, db_name="", input_file="", output_file="", query=""): @task( help={ + "db-name": "Database name to create (default: Nautobot database)", "input-file": "SQL dump file to replace the existing database with. This can be generated using `invoke backup-db` (default: `dump.sql`).", } ) -def import_db(context, input_file="dump.sql"): - """Stop Nautobot containers and replace the current database with the dump into the running `db` container.""" - docker_compose(context, "stop -- nautobot worker") +def import_db(context, db_name="", input_file="dump.sql"): + """Stop Nautobot containers and replace the current database with the dump into `db` container.""" + docker_compose(context, "stop -- nautobot worker beat") + start(context, "db") + _await_healthy_service(context, "db") command = ["exec -- db sh -c '"] if _is_compose_included(context, "mysql"): + if not db_name: + db_name = "$MYSQL_DATABASE" command += [ + "mysql --user root --password=$MYSQL_ROOT_PASSWORD", + '--execute="', + f"DROP DATABASE IF EXISTS {db_name};", + f"CREATE DATABASE {db_name};", + "" + if db_name == "$MYSQL_DATABASE" + else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;", + '"', + "&&", "mysql", - "--database=$MYSQL_DATABASE", + f"--database={db_name}", "--user=$MYSQL_USER", "--password=$MYSQL_PASSWORD", ] elif _is_compose_included(context, "postgres"): + if not db_name: + db_name = "$POSTGRES_DB" command += [ - "psql", - "--username=$POSTGRES_USER", - "postgres", + f"dropdb --if-exists --user=$POSTGRES_USER {db_name} &&", + f"createdb --user=$POSTGRES_USER {db_name} &&", + f"psql --user=$POSTGRES_USER --dbname={db_name}", ] else: raise ValueError("Unsupported database backend.") @@ -467,7 +539,10 @@ def import_db(context, input_file="dump.sql"): } ) def backup_db(context, db_name="", output_file="dump.sql", readable=True): - """Dump database into `output_file` file from running `db` container.""" + """Dump database into `output_file` file from `db` container.""" + start(context, "db") + _await_healthy_service(context, "db") + command = ["exec -- db sh -c '"] if _is_compose_included(context, "mysql"): @@ -475,17 +550,12 @@ def backup_db(context, db_name="", output_file="dump.sql", readable=True): "mysqldump", "--user=root", "--password=$MYSQL_ROOT_PASSWORD", - "--add-drop-database", "--skip-extended-insert" if readable else "", - "--databases", db_name if db_name else "$MYSQL_DATABASE", ] elif _is_compose_included(context, "postgres"): command += [ "pg_dump", - "--clean", - "--create", - "--if-exists", "--username=$POSTGRES_USER", f"--dbname={db_name or '$POSTGRES_DB'}", "--inserts" if readable else "", @@ -542,6 +612,19 @@ def help_task(context): context.run(f"invoke {task_name} --help") +@task( + help={ + "version": "Version of Nautobot's Secrets Providers App to generate the release notes for.", + } +) +def generate_release_notes(context, version=""): + """Generate Release Notes using Towncrier.""" + command = "env DJANGO_SETTINGS_MODULE=nautobot.core.settings towncrier build" + if version: + command += f" --version {version}" + run_command(context, command) + + # ------------------------------------------------------------------------------ # TESTS # ------------------------------------------------------------------------------ @@ -585,12 +668,34 @@ def pylint(context): run_command(context, command) -@task -def pydocstyle(context): - """Run pydocstyle to validate docstring formatting adheres to NTC defined standards.""" - # We exclude the /migrations/ directory since it is autogenerated code - command = "pydocstyle ." - run_command(context, command) +@task(aliases=("a",)) +def autoformat(context): + """Run code autoformatting.""" + black(context, autoformat=True) + ruff(context, action="both", fix=True) + + +@task( + help={ + "action": "One of 'lint', 'format', or 'both'", + "fix": "Automatically fix selected action. May not be able to fix all.", + "output_format": "see https://docs.astral.sh/ruff/settings/#output-format", + }, +) +def ruff(context, action="lint", fix=False, output_format="text"): + """Run ruff to perform code formatting and/or linting.""" + if action != "lint": + command = "ruff format" + if not fix: + command += " --check" + command += " ." + run_command(context, command) + if action != "format": + command = "ruff check" + if fix: + command += " --fix" + command += f" --output-format {output_format} ." + run_command(context, command) @task @@ -679,12 +784,12 @@ def tests(context, failfast=False, keepdb=False, lint_only=False): # Sorted loosely from fastest to slowest print("Running black...") black(context) + print("Running ruff...") + ruff(context) print("Running flake8...") flake8(context) print("Running bandit...") bandit(context) - print("Running pydocstyle...") - pydocstyle(context) print("Running yamllint...") yamllint(context) print("Running poetry check...") From f6274271776d1dca45c8a19830de0440625ecd46 Mon Sep 17 00:00:00 2001 From: Nautobot-Bot <79372327+nautobot-bot@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:24:08 -0500 Subject: [PATCH 05/11] Cookie updated by NetworkToCode Cookie Drift Manager Tool (#128) * Cookie updated by NetworkToCode Cookie Drift Manager Tool Template: ``` { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "dir": "nautobot-app", "ref": "refs/tags/nautobot-app-v2.2.0", "path": null } ``` Cookie: ``` { "remote": "https://github.com/nautobot/nautobot-app-secrets-providers.git", "path": "/tmp/tmp6nzvny6c/nautobot-app-secrets-providers", "repository_path": "/tmp/tmp6nzvny6c/nautobot-app-secrets-providers", "dir": "", "branch_prefix": "drift-manager", "context": { "codeowner_github_usernames": "@smith-ntc", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_secrets_providers", "verbose_name": "Nautobot's Secrets Providers App", "app_slug": "nautobot-secrets-providers", "project_slug": "nautobot-app-secrets-providers", "repo_url": "https://github.com/nautobot/nautobot-app-secrets-providers", "base_url": "secrets-providers", "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSecretsProviders", "project_short_description": "Nautobot App that provides direct integrations with Enterprise secrets management systems. Provides patterns to securely fetch secrets for use by other Nautobot Apps and Nautobot Jobs.", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", "docs_app_url": "https://docs.nautobot.com/projects/secrets-providers/en/latest", "_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "_output_dir": "/tmp/tmp6nzvny6c", "_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app", "_checkout": "refs/tags/nautobot-app-v2.2.0" }, "base_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.CREATE", "post_actions": [ "PostAction.BLACK" ], "baked_commit_ref": "19d14aa7031336b5872b82806f71d7b1856d4fe1", "draft": true } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "", "template_dir": "", "template_ref": "refs/tags/nautobot-app-v2.2.0", "pull_request": null, "post_action": [], "disable_post_actions": false, "draft": null } ``` * fix: Added changelog fragment * chore: Manual fixes * chore: Lock poetry * update install docs * update json schema * update app overview doc * test * test * update compatibility matrix * major docs reorganization to match cookie * update lockfile * update doc index --------- Co-authored-by: bakebot Co-authored-by: Jan Snasel Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com> --- .cookiecutter.json | 4 +- .../pull_request_template.md | 1 - .github/workflows/ci.yml | 72 +-- FAQ.md | 1 - GETTING_STARTED.md | 334 ----------- README.md | 541 +----------------- changes/8.housekeeping | 1 + development/Dockerfile | 2 +- development/app_config_schema.py | 64 +++ development/nautobot_config.py | 4 +- development/towncrier_template.j2 | 2 +- docs/admin/compatibility_matrix.md | 10 +- docs/admin/install.md | 212 +++++++ docs/dev/contributing.md | 72 +++ docs/dev/dev_environment.md | 271 ++++++++- docs/index.md | 34 +- mkdocs.yml | 14 +- .../app-config-schema.json | 95 +++ poetry.lock | 67 ++- pyproject.toml | 5 +- tasks.py | 56 +- 21 files changed, 871 insertions(+), 991 deletions(-) delete mode 100644 FAQ.md delete mode 100644 GETTING_STARTED.md create mode 100644 changes/8.housekeeping create mode 100644 development/app_config_schema.py create mode 100644 docs/admin/install.md create mode 100644 docs/dev/contributing.md create mode 100644 nautobot_secrets_providers/app-config-schema.json diff --git a/.cookiecutter.json b/.cookiecutter.json index 8e969ef..5067585 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -21,7 +21,7 @@ "_drift_manager": { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "template_dir": "nautobot-app", - "template_ref": "refs/tags/nautobot-app-v2.1.0", + "template_ref": "refs/tags/nautobot-app-v2.2.0", "cookie_dir": "", "branch_prefix": "drift-manager", "pull_request_strategy": "create", @@ -29,7 +29,7 @@ "black" ], "draft": true, - "baked_commit_ref": "19d14aa7031336b5872b82806f71d7b1856d4fe1" + "baked_commit_ref": "07ab5a6da72c934c43f1f957ce073bedbfdbfc9a" } } } diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index 688ff03..6881e27 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -31,5 +31,4 @@ - [ ] Attached Screenshots, Payload Example - [ ] Unit, Integration Tests - [ ] Documentation Updates (when adding/changing features) -- [ ] Example App Updates (when adding/changing features) - [ ] Outline Remaining Work, Constraints from Design diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 234771c..ed9d230 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Linting: black" run: "poetry run invoke black" bandit: @@ -36,7 +36,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Linting: bandit" run: "poetry run invoke bandit" ruff: @@ -47,7 +47,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Linting: ruff" run: "poetry run invoke ruff" check-docs-build: @@ -58,7 +58,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Check Docs Build" run: "poetry run invoke build-and-check-docs" flake8: @@ -69,7 +69,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Linting: flake8" run: "poetry run invoke flake8" poetry: @@ -80,7 +80,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Checking: poetry lock file" run: "poetry run invoke lock --check" yamllint: @@ -91,10 +91,10 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Linting: yamllint" run: "poetry run invoke yamllint" - pylint: + check-in-docker: needs: - "black" - "bandit" @@ -116,7 +116,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Set up Docker Buildx" id: "buildx" uses: "docker/setup-buildx-action@v3" @@ -138,53 +138,13 @@ jobs: run: "cp development/creds.example.env development/creds.env" - name: "Linting: pylint" run: "poetry run invoke pylint" - check-migrations: - needs: - - "bandit" - - "ruff" - - "flake8" - - "poetry" - - "yamllint" - - "black" - runs-on: "ubuntu-22.04" - strategy: - fail-fast: true - matrix: - python-version: ["3.11"] - nautobot-version: ["2.0.0"] - env: - INVOKE_NAUTOBOT_SECRETS_PROVIDERS_PYTHON_VER: "${{ matrix.python-version }}" - INVOKE_NAUTOBOT_SECRETS_PROVIDERS_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v4" - - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" - - name: "Set up Docker Buildx" - id: "buildx" - uses: "docker/setup-buildx-action@v3" - - name: "Build" - uses: "docker/build-push-action@v5" - with: - builder: "${{ steps.buildx.outputs.name }}" - context: "./" - push: false - load: true - tags: "${{ env.APP_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" - file: "./development/Dockerfile" - cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" - cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" - build-args: | - NAUTOBOT_VER=${{ matrix.nautobot-version }} - PYTHON_VER=${{ matrix.python-version }} - - name: "Copy credentials" - run: "cp development/creds.example.env development/creds.env" + - name: "Checking: App Config" + run: "poetry run invoke validate-app-config" - name: "Checking: migrations" run: "poetry run invoke check-migrations" unittest: needs: - - "pylint" - - "check-migrations" + - "check-in-docker" strategy: fail-fast: true matrix: @@ -206,7 +166,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Set up Docker Buildx" id: "buildx" uses: "docker/setup-buildx-action@v3" @@ -242,7 +202,7 @@ jobs: with: fetch-depth: "0" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v4" + uses: "networktocode/gh-action-setup-poetry-environment@v6" - name: "Check for changelog entry" run: | git fetch --no-tags origin +refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }} @@ -259,7 +219,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Set up Python" - uses: "actions/setup-python@v4" + uses: "actions/setup-python@v5" with: python-version: "3.11" - name: "Install Python Packages" @@ -294,7 +254,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Set up Python" - uses: "actions/setup-python@v4" + uses: "actions/setup-python@v5" with: python-version: "3.11" - name: "Install Python Packages" diff --git a/FAQ.md b/FAQ.md deleted file mode 100644 index 318b08d..0000000 --- a/FAQ.md +++ /dev/null @@ -1 +0,0 @@ -# Frequently Asked Questions diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md deleted file mode 100644 index 13b21d8..0000000 --- a/GETTING_STARTED.md +++ /dev/null @@ -1,334 +0,0 @@ -# Decide On Development Environment - -- [Decide On Development Environment](#decide-on-development-environment) - - [Introduction](#introduction) - - [Poetry](#poetry) - - [Full Docker Development Environment](#full-docker-development-environment) - - [Invoke](#invoke) - - [Invoke - Building the Docker Image](#invoke---building-the-docker-image) - - [Invoke - Starting the Development Environment](#invoke---starting-the-development-environment) - - [Invoke - Creating a Superuser](#invoke---creating-a-superuser) - - [Invoke - Stopping the Development Environment](#invoke---stopping-the-development-environment) - - [Real-Time Updates? How Cool!](#real-time-updates-how-cool) - - [Docker Magic](#docker-magic) - - [Docker Logs](#docker-logs) - - [To Rebuild or Not to Rebuild](#to-rebuild-or-not-to-rebuild) - - [Updating Environment Variables](#updating-environment-variables) - - [Installing Additional Python Packages](#installing-additional-python-packages) - - [Installing Additional Nautobot Apps](#installing-additional-nautobot-apps) - - [Updating Python Version](#updating-python-version) - - [Updating Nautobot Version](#updating-nautobot-version) - - [Local Development Environment](#local-development-environment) - - [Other Miscellaneous Commands To Know](#other-miscellaneous-commands-to-know) - - [Python Shell](#python-shell) - - [Tests](#tests) - -## Introduction - -The cookie provides the ability to develop and manage the Nautobot server locally (with supporting services being *Dockerized*) or using only Docker containers to manage Nautobot. The main difference between the two environments is the ability to debug and use **pdb** when developing locally. Debugging with **pdb** within the Docker container is more complicated, but can still be accomplished by either exec'ing into the container or attaching your IDE to the container and running the Nautobot service manually within the container. - -The upside to having the Nautobot service handled by Docker rather than locally is that you do not have to manage the Nautobot server and the [Docker logs](#docker-logs) provide the majority information you will need to help troubleshoot while getting started quickly and not requiring you to perform several manual steps to get started and remember to have the Nautobot server running or having it run in a separate terminal while you develop. Ultimately, the decision is yours as to how you want to develop, but it was agreed it would be a good idea to provide pros and cons for each development environment. - -> The local environment still uses Docker containers for the supporting services (Postgres, Redis, and RQ Worker), but the Nautobot server is handled locally by you, the developer. - -Follow the directions below for the specific development environment that you choose. - -## Poetry - -Poetry is used in lieu of the "virtualenv" commands and is used for either environment. The virtual environment will provide most of the Python packages required to manage the development environment such as **Invoke**, but see the [Local Development Environment](#local-development-environment) section to see how to install Nautobot if you're going to be developing locally. To get started, run the following commands: - -```bash -➜ poetry install -➜ poetry shell -``` - -The first command creates the virtual environment through Poetry and installs all relevant dependencies, as outlined in the `pyproject.toml` file. - -The second command puts your shell session into the virtual environment, so all commands ran going forward are from within the virtual environment. (This is similar to running the `source venv/bin/activate` command with virtualenvs). - -## Full Docker Development Environment - -### Invoke - -The beauty of **Invoke** is that the Cookiecutter template provides several simple CLI commands to get developing fast. You'll use a few `invoke` commands to get your environment up and running. - -#### Invoke - Building the Docker Image - -The first thing you need to do is build the necessary Docker image for Nautobot that installs the specific **nautobot_ver**. The image is used for Nautobot and the RQ worker service used by Docker Compose. - -```bash -➜ invoke build -... -#14 exporting to image -#14 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00 -#14 exporting layers -#14 exporting layers 1.2s done -#14 writing image sha256:2d524bc1665327faa0d34001b0a9d2ccf450612bf8feeb969312e96a2d3e3503 done -#14 naming to docker.io/secrets/nautobot:1.2.0-py3.7 done -``` - -### Invoke - Starting the Development Environment - -Next, you need to start up your Docker containers. - -```bash -➜ invoke start -Starting Nautobot in detached mode... -Running docker-compose command "up --detach" -Creating network "nautobot_secrets_providers_default" with the default driver -Creating volume "nautobot_secrets_providers_postgres_data" with default driver -Creating nautobot_secrets_providers_redis_1 ... -Creating nautobot_secrets_providers_docs_1 ... -Creating nautobot_secrets_providers_postgres_1 ... -Creating nautobot_secrets_providers_postgres_1 ... done -Creating nautobot_secrets_providers_redis_1 ... done -Creating nautobot_secrets_providers_nautobot_1 ... -Creating nautobot_secrets_providers_docs_1 ... done -Creating nautobot_secrets_providers_nautobot_1 ... done -Creating nautobot_secrets_providers_worker_1 ... -Creating nautobot_secrets_providers_worker_1 ... done -Docker Compose is now in the Docker CLI, try `docker compose up` -``` - -This will start all of the Docker containers used for hosting Nautobot. Once the containers are up, you should be able to open up a web browser, and view the homepage at [http://localhost:8080](http://localhost:8080). - -> NOTE: Sometimes the containers take a minute to fully spin up. If the page doesn't load right away, wait a minute and try again. - -```bash -➜ docker ps -****CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -ee90fbfabd77 secrets/nautobot:1.2.0-py3.7 "nautobot-server rqw…" 16 seconds ago Up 13 seconds nautobot_secrets_providers_worker_1 -b8adb781d013 secrets/nautobot:1.2.0-py3.7 "/docker-entrypoint.…" 20 seconds ago Up 15 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp nautobot_secrets_providers_nautobot_1 -d64ebd60675d secrets/nautobot:1.2.0-py3.7 "mkdocs serve -v -a …" 25 seconds ago Up 18 seconds 0.0.0.0:8001->8080/tcp, :::8001->8080/tcp nautobot_secrets_providers_docs_1 -e72d63129b36 postgres:13-alpine "docker-entrypoint.s…" 25 seconds ago Up 19 seconds 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp nautobot_secrets_providers_postgres_1 -96c6ff66997c redis:6-alpine "docker-entrypoint.s…" 25 seconds ago Up 21 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp nautobot_secrets_providers_redis_1 -``` - -You should see the following containers running after running `invoke start` at this time of writing. - -### Invoke - Creating a Superuser - -The Nautobot development image will automatically provision a super user when specifying the following variables within `creds.env` which is the default when copying `creds.example.env` to `creds.env`. - -- **NAUTOBOT_CREATE_SUPERUSER=true** -- **NAUTOBOT_SUPERUSER_API_TOKEN=0123456789abcdef0123456789abcdef01234567** -- **NAUTOBOT_SUPERUSER_PASSWORD=admin** - -> NOTE: The default username is **admin**, but can be overridden by specifying **NAUTOBOT_SUPERUSER_USERNAME**. - -If you need to create additional superusers, run the follow commands. - -```bash -➜ invoke createsuperuser -Running docker-compose command "ps --services --filter status=running" -Running docker-compose command "exec nautobot nautobot-server createsuperuser --username admin" -Error: That username is already taken. -Username: ntc -Email address: ntc@networktocode.com -Password: -Password (again): -Superuser created successfully. -``` - -### Invoke - Stopping the Development Environment - -The last command to know for now is `invoke stop`. - -```bash -➜ invoke stop -Stopping Nautobot... -Running docker-compose command "down" -Stopping nautobot_secrets_providers_worker_1 ... -Stopping nautobot_secrets_providers_nautobot_1 ... -Stopping nautobot_secrets_providers_docs_1 ... -Stopping nautobot_secrets_providers_redis_1 ... -Stopping nautobot_secrets_providers_postgres_1 ... -Stopping nautobot_secrets_providers_worker_1 ... done -Stopping nautobot_secrets_providers_nautobot_1 ... done -Stopping nautobot_secrets_providers_postgres_1 ... done -Stopping nautobot_secrets_providers_redis_1 ... done -Stopping nautobot_secrets_providers_docs_1 ... done -Removing nautobot_secrets_providers_worker_1 ... -Removing nautobot_secrets_providers_nautobot_1 ... -Removing nautobot_secrets_providers_docs_1 ... -Removing nautobot_secrets_providers_redis_1 ... -Removing nautobot_secrets_providers_postgres_1 ... -Removing nautobot_secrets_providers_postgres_1 ... done -Removing nautobot_secrets_providers_docs_1 ... done -Removing nautobot_secrets_providers_worker_1 ... done -Removing nautobot_secrets_providers_redis_1 ... done -Removing nautobot_secrets_providers_nautobot_1 ... done -Removing network nautobot_secrets_providers_default -``` - -This will safely shut down all of your running Docker containers for this project. When you are ready to spin containers back up, it is as simple as running `invoke start` again like in [**Invoke - Starting the Development Environment**](#invoke---starting-the-development-environment). - -> NOTE: If you're wanting to reset the database and configuration settings, you can use the `invoke destroy` command, but it will result in data loss so make sure that is what you want to do. - -### Real-Time Updates? How Cool! - -Your environment should now be fully setup, all necessary Docker containers are created and running, and you're logged into Nautobot in your web browser. Now what? - -Now you can start developing your app in the folder generated for you by Cookiecutter. - -## Docker Magic - -The magic here is the root directory is mounted inside your Docker containers when built and ran, so **any** changes made to the files in here are directly updated to the Nautobot app code running in Docker. This means that as you modify the code in your `nautobot-app` folder (or whatever you named your app when generating it via Cookiecutter), the changes will be instantly updated in Nautobot. - -> NOTE: There are a few exceptions to this, as outlined in the section [To Rebuild or Not To Rebuild](#to-rebuild-or-not-to-rebuild). - -The backend Django process is setup to automatically reload itself (it only takes a couple of seconds) every time a file is updated (saved). So for example, if you were to update one of the files like `tables.py`, then save it, the changes will be visible right away in the web browser! - -> NOTE: You may get connection refused while Django reloads, but it should be refreshed fairly quickly. - -### Docker Logs - -When trying to debug an issue, one helpful thing you can look at are the logs within the Docker containers. - -```bash -➜ docker logs -f -``` - -> NOTE: The `-f` tag will keep the logs open, and output them in realtime as they are generated. - -So for example, our app is named `secrets`, the command would most likely be `docker logs nautobot_secrets_providers_nautobot_1 -f`. You can find the name of all running containers via `docker ps`. - -If you want to view the logs specific to the worker container, simply use the name of that container instead. - -## To Rebuild or Not to Rebuild - -Most of the time, you will not need to rebuild your images. Simply running `invoke start` and `invoke stop` is enough to keep your environment going. - -However there are a couple of instances when you will want to. - -### Updating Environment Variables - -To add environment variables to your containers, thus allowing Nautobot to use them, you will update/add them in the `development/dev.env` file. However, doing so is considered updating the underlying container shell, instead of Django (which auto restarts itself on changes). - -To get new environment variables to take effect, you will need stop any running images, rebuild the images, then restart them. This can easily be done with 3 commands: - -```bash -➜ invoke stop -➜ invoke build -➜ invoke start -``` - -Once completed, the new/updated environment variables should now be live. - -### Installing Additional Python Packages - -If you want your app to leverage another available Nautobot app or another Python package, you can easily add them into your Docker environment. - -```bash -➜ poetry shell -➜ poetry add netutils -``` - -Once the dependencies are resolved, stop the existing containers, rebuild the Docker image, and then start all containers again. - -```bash -➜ invoke stop -➜ invoke build -➜ invoke start -``` - -### Installing Additional Nautobot Apps - -Let's say for example you want the new app you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps app. - -```bash -➜ poetry shell -➜ poetry add nautobot-chatops-app -``` - -Once you activate the virtual environment via Poetry, you then tell Poetry to install the new app. - -Before you continue, you'll need to update the file `development/nautobot_config.py` accordingly with the name of the new app under `PLUGINS` and any relevant settings as necessary for the app under `PLUGINS_CONFIG`. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier. - -```bash -➜ invoke stop -➜ invoke build -➜ invoke start -``` - -Once the containers are up and running, you should now see the new app installed in your Nautobot instance. - -You can even launch an `ngrok` service locally on your laptop, pointing to port 8080 (such as for chatops development), and it will point traffic directly to your Docker images. How cool! - -### Updating Python Version - -To update the Python version, you can update it within `tasks.py`. - -```python -namespace = Collection("nautobot_secrets_providers") -namespace.configure( - { - "nautobot_secrets_providers": { - ... - "python_ver": "3.7", - ... - } - } -) -``` - -Or set the `INVOKE_NAUTOBOT_SECRETS_PROVIDERS_PYTHON_VER` variable - -### Updating Nautobot Version - -To update the Python version, you can update it within `tasks.py`. - -```python -namespace = Collection("nautobot_secrets_providers") -namespace.configure( - { - "nautobot_secrets_providers": { - ... - "nautobot_ver": "1.0.2", - ... - } - } -) -``` - -Or set the `INVOKE_NAUTOBOT_SECRETS_PROVIDERS_NAUTOBOT_VER` variable - -## Local Development Environment - -Refer back to the [README](./README.md) for developing locally. - -## Other Miscellaneous Commands To Know - -### Python Shell - -To drop into a Django shell for Nautobot (in the Docker container) run: - -```bash -➜ invoke nbshell -``` - -This is the same as running: - -```bash -➜ invoke cli -➜ nautobot-server nbshell -``` - -### Tests - -To run tests against your code, you can run all of the tests that TravisCI runs against any new PR with: - -```bash -➜ invoke tests -``` - -To run an individual test, you can run any or all of the following: - -```bash -➜ invoke unittest -➜ invoke bandit -➜ invoke black -➜ invoke flake8 -➜ invoke pydocstyle -➜ invoke pylint -``` diff --git a/README.md b/README.md index 949eac2..874e03f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # Nautobot's Secrets Providers App

- -
@@ -11,9 +9,9 @@ An App for Nautobot.

-Nautobot Secrets Providers is a app for [Nautobot](https://github.com/nautobot/nautobot) 1.4.0 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.4.0 added support for integrating with retrieving secrets from various secrets providers. +Nautobot Secrets Providers is an app for [Nautobot](https://github.com/nautobot/nautobot) 1.2.1 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.2.0 added support for integrating with retrieving secrets from various secrets providers. -This app publishes secrets providers that are not included in the within the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. +This app publishes secrets providers that are not included in the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. ## Supported Secrets Backends @@ -52,192 +50,7 @@ This app supports the following popular secrets backends: ## Installation -> Nautobot Secrets Providers is compatible with Nautobot 1.4.0 and higher. Support for Thycotic Secret Server requires Python 3.7 or later. - -The package is available as a Python package in PyPI and can be installed with `pip`: - -```no-highlight -pip install nautobot-secrets-providers -``` - -You may quickly install all of the dependent libraries using the following command, however, this is *not recommended for production deployments* as it will install extras that you may not need: - -```no-highlight -pip install nautobot-secrets-providers[all] -``` - -### Dependencies - -For this app to operate you must install at least one of the dependent libraries required by the secrets providers. - -**You must install the dependencies for at least one of the supported secrets providers or a `RuntimeError` will be raised.** - -#### AWS - -AWS Secrets Manager and Systems Manager Parameter Store are supported. Both providers require the `boto3` library. This can be easily installed along with the app using the following command: - -```no-highlight -pip install nautobot-secrets-providers[aws] -``` - -#### HashiCorp Vault - -The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the app using the following command: - -```no-highlight -pip install nautobot-secrets-providers[hashicorp] -``` - -#### Delinea/Thycotic Secret Server - -The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` library. This can easily be installed along with the app using the following command: - -```no-highlight -pip install nautobot-secrets-providers[thycotic] -``` - -### Enabling Secrets Providers - -To ensure Nautobot Secrets Providers is automatically re-installed during future upgrades, create a file named `local_requirements.txt` (if not already existing) in the Nautobot root directory (alongside `requirements.txt`) and list the `secrets` package: - -```no-highlight -echo nautobot-secrets-providers >> local_requirements.txt -``` - -Once installed, the app needs to be enabled in your `nautobot_config.py`: - -```python -# In your nautobot_config.py -PLUGINS = ["nautobot_secrets_providers"] - -# PLUGINS_CONFIG = { -# "nautobot_secrets_providers": { -# See below for how to configure Nautobot for each secrets provider! -# } -# } -``` - -## Usage - -Before you proceed, you must have **at least one** of the dependent libaries installed as detailed above. - -Please do not enable this app until you are able to install the dependencies, as it will block Nautobot from starting. - -### AWS - -#### Authentication - -No configuration is needed within Nautobot for this provider to operate. Instead you must provide [AWS credentials in one of the methods supported by the `boto3` library](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials). - -Boto3 credentials can be configured in multiple ways (eight as of this writing) that are mirrored here: - -1. Passing credentials as parameters in the `boto.client()` method -2. Passing credentials as parameters when creating a Session object -3. Environment variables -4. Shared credential file (`~/.aws/credentials`) -5. AWS config file (`~/.aws/config`) -6. Assume Role provider -7. Boto2 config file (`/etc/boto.cfg` and `~/.boto`) -8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured. - -**The AWS providers only support methods 3-8. Methods 1 and 2 ARE NOT SUPPORTED at this time.** - -We highly recommend you defer to using environment variables for your deployment as specified in the credentials documentation linked above. The values specified in the linked documentation should be [set within your `~.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) (or similar profile) on your system. - -#### Configuration - -This is an example based on our recommended deployment pattern in the section above (item 3) that is using [environment variables](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#environment-variables). You will need to set these in the environment prior to starting Nautobot: - -```no-highlight -export AWS_ACCESS_KEY_ID=foo # The access key for your AWS account. -export AWS_SECRET_ACCESS_KEY=bar # The secret key for your AWS account. -``` - -Please refer to the [Nautobot documentation on updating your `.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) for how to do this for production Nautobot deployments. - -### HashiCorp Vault - -#### Configuration - -You must provide a mapping in `PLUGINS_CONFIG` within your `nautobot_config.py`, for example: - -```python -PLUGINS_CONFIG = { - "nautobot_secrets_providers": { - "hashicorp_vault": { - "url": "http://localhost:8200", - "auth_method": "token", - "token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN"), - } - }, -} -``` - -- `url` - (required) The URL to the HashiCorp Vault instance (e.g. `http://localhost:8200`). -- `auth_method` - (optional / defaults to "token") The method used to authenticate against the HashiCorp Vault instance. Either `"approle"`, `"aws"`, `"kubernetes"` or `"token"`. For information on using AWS authentication with vault see the [authentication](#authentication) section above. -- `ca_cert` - (optional) Path to a PEM formatted CA certificate to use when verifying the Vault connection. Can alternatively be set to `False` to ignore SSL verification (not recommended) or `True` to use the system certificates. -- `default_mount_point` - (optional / defaults to "secret") The default mount point of the K/V Version 2 secrets engine within Hashicorp Vault. -- `kv_version` - (optional / defaults to "v2") The version of the KV engine to use, can be `v1` or `v2` -- `k8s_token_path` - (optional) Path to the kubernetes service account token file. Defaults to "/var/run/secrets/kubernetes.io/serviceaccount/token". -- `token` - (optional) Required when `"auth_method": "token"` or `auth_method` is not supplied. The token for authenticating the client with the HashiCorp Vault instance. As with other sensitive service credentials, we recommend that you provide the token value as an environment variable and retrieve it with `{"token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN")}` rather than hard-coding it in your `nautobot_config.py`. -- `role_name` - (optional) Required when `"auth_method": "kubernetes"`, optional when `"auth_method": "aws"`. The Vault Kubernetes role or Vault AWS role to assume which the pod's service account has access to. -- `role_id` - (optional) Required when `"auth_method": "approle"`. As with other sensitive service credentials, we recommend that you provide the role_id value as an environment variable and retrieve it with `{"role_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_ROLE_ID")}` rather than hard-coding it in your `nautobot_config.py`. -- `secret_id` - (optional) Required when `"auth_method": "approle"`.As with other sensitive service credentials, we recommend that you provide the secret_id value as an environment variable and retrieve it with `{"secret_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_SECRET_ID")}` rather than hard-coding it in your `nautobot_config.py`. -- `login_kwargs` - (optional) Additional optional parameters to pass to the login method for [`approle`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.AppRole.login), [`aws`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Aws.iam_login) and [`kubernetes`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Kubernetes.login) authentication methods. -- `namespace` - (optional) Namespace to use for the [`X-Vault-Namespace` header](https://github.com/hvac/hvac/blob/main/hvac/adapters.py#L287) on all hvac client requests. Required when the [`Namespaces`](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#usage) feature is enabled in Vault Enterprise. - -### Delinea/Thycotic Secret Server (TSS) - -The Delinea/Thycotic Secret Server app includes two providers: - -- **`Thycotic Secret Server by ID`** - - This provider uses the `Secret ID` to specifiy the secret that is selected. The `Secret ID` is displayed in the browser's URL field if you `Edit` the data in Thycotic Secret Server. - - - Example: - - The url is: _https://pw.example.local/SecretServer/app/#/secret/**1234**/general_ - - In this example the value for `Secret ID` is **1234**. - -- **`Thycotic Secret Server by Path`** - - This provider allows to select the secret by folder-path and secret-name. The path delimiter is a '\\'. - - The `Secret path` is displayed as page header when `Edit` a secret. - - - Example: - - The header is: **NET-Automation > Nautobot > My-Secret** - - In this example the value for `Secret path` is **`\NET-Automation\Nautobot\My-Secret`**. - -#### Configuration - -```python -PLUGINS_CONFIG = { - "nautobot_secrets_providers": { - "thycotic": { # https://github.com/thycotic/python-tss-sdk - "base_url": os.getenv("SECRET_SERVER_BASE_URL", None), - "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", None), - "cloud_based": is_truthy(os.getenv("SECRET_SERVER_IS_CLOUD_BASED", "False")), - "domain": os.getenv("SECRET_SERVER_DOMAIN", None), - "password": os.getenv("SECRET_SERVER_PASSWORD", None), - "tenant": os.getenv("SECRET_SERVER_TENANT", None), - "token": os.getenv("SECRET_SERVER_TOKEN", None), - "username": os.getenv("SECRET_SERVER_USERNAME", None), - }, - } -} -``` -- `base_url` - (required) The Secret Server base_url. _e.g.'https://pw.example.local/SecretServer'_ -- `ca_bundle_path` - (optional) When using self-signed certificates this variable must be set to a file containing the trusted certificates (in .pem format). _e.g. '/etc/ssl/certs/ca-bundle.trust.crt'_. -- `cloud_based` - (optional) Set to "True" if Secret Server Cloud should be used. (Default: "False"). -- `domain` - (optional) Required for 'Domain Authorization' -- `password` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. -- `tenant` - (optional) Required for 'Domain Authorization'. -- `token` - (optional) Required for 'Access Token Authorization'. -- `username` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. +See the [installation documentation](https://docs.nautobot.com/projects/secrets-providers/en/latest/admin/install/) for detailed instructions on installing the Nautobot Secrets Providers app. ## Contributing @@ -252,353 +65,7 @@ The project is following Network to Code software development guidelines and is ### Development Environment -The development environment can be used in 2 ways. First, with a local poetry environment if you wish to develop outside of Docker with the caveat of using external services provided by Docker for PostgreSQL and Redis. Second, all services are spun up using Docker and a local mount so you can develop locally, but Nautobot is spun up within the Docker container. - -Below is a quick start guide if you're already familiar with the development environment provided, but if you're not familiar, please read the [Getting Started Guide](GETTING_STARTED.md). - -#### Invoke - -The [PyInvoke](http://www.pyinvoke.org/) library is used to provide some helper commands based on the environment. There are a few configuration parameters which can be passed to PyInvoke to override the default configuration: - -* `nautobot_ver`: the version of Nautobot to use as a base for any built docker containers (default: 1.4.10) -* `project_name`: the default docker compose project name (default: nautobot_secrets_providers) -* `python_ver`: the version of Python to use as a base for any built docker containers (default: 3.8) -* `local`: a boolean flag indicating if invoke tasks should be run on the host or inside the docker containers (default: False, commands will be run in docker containers) -* `compose_dir`: the full path to a directory containing the project compose files -* `compose_files`: a list of compose files applied in order (see [Multiple Compose files](https://docs.docker.com/compose/extends/#multiple-compose-files) for more information) - -Using **PyInvoke** these configuration options can be overridden using [several methods](http://docs.pyinvoke.org/en/stable/concepts/configuration.html). Perhaps the simplest is simply setting an environment variable `INVOKE_NAUTOBOT_SECRETS_PROVIDERS_VARIABLE_NAME` where `VARIABLE_NAME` is the variable you are trying to override. The only exception is `compose_files`, because it is a list it must be overridden in a yaml file. There is an example `invoke.yml` (`invoke.example.yml`) in this directory which can be used as a starting point. - -#### Local Poetry Development Environment - -1. Copy `development/creds.example.env` to `development/creds.env` (This file will be ignored by Git and Docker) -2. Uncomment the `POSTGRES_HOST`, `REDIS_HOST`, and `NAUTOBOT_ROOT` variables in `development/creds.env` -3. Create an `invoke.yml` file with the following contents at the root of the repo (you can also `cp invoke.example.yml invoke.yml` and edit as necessary): - -```yaml ---- -nautobot_secrets_providers: - local: true - compose_files: - - "docker-compose.requirements.yml" -``` - -3. Run the following commands: - -```shell -poetry shell -poetry install --extras nautobot -export $(cat development/dev.env | xargs) -export $(cat development/creds.env | xargs) -invoke start && sleep 5 -nautobot-server migrate -``` - -> If you want to develop on the latest develop branch of Nautobot, run the following command: `poetry add --optional git+https://github.com/nautobot/nautobot@develop`. After the `@` symbol must match either a branch or a tag. - -4. You can now run nautobot-server commands as you would from the [Nautobot documentation](https://nautobot.readthedocs.io/en/latest/) for example to start the development server: - -```shell -nautobot-server runserver 0.0.0.0:8080 --insecure -``` - -Nautobot server can now be accessed at [http://localhost:8080](http://localhost:8080). - -It is typically recommended to launch the Nautobot **runserver** command in a separate shell so you can keep developing and manage the webserver separately. - -#### Docker Development Environment - -This project is managed by [Python Poetry](https://python-poetry.org/) and has a few requirements to setup your development environment: - -1. Install Poetry, see the [Poetry Documentation](https://python-poetry.org/docs/#installation) for your operating system. -2. Install Docker, see the [Docker documentation](https://docs.docker.com/get-docker/) for your operating system. - -Once you have Poetry and Docker installed you can run the following commands to install all other development dependencies in an isolated python virtual environment: - -```shell -poetry shell -poetry install -invoke start -``` - -Nautobot server can now be accessed at [http://localhost:8080](http://localhost:8080). - -To either stop or destroy the development environment use the following options. - -- **invoke stop** - Stop the containers, but keep all underlying systems intact -- **invoke destroy** - Stop and remove all containers, volumes, etc. (This results in data loss due to the volume being deleted) - -### CLI Helper Commands - -The project is coming with a CLI helper based on [invoke](http://www.pyinvoke.org/) to help setup the development environment. The commands are listed below in 3 categories `dev environment`, `utility` and `testing`. - -Each command can be executed with `invoke `. Environment variables `INVOKE_NAUTOBOT_SECRETS_PROVIDERS_PYTHON_VER` and `INVOKE_NAUTOBOT_SECRETS_PROVIDERS_NAUTOBOT_VER` may be specified to override the default versions. Each command also has its own help `invoke --help` - -#### Docker dev environment - -```no-highlight - build Build all docker images. - debug Start Nautobot and its dependencies in debug mode. - destroy Destroy all containers and volumes. - restart Restart Nautobot and its dependencies. - start Start Nautobot and its dependencies in detached mode. - stop Stop Nautobot and its dependencies. -``` - -#### Utility - -```no-highlight - cli Launch a bash shell inside the running Nautobot container. - create-user Create a new user in django (default: admin), will prompt for password. - makemigrations Run Make Migration in Django. - nbshell Launch a nbshell session. -``` - -#### Testing - -```no-highlight - bandit Run bandit to validate basic static code security analysis. - black Run black to check that Python files adhere to its style standards. - flake8 This will run flake8 for the specified name and Python version. - pydocstyle Run pydocstyle to validate docstring formatting adheres to NTC defined standards. - pylint Run pylint code analysis. - tests Run all tests for this app. - unittest Run Django unit tests for the app. -``` - -### Project Documentation - -Project documentation is generated by [mkdocs](https://www.mkdocs.org/) from the documentation located in the docs folder. You can configure [readthedocs.io](https://readthedocs.io/) to point at this folder in your repo. For development purposes a `docker-compose.docs.yml` is also included. A container hosting the docs will be started using the invoke commands on [http://localhost:8001](http://localhost:8001), as changes are saved the docs will be automatically reloaded. - -### Developing Against Secrets Backends - -#### AWS Secrets Manager - -This assumes you are logged into the AWS Console. - -- Navigate to AWS Console -- Navigate to AWS Secrets Manager -- Click "Store a new secret" - - Select “Other type of secrets” - - Use Secret key/value - - Enter `hello=world` - - Use "DefaultEncryptionKey" for now - - Click "Next" - - Under "Secret name" fill out `hello` - - Click "Next" - - Under "Configure automatic rotation" - - Leave it as "Disable automatic rotation" - - On "Store a new secret" - - Copy the sample code (see below) - - Click "Store" -- END - -##### Install the AWS CLI - -Next, install the [AWS CLI](https://aws.amazon.com/cli/). - -On MacOS, this can be done using `brew install awscli`: - -``` -brew install awscli -``` - -On Linux, you will need to run a `curl` command (This assumes x86. Please see the docs for [AWS CLI on -Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html) for ARM and other options): - -``` -curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" -unzip awscliv2.zip -sudo ./aws/install -``` - -##### Configure the AWS CLI - -After installing the AWS CLI, you will need to configure it for authentication. - -You may use an existing AWS access key or create a new one. For these instructions we cover the need to create a new access key that can be used for this. - -- Navigate to AWS Console -- Click your username - - Click "My security credentials" - - Click "create access key" -- Save your "Access key ID" and "Secret access key" for use when configuring the AWS CLI - -Now configure the CLI: - -- Run `aws configure` -- Enter your credentials from above -- Choose your region -- Use output format: `json` - -Example: - -```no-highlight -$ aws configure -AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE -AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -Default region name [None]: us-east-2 -Default output format [None]: json -``` - -Now you are ready to use the sample code to retrieve your secret from AWS Secrets Manager! - -##### Sample Code - -Make sure that the `boto3` client is installed: - -```no-highlight -poetry install --extras aws -``` - -Next, save this as `aws_secrets.py`: - -```python -# Use this code snippet in your app. -# If you need more information about configurations or implementing the sample code, visit the AWS docs: -# https://aws.amazon.com/developers/getting-started/python/ - -import boto3 -import base64 -from botocore.exceptions import ClientError - - -def get_secret(): - - secret_name = "hello" - region_name = "us-east-2" - - # Create a Secrets Manager client - session = boto3.session.Session() - client = session.client( - service_name='secretsmanager', - region_name=region_name - ) - - # In this sample we only handle the specific exceptions for the 'GetSecretValue' API. - # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html - # We rethrow the exception by default. - - try: - get_secret_value_response = client.get_secret_value( - SecretId=secret_name - ) - except ClientError as e: - if e.response['Error']['Code'] == 'DecryptionFailureException': - # Secrets Manager can't decrypt the protected secret text using the provided KMS key. - # Deal with the exception here, and/or rethrow at your discretion. - raise e - elif e.response['Error']['Code'] == 'InternalServiceErrorException': - # An error occurred on the server side. - # Deal with the exception here, and/or rethrow at your discretion. - raise e - elif e.response['Error']['Code'] == 'InvalidParameterException': - # You provided an invalid value for a parameter. - # Deal with the exception here, and/or rethrow at your discretion. - raise e - elif e.response['Error']['Code'] == 'InvalidRequestException': - # You provided a parameter value that is not valid for the current state of the resource. - # Deal with the exception here, and/or rethrow at your discretion. - raise e - elif e.response['Error']['Code'] == 'ResourceNotFoundException': - # We can't find the resource that you asked for. - # Deal with the exception here, and/or rethrow at your discretion. - raise e - else: - # Decrypts secret using the associated KMS CMK. - # Depending on whether the secret is a string or binary, one of these fields will be populated. - if 'SecretString' in get_secret_value_response: - secret = get_secret_value_response['SecretString'] - else: - decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary']) - - # Your code goes here. - -# ^ Above was generated by AWS. - -# This was added by us so you can run this as a script: -if __name__ == "__main__": - secret = get_secret() - print(f"Secret = {secret}") -``` - -Run it with `python aws_secrets.py`: - -``` -$ python aws_secrets.py -Secret = {"hello":"world"}. -``` - -Note that this blob is JSON and will also need to be decoded if you want to extract the value. - -#### HashiCorp Vault - -Make sure that the `hvac` client is installed: - -```no-highlight -poetry install --extras hashicorp -``` - -##### Start Services with Docker - -```no-highlight -invoke start -``` - -##### Set an alias to work with `vault` - -This will allow you to easily run the CLI command from within the container: - -```no-highlight -alias vault="docker exec -it nautobot_secrets_providers_vault_1 vault" -``` - -Interact with the Vault vi CLI (via `docker exec` into the container from localhost): - -```no-highlight -$ vault status -Key Value ---- ----- -Seal Type shamir -Initialized true -Sealed false -Total Shares 1 -Threshold 1 -Version 1.8.2 -Storage Type inmem -Cluster Name vault-cluster-35c5d319 -Cluster ID 2611f99c-a6de-a883-1fcc-bfffdc0217bc -HA Enabled false -``` - -##### Using the Python `hvac` Library - -This establishes a client, creates a basic key/value secret (`hello=world`) at the path `hello`, and then retrieves the data from the `hello` key at the secret path `hello`. - -> This is equivalent to the command `vault kv get -field hello secret/hello`. - -```python -In [1]: import hvac - -In [2]: client = hvac.Client(url="http://localhost:8200", token="nautobot") - -In [3]: client.secrets.kv.create_or_update_secret(path="hello", secret=dict(hello="world")) -Out[3]: -{'request_id': 'c4709868-c08f-4cb1-ab8c-605c58b82f3f', - 'lease_id': '', - 'renewable': False, - 'lease_duration': 0, - 'data': {'created_time': '2021-09-16T23:21:07.5564132Z', - 'deletion_time': '', - 'destroyed': False, - 'version': 2}, - 'wrap_info': None, - 'warnings': None, - 'auth': None} - -In [4]: client.secrets.kv.read_secret(path="hello")["data"]["data"]["hello"] -Out[4]: 'world' -``` +For information on setting up a local development environment, see the [documentation](https://docs.nautobot.com/projects/secrets-providers/en/latest/dev/dev_environment/). ## Questions diff --git a/changes/8.housekeeping b/changes/8.housekeeping new file mode 100644 index 0000000..653c54a --- /dev/null +++ b/changes/8.housekeeping @@ -0,0 +1 @@ +Re-baked from the latest template. diff --git a/development/Dockerfile b/development/Dockerfile index 7d3c41e..c30ef27 100644 --- a/development/Dockerfile +++ b/development/Dockerfile @@ -28,7 +28,7 @@ ENV INVOKE_NAUTOBOT_SECRETS_PROVIDERS_LOCAL=true # Since this is only used for development and we don't ship this container, pinning Poetry back is not expressly necessary # We also don't need virtual environments in container RUN which poetry || curl -sSL https://install.python-poetry.org | python3 - && \ - poetry config virtualenvs.create false + poetry config virtualenvs.create false # !!! USE CAUTION WHEN MODIFYING LINES ABOVE # ------------------------------------------------------------------------------------- diff --git a/development/app_config_schema.py b/development/app_config_schema.py new file mode 100644 index 0000000..4700995 --- /dev/null +++ b/development/app_config_schema.py @@ -0,0 +1,64 @@ +"""App Config Schema Generator and Validator.""" +import json +from importlib import import_module +from os import getenv +from pathlib import Path +from urllib.parse import urlparse + +import jsonschema +import toml +from django.conf import settings +from to_json_schema.to_json_schema import SchemaBuilder + + +def _enrich_object_schema(schema, defaults, required): + schema["additionalProperties"] = False + for key, value in schema["properties"].items(): + if required and key in required: + value["required"] = True + default_value = defaults and defaults.get(key, None) + if value["type"] == "object" and "properties" in value: + _enrich_object_schema(value, default_value, None) + elif default_value is not None: + value["default"] = default_value + + +def _main(): + pyproject = toml.loads(Path("pyproject.toml").read_text()) + url = urlparse(pyproject["tool"]["poetry"]["repository"]) + _, owner, repository = url.path.split("/") + package_name = pyproject["tool"]["poetry"]["packages"][0]["include"] + app_config = settings.PLUGINS_CONFIG[package_name] # type: ignore + schema_path = Path(package_name) / "app-config-schema.json" + command = getenv("APP_CONFIG_SCHEMA_COMMAND", "") + if command == "generate": + schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": f"https://raw.githubusercontent.com/{owner}/{repository}/develop/{package_name}/app-config-schema.json", + "$comment": "TBD: Update $id, replace `develop` with the future release tag", + **SchemaBuilder().to_json_schema(app_config), # type: ignore + } + app_config = import_module(package_name).config + _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings) + schema_path.write_text(json.dumps(schema, indent=4) + "\n") + print(f"\n==================\nGenerated schema:\n\n{schema_path}\n") + print( + "WARNING: Review and edit the generated file before committing.\n" + "\n" + "Its content is inferred from:\n" + "\n" + "- The current configuration in `PLUGINS_CONFIG`\n" + "- `NautobotAppConfig.default_settings`\n" + "- `NautobotAppConfig.required_settings`" + ) + elif command == "validate": + schema = json.loads(schema_path.read_text()) + jsonschema.validate(app_config, schema) + print( + f"\n==================\nValidated configuration using the schema:\n{schema_path}\nConfiguration is valid." + ) + else: + raise RuntimeError(f"Unknown command: {command}") + + +_main() diff --git a/development/nautobot_config.py b/development/nautobot_config.py index 4b988eb..d61ed30 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -92,11 +92,11 @@ "disable_existing_loggers": False, "formatters": { "normal": { - "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)s :\n %(message)s", + "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)s : %(message)s", "datefmt": "%H:%M:%S", }, "verbose": { - "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)-20s %(filename)-15s %(funcName)30s() :\n %(message)s", + "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)-20s %(filename)-15s %(funcName)30s() : %(message)s", "datefmt": "%H:%M:%S", }, }, diff --git a/development/towncrier_template.j2 b/development/towncrier_template.j2 index d2ec61b..b0f6e12 100644 --- a/development/towncrier_template.j2 +++ b/development/towncrier_template.j2 @@ -1,6 +1,6 @@ {% if render_title %} -## v{{ versiondata.version }} ({{ versiondata.date }}) +## [v{{ versiondata.version }} ({{ versiondata.date }})]({{ cookiecutter.repo_url }}/releases/tag/v{{ versiondata.version}}) {% endif %} {% for section, _ in sections.items() %} diff --git a/docs/admin/compatibility_matrix.md b/docs/admin/compatibility_matrix.md index 7303164..c118ab1 100644 --- a/docs/admin/compatibility_matrix.md +++ b/docs/admin/compatibility_matrix.md @@ -1,9 +1,7 @@ # Compatibility Matrix -!!! warning "Developer Note - Remove Me!" - Explain how the release models of the app and of Nautobot work together, how releases are supported, how features and older releases are deprecated etc. - | Nautobot's Secrets Providers App Version | Nautobot First Support Version | Nautobot Last Support Version | -| ------------- | -------------------- | ------------- | -| 1.0.X | 1.4.0 | 1.99.99 | -| 2.0.X | 2.0.0 | 2.99.99 | +| ---------------------------------------- | ------------------------------ | ----------------------------- | +| 1.0.0 - 1.3.0 | 1.2.1 | 1.2.99 | +| 1.4.X | 1.4.0 | 1.99.99 | +| 2.0.X | 2.0.0 | 2.99.99 | diff --git a/docs/admin/install.md b/docs/admin/install.md new file mode 100644 index 0000000..637ea26 --- /dev/null +++ b/docs/admin/install.md @@ -0,0 +1,212 @@ +# Installing the App in Nautobot + +Here you will find detailed instructions on how to **install** and **configure** the App within your Nautobot environment. + +## Prerequisites + +- This app is compatible with Nautobot 1.2.1 and higher. +- Support for Thycotic Secret Server requires Python 3.7 or later. +- Databases supported: PostgreSQL, MySQL + +!!! note + Please check the [dedicated page](compatibility_matrix.md) for a full compatibility matrix and the deprecation policy. + +Before you proceed, you must have **at least one** of the dependent libaries installed as detailed below. + +Please do not enable this app until you are able to install the dependencies, as it will block Nautobot from starting. + +### Dependencies + +For this app to operate you must install at least one of the dependent libraries required by the secrets providers. + +**You must install the dependencies for at least one of the supported secrets providers or a `RuntimeError` will be raised.** + +#### AWS + +AWS Secrets Manager and Systems Manager Parameter Store are supported. Both providers require the `boto3` library. This can be easily installed along with the app using the following command: + +```no-highlight +pip install nautobot-secrets-providers[aws] +``` + +#### HashiCorp Vault + +The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the app using the following command: + +```no-highlight +pip install nautobot-secrets-providers[hashicorp] +``` + +#### Delinea/Thycotic Secret Server + +The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` library. This can easily be installed along with the app using the following command: + +```no-highlight +pip install nautobot-secrets-providers[thycotic] +``` + +### Access Requirements + +There are no special access requirements to install the app. + +## Install Guide + +!!! note + Apps can be installed from the [Python Package Index](https://pypi.org/) or locally. See the [Nautobot documentation](https://docs.nautobot.com/projects/core/en/stable/user-guide/administration/installation/app-install/) for more details. The pip package name for this app is [`nautobot-secrets-providers`](https://pypi.org/project/nautobot-secrets-providers/). + +The app is available as a Python package via PyPI and can be installed with `pip`: + +```shell +pip install nautobot-secrets-providers +``` + +To ensure Nautobot's Secrets Providers App is automatically re-installed during future upgrades, create a file named `local_requirements.txt` (if not already existing) in the Nautobot root directory (alongside `requirements.txt`) and list the `nautobot-secrets-providers` package: + +```shell +echo nautobot-secrets-providers >> local_requirements.txt +``` + +Once installed, the app needs to be enabled in your Nautobot configuration. The following block of code below shows the additional configuration required to be added to your `nautobot_config.py` file: + +- Append `"nautobot_secrets_providers"` to the `PLUGINS` list. +- Append the `"nautobot_secrets_providers"` dictionary to the `PLUGINS_CONFIG` dictionary and override any defaults. + +```python +# In your nautobot_config.py +PLUGINS = ["nautobot_secrets_providers"] + +# PLUGINS_CONFIG = { +# "nautobot_secrets_providers": { +# ADD YOUR SETTINGS HERE +# } +# } +``` + +Once the Nautobot configuration is updated, run the Post Upgrade command (`nautobot-server post_upgrade`) to run migrations and clear any cache: + +```shell +nautobot-server post_upgrade +``` + +Then restart (if necessary) the Nautobot services which may include: + +- Nautobot +- Nautobot Workers +- Nautobot Scheduler + +```shell +sudo systemctl restart nautobot nautobot-worker nautobot-scheduler +``` + +## App Configuration + +### AWS + +#### Authentication + +No configuration is needed within Nautobot for this provider to operate. Instead you must provide [AWS credentials in one of the methods supported by the `boto3` library](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials). + +Boto3 credentials can be configured in multiple ways (eight as of this writing) that are mirrored here: + +1. Passing credentials as parameters in the `boto.client()` method +2. Passing credentials as parameters when creating a Session object +3. Environment variables +4. Shared credential file (`~/.aws/credentials`) +5. AWS config file (`~/.aws/config`) +6. Assume Role provider +7. Boto2 config file (`/etc/boto.cfg` and `~/.boto`) +8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured. + +**The AWS providers only support methods 3-8. Methods 1 and 2 ARE NOT SUPPORTED at this time.** + +We highly recommend you defer to using environment variables for your deployment as specified in the credentials documentation linked above. The values specified in the linked documentation should be [set within your `~.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) (or similar profile) on your system. + +#### Configuration + +This is an example based on our recommended deployment pattern in the section above (item 3) that is using [environment variables](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#environment-variables). You will need to set these in the environment prior to starting Nautobot: + +```no-highlight +export AWS_ACCESS_KEY_ID=foo # The access key for your AWS account. +export AWS_SECRET_ACCESS_KEY=bar # The secret key for your AWS account. +``` + +Please refer to the [Nautobot documentation on updating your `.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) for how to do this for production Nautobot deployments. + +### HashiCorp Vault + +#### Configuration + +You must provide a mapping in `PLUGINS_CONFIG` within your `nautobot_config.py`, for example: + +```python +PLUGINS_CONFIG = { + "nautobot_secrets_providers": { + "hashicorp_vault": { + "url": "http://localhost:8200", + "auth_method": "token", + "token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN"), + } + }, +} +``` + +- `url` - (required) The URL to the HashiCorp Vault instance (e.g. `http://localhost:8200`). +- `auth_method` - (optional / defaults to "token") The method used to authenticate against the HashiCorp Vault instance. Either `"approle"`, `"aws"`, `"kubernetes"` or `"token"`. For information on using AWS authentication with vault see the [authentication](#authentication) section above. +- `ca_cert` - (optional) Path to a PEM formatted CA certificate to use when verifying the Vault connection. Can alternatively be set to `False` to ignore SSL verification (not recommended) or `True` to use the system certificates. +- `default_mount_point` - (optional / defaults to "secret") The default mount point of the K/V Version 2 secrets engine within Hashicorp Vault. +- `kv_version` - (optional / defaults to "v2") The version of the KV engine to use, can be `v1` or `v2` +- `k8s_token_path` - (optional) Path to the kubernetes service account token file. Defaults to "/var/run/secrets/kubernetes.io/serviceaccount/token". +- `token` - (optional) Required when `"auth_method": "token"` or `auth_method` is not supplied. The token for authenticating the client with the HashiCorp Vault instance. As with other sensitive service credentials, we recommend that you provide the token value as an environment variable and retrieve it with `{"token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN")}` rather than hard-coding it in your `nautobot_config.py`. +- `role_name` - (optional) Required when `"auth_method": "kubernetes"`, optional when `"auth_method": "aws"`. The Vault Kubernetes role or Vault AWS role to assume which the pod's service account has access to. +- `role_id` - (optional) Required when `"auth_method": "approle"`. As with other sensitive service credentials, we recommend that you provide the role_id value as an environment variable and retrieve it with `{"role_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_ROLE_ID")}` rather than hard-coding it in your `nautobot_config.py`. +- `secret_id` - (optional) Required when `"auth_method": "approle"`.As with other sensitive service credentials, we recommend that you provide the secret_id value as an environment variable and retrieve it with `{"secret_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_SECRET_ID")}` rather than hard-coding it in your `nautobot_config.py`. +- `login_kwargs` - (optional) Additional optional parameters to pass to the login method for [`approle`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.AppRole.login), [`aws`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Aws.iam_login) and [`kubernetes`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Kubernetes.login) authentication methods. +- `namespace` - (optional) Namespace to use for the [`X-Vault-Namespace` header](https://github.com/hvac/hvac/blob/main/hvac/adapters.py#L287) on all hvac client requests. Required when the [`Namespaces`](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#usage) feature is enabled in Vault Enterprise. + +### Delinea/Thycotic Secret Server (TSS) + +The Delinea/Thycotic Secret Server app includes two providers: + +#### Thycotic Secret Server by ID + +This provider uses the `Secret ID` to specifiy the secret that is selected. The `Secret ID` is displayed in the browser's URL field if you `Edit` the data in Thycotic Secret Server. + +!!! example + The url is: _https://pw.example.local/SecretServer/app/#/secret/**1234**/general_ + In this example the value for `Secret ID` is **1234**. + +#### Thycotic Secret Server by Path + +This provider allows to select the secret by folder-path and secret-name. The path delimiter is a '\\'. The `Secret path` is displayed as page header when `Edit` a secret. + +!!! example + The header is: **NET-Automation > Nautobot > My-Secret** + In this example the value for `Secret path` is **`\NET-Automation\Nautobot\My-Secret`**. + +#### Configuration + +```python +PLUGINS_CONFIG = { + "nautobot_secrets_providers": { + "thycotic": { # https://github.com/thycotic/python-tss-sdk + "base_url": os.getenv("SECRET_SERVER_BASE_URL", None), + "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", None), + "cloud_based": is_truthy(os.getenv("SECRET_SERVER_IS_CLOUD_BASED", "False")), + "domain": os.getenv("SECRET_SERVER_DOMAIN", None), + "password": os.getenv("SECRET_SERVER_PASSWORD", None), + "tenant": os.getenv("SECRET_SERVER_TENANT", None), + "token": os.getenv("SECRET_SERVER_TOKEN", None), + "username": os.getenv("SECRET_SERVER_USERNAME", None), + }, + } +} +``` + +- `base_url` - (required) The Secret Server base_url. _e.g.'https://pw.example.local/SecretServer'_ +- `ca_bundle_path` - (optional) When using self-signed certificates this variable must be set to a file containing the trusted certificates (in .pem format). _e.g. '/etc/ssl/certs/ca-bundle.trust.crt'_. +- `cloud_based` - (optional) Set to "True" if Secret Server Cloud should be used. (Default: "False"). +- `domain` - (optional) Required for 'Domain Authorization' +- `password` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. +- `tenant` - (optional) Required for 'Domain Authorization'. +- `token` - (optional) Required for 'Access Token Authorization'. +- `username` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md new file mode 100644 index 0000000..855cc71 --- /dev/null +++ b/docs/dev/contributing.md @@ -0,0 +1,72 @@ +# Contributing to the App + +The project is packaged with a light [development environment](dev_environment.md) based on `docker-compose` to help with the local development of the project and to run tests. + +The project is following Network to Code software development guidelines and is leveraging the following: + +- Python linting and formatting: `black`, `pylint`, `bandit`, `flake8`, and `ruff`. +- YAML linting is done with `yamllint`. +- Django unit test to ensure the app is working properly. + +Documentation is built using [mkdocs](https://www.mkdocs.org/). The [Docker based development environment](dev_environment.md#docker-development-environment) automatically starts a container hosting a live version of the documentation website on [http://localhost:8001](http://localhost:8001) that auto-refreshes when you make any changes to your local files. + +## Creating Changelog Fragments + +All pull requests to `next` or `develop` must include a changelog fragment file in the `./changes` directory. To create a fragment, use your GitHub issue number and fragment type as the filename. For example, `2362.added`. Valid fragment types are `added`, `changed`, `deprecated`, `fixed`, `removed`, and `security`. The change summary is added to the file in plain text. Change summaries should be complete sentences, starting with a capital letter and ending with a period, and be in past tense. Each line of the change fragment will generate a single change entry in the release notes. Use multiple lines in the same file if your change needs to generate multiple release notes in the same category. If the change needs to create multiple entries in separate categories, create multiple files. + +!!! example + + **Wrong** + ```plaintext title="changes/1234.fixed" + fix critical bug in documentation + ``` + + **Right** + ```plaintext title="changes/1234.fixed" + Fixed critical bug in documentation. + ``` + +!!! example "Multiple Entry Example" + + This will generate 2 entries in the `fixed` category and one entry in the `changed` category. + + ```plaintext title="changes/1234.fixed" + Fixed critical bug in documentation. + Fixed release notes generation. + ``` + + ```plaintext title="changes/1234.changed" + Changed release notes generation. + ``` + +## Branching Policy + +The branching policy includes the following tenets: + +- The `develop` branch is the branch of the next major and minor paired version planned. +- PRs intended to add new features should be sourced from the `develop` branch. +- PRs intended to fix issues in the Nautobot LTM compatible release should be sourced from the latest `ltm-` branch instead of `develop`. + +Nautobot's Secrets Providers App will observe semantic versioning, as of 1.0. This may result in a quick turnaround in minor versions to keep pace with an ever growing feature set. + +## Release Policy + +Nautobot's Secrets Providers App has currently no intended scheduled release schedule, and will release new features in minor versions. + +When a new release, from `develop` to `main`, is created the following should happen. + +- A release PR is created from `develop` with: + - Update the release notes in `docs/admin/release_notes/version_..md` file to reflect the changes. + - Change the version from `..-beta` to `..` in `pyproject.toml`. + - Set the PR to the `main` branch. +- Ensure the tests for the PR pass. +- Merge the PR. +- Create a new tag: + - The tag should be in the form of `v..`. + - The title should be in the form of `v..`. + - The description should be the changes that were added to the `version_..md` document. +- If merged into `main`, then push from `main` to `develop`, in order to retain the merge commit created when the PR was merged +- A post release PR is created with: + - Change the version from `..` to `..-beta` in both `pyproject.toml` and `nautobot.__init__.__version__`. + - Set the PR to the proper branch, `develop`. + - Once tests pass, merge. diff --git a/docs/dev/dev_environment.md b/docs/dev/dev_environment.md index 98b2b80..6dbec8c 100644 --- a/docs/dev/dev_environment.md +++ b/docs/dev/dev_environment.md @@ -29,21 +29,18 @@ Using **Invoke** these configuration options can be overridden using [several me This project is managed by [Python Poetry](https://python-poetry.org/) and has a few requirements to setup your development environment: -1. Install Poetry, see the [Poetry documentation](https://python-poetry.org/docs/#installation) for your operating system. +1. Install Poetry, see the [Poetry Documentation](https://python-poetry.org/docs/#installation) for your operating system. 2. Install Docker, see the [Docker documentation](https://docs.docker.com/get-docker/) for your operating system. -3. Install Docker-compose, see the [Docker-compose documentation](https://github.com/docker/compose) for your operation system. -Once you have Poetry and Docker installed you can run the following commands (in the root of the repository) to install all other development dependencies in an isolated Python virtual environment: +Once you have Poetry and Docker installed you can run the following commands to install all other development dependencies in an isolated python virtual environment: ```shell poetry shell poetry install -cp development/creds.example.env development/creds.env -invoke build invoke start ``` -The Nautobot server can now be accessed at [http://localhost:8080](http://localhost:8080) and the live documentation at [http://localhost:8001](http://localhost:8001). +Nautobot server can now be accessed at [http://localhost:8080](http://localhost:8080). To either stop or destroy the development environment use the following options. @@ -52,7 +49,9 @@ To either stop or destroy the development environment use the following options. ### Local Poetry Development Environment -- Create an `invoke.yml` file with the following contents at the root of the repo and edit as necessary +1. Copy `development/creds.example.env` to `development/creds.env` (This file will be ignored by Git and Docker) +2. Uncomment the `POSTGRES_HOST`, `REDIS_HOST`, and `NAUTOBOT_ROOT` variables in `development/creds.env` +3. Create an `invoke.yml` file with the following contents at the root of the repo (you can also `cp invoke.example.yml invoke.yml` and edit as necessary): ```yaml --- @@ -60,21 +59,20 @@ nautobot_secrets_providers: local: true ``` -Run the following commands: +3. Run the following commands: ```shell poetry shell poetry install --extras nautobot -export $(cat development/development.env | xargs) +export $(cat development/dev.env | xargs) export $(cat development/creds.env | xargs) invoke start && sleep 5 nautobot-server migrate ``` -!!! note - If you want to develop on the latest develop branch of Nautobot, run the following command: `poetry add --optional git+https://github.com/nautobot/nautobot@develop`. After the `@` symbol must match either a branch or a tag. +> If you want to develop on the latest develop branch of Nautobot, run the following command: `poetry add --optional git+https://github.com/nautobot/nautobot@develop`. After the `@` symbol must match either a branch or a tag. -You can now run `nautobot-server` commands as you would from the [Nautobot documentation](https://nautobot.readthedocs.io/en/latest/) for example to start the development server: +4. You can now run nautobot-server commands as you would from the [Nautobot documentation](https://nautobot.readthedocs.io/en/latest/) for example to start the development server: ```shell nautobot-server runserver 0.0.0.0:8080 --insecure @@ -132,6 +130,237 @@ Each command can be executed with `invoke `. All commands support the a unittest Run Django unit tests for the app. ``` +### Developing Against Secrets Backends + +#### AWS Secrets Manager + +This assumes you are logged into the AWS Console. + +- Navigate to AWS Console +- Navigate to AWS Secrets Manager +- Click "Store a new secret" + - Select “Other type of secrets” + - Use Secret key/value + - Enter `hello=world` + - Use "DefaultEncryptionKey" for now + - Click "Next" + - Under "Secret name" fill out `hello` + - Click "Next" + - Under "Configure automatic rotation" + - Leave it as "Disable automatic rotation" + - On "Store a new secret" + - Copy the sample code (see below) + - Click "Store" +- END + +##### Install the AWS CLI + +Next, install the [AWS CLI](https://aws.amazon.com/cli/). + +On MacOS, this can be done using `brew install awscli`: + +``` +brew install awscli +``` + +On Linux, you will need to run a `curl` command (This assumes x86. Please see the docs for [AWS CLI on +Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html) for ARM and other options): + +``` +curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" +unzip awscliv2.zip +sudo ./aws/install +``` + +##### Configure the AWS CLI + +After installing the AWS CLI, you will need to configure it for authentication. + +You may use an existing AWS access key or create a new one. For these instructions we cover the need to create a new access key that can be used for this. + +- Navigate to AWS Console +- Click your username + - Click "My security credentials" + - Click "create access key" +- Save your "Access key ID" and "Secret access key" for use when configuring the AWS CLI + +Now configure the CLI: + +- Run `aws configure` +- Enter your credentials from above +- Choose your region +- Use output format: `json` + +Example: + +```no-highlight +$ aws configure +AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE +AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +Default region name [None]: us-east-2 +Default output format [None]: json +``` + +Now you are ready to use the sample code to retrieve your secret from AWS Secrets Manager! + +##### Sample Code + +Make sure that the `boto3` client is installed: + +```no-highlight +poetry install --extras aws +``` + +Next, save this as `aws_secrets.py`: + +```python +# Use this code snippet in your app. +# If you need more information about configurations or implementing the sample code, visit the AWS docs: +# https://aws.amazon.com/developers/getting-started/python/ + +import boto3 +import base64 +from botocore.exceptions import ClientError + + +def get_secret(): + + secret_name = "hello" + region_name = "us-east-2" + + # Create a Secrets Manager client + session = boto3.session.Session() + client = session.client( + service_name='secretsmanager', + region_name=region_name + ) + + # In this sample we only handle the specific exceptions for the 'GetSecretValue' API. + # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html + # We rethrow the exception by default. + + try: + get_secret_value_response = client.get_secret_value( + SecretId=secret_name + ) + except ClientError as e: + if e.response['Error']['Code'] == 'DecryptionFailureException': + # Secrets Manager can't decrypt the protected secret text using the provided KMS key. + # Deal with the exception here, and/or rethrow at your discretion. + raise e + elif e.response['Error']['Code'] == 'InternalServiceErrorException': + # An error occurred on the server side. + # Deal with the exception here, and/or rethrow at your discretion. + raise e + elif e.response['Error']['Code'] == 'InvalidParameterException': + # You provided an invalid value for a parameter. + # Deal with the exception here, and/or rethrow at your discretion. + raise e + elif e.response['Error']['Code'] == 'InvalidRequestException': + # You provided a parameter value that is not valid for the current state of the resource. + # Deal with the exception here, and/or rethrow at your discretion. + raise e + elif e.response['Error']['Code'] == 'ResourceNotFoundException': + # We can't find the resource that you asked for. + # Deal with the exception here, and/or rethrow at your discretion. + raise e + else: + # Decrypts secret using the associated KMS CMK. + # Depending on whether the secret is a string or binary, one of these fields will be populated. + if 'SecretString' in get_secret_value_response: + secret = get_secret_value_response['SecretString'] + else: + decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary']) + + # Your code goes here. + +# ^ Above was generated by AWS. + +# This was added by us so you can run this as a script: +if __name__ == "__main__": + secret = get_secret() + print(f"Secret = {secret}") +``` + +Run it with `python aws_secrets.py`: + +``` +$ python aws_secrets.py +Secret = {"hello":"world"}. +``` + +Note that this blob is JSON and will also need to be decoded if you want to extract the value. + +#### HashiCorp Vault + +Make sure that the `hvac` client is installed: + +```no-highlight +poetry install --extras hashicorp +``` + +##### Start Services with Docker + +```no-highlight +invoke start +``` + +##### Set an alias to work with `vault` + +This will allow you to easily run the CLI command from within the container: + +```no-highlight +alias vault="docker exec -it nautobot_secrets_providers_vault_1 vault" +``` + +Interact with the Vault vi CLI (via `docker exec` into the container from localhost): + +```no-highlight +$ vault status +Key Value +--- ----- +Seal Type shamir +Initialized true +Sealed false +Total Shares 1 +Threshold 1 +Version 1.8.2 +Storage Type inmem +Cluster Name vault-cluster-35c5d319 +Cluster ID 2611f99c-a6de-a883-1fcc-bfffdc0217bc +HA Enabled false +``` + +##### Using the Python `hvac` Library + +This establishes a client, creates a basic key/value secret (`hello=world`) at the path `hello`, and then retrieves the data from the `hello` key at the secret path `hello`. + +> This is equivalent to the command `vault kv get -field hello secret/hello`. + +```python +In [1]: import hvac + +In [2]: client = hvac.Client(url="http://localhost:8200", token="nautobot") + +In [3]: client.secrets.kv.create_or_update_secret(path="hello", secret=dict(hello="world")) +Out[3]: +{'request_id': 'c4709868-c08f-4cb1-ab8c-605c58b82f3f', + 'lease_id': '', + 'renewable': False, + 'lease_duration': 0, + 'data': {'created_time': '2021-09-16T23:21:07.5564132Z', + 'deletion_time': '', + 'destroyed': False, + 'version': 2}, + 'wrap_info': None, + 'warnings': None, + 'auth': None} + +In [4]: client.secrets.kv.read_secret(path="hello")["data"]["data"]["hello"] +Out[4]: 'world' +``` + + ## Project Overview This project provides the ability to develop and manage the Nautobot server locally (with supporting services being *Dockerized*) or by using only Docker containers to manage Nautobot. The main difference between the two environments is the ability to debug and use **pdb** when developing locally. Debugging with **pdb** within the Docker container is more complicated, but can still be accomplished by either entering into the container (via `docker exec`) or attaching your IDE to the container and running the Nautobot service manually within the container. @@ -470,3 +699,21 @@ To run an individual test, you can run any or all of the following: ➜ invoke ruff ➜ invoke pylint ``` + +### App Configuration Schema + +In the package source, there is the `nautobot_secrets_providers/app-config-schema.json` file, conforming to the [JSON Schema](https://json-schema.org/) format. This file is used to validate the configuration of the app in CI pipelines. + +If you make changes to `PLUGINS_CONFIG` or the configuration schema, you can run the following command to validate the schema: + +```bash +invoke validate-app-config +``` + +To generate the `app-config-schema.json` file based on the current `PLUGINS_CONFIG` configuration, run the following command: + +```bash +invoke generate-app-config-schema +``` + +This command can only guess the schema, so it's up to the developer to manually update the schema as needed. diff --git a/docs/index.md b/docs/index.md index dbfdad4..6399752 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,17 +1,35 @@ -# NautobotSecretsProviders +# Nautobot Secrets Providers App -TODO: Write app documentation, the outline here is provided as a guide and should be expanded upon. If more detail is required you are encouraged to expand on the table of contents (TOC) in `mkdocs.yml` to add additional pages. +This document provides an overview of the App including critical information and important considerations when applying it to your Nautobot environment. + +!!! note + Throughout this documentation, the terms "app" and "plugin" will be used interchangeably. ## Description -## Installation +Nautobot Secrets Providers is an app for [Nautobot](https://github.com/nautobot/nautobot) 1.2.1 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.2.0 added support for integrating with retrieving secrets from various secrets providers. + +This app publishes secrets providers that are not included in the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. + +### Supported Secrets Backends + +This app supports the following popular secrets backends: + +| Secrets Backend | Supported Secret Types | Supported Authentication Methods | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | +| [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | +| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | +| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver)| [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| + +## Audience (User Personas) - Who should use this App? -## Configuration +- Anyone who needs to retrieve secrets from Hashicorp Vault, AWS, or Delinea/Thycotic and use them in Nautobot -## Usage +## Authors and Maintainers -## API +- Nautobot Core Team -## Views +## Nautobot Features Used -## Models +- Secrets Providers diff --git a/mkdocs.yml b/mkdocs.yml index ad67a3c..39f03bf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -81,7 +81,11 @@ markdown_extensions: anchor_linenums: true - "pymdownx.inlinehilite" - "pymdownx.snippets" - - "pymdownx.superfences" + - "pymdownx.superfences": + custom_fences: + - name: "mermaid" + class: "mermaid" + format: !!python/name:pymdownx.superfences.fence_code_format - "footnotes" plugins: - "search" @@ -98,3 +102,11 @@ watch: nav: - Overview: "index.md" + - Administrator Guide: + - Install and Configure: "admin/install.md" + - Uninstall: "admin/uninstall.md" + - Compatibility Matrix: "admin/compatibility_matrix.md" + - Developer Guide: + - Contributing to the App: "dev/contributing.md" + - Development Environment: "dev/dev_environment.md" + - Nautobot Docs Home ↗︎: "https://docs.nautobot.com" diff --git a/nautobot_secrets_providers/app-config-schema.json b/nautobot_secrets_providers/app-config-schema.json new file mode 100644 index 0000000..98df0b5 --- /dev/null +++ b/nautobot_secrets_providers/app-config-schema.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/nautobot_secrets_providers/app-config-schema.json", + "type": "object", + "properties": { + "hashicorp_vault": { + "type": "object", + "properties": { + "auth_method": { + "type": "string", + "default": "token", + "oneOf": [ + "approle", + "aws", + "kubernetes", + "token" + ] + }, + "ca_cert": { + "type": ["string", "boolean"] + }, + "default_kv_version": { + "type": "string", + "default": "v2", + "oneOf": ["v1", "v2"] + }, + "default_mount_point": { + "type": "string", + "default": "secret" + }, + "k8s_token_path": { + "type": "string", + "default": "/var/run/secrets/kubernetes.io/serviceaccount/token" + }, + "kv_version": { + "type": "string", + "default": "v2", + "oneOf": ["v1", "v2"] + }, + "login_kwargs": { + "type": "object" + }, + "namespace": { + "type": "string" + }, + "role_id": { + "type": "string" + }, + "role_name": { + "type": "string" + }, + "secret_id": { + "type": "string" + }, + "token": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": ["url"] + }, + "thycotic": { + "type": "object", + "properties": { + "base_url": { + "type": "string" + }, + "ca_bundle_path": { + "type": "string" + }, + "cloud_based": { + "type": "boolean" + }, + "domain": { + "type": "string" + }, + "password": { + "type": "string" + }, + "tenant": { + "type": "string" + }, + "token": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": ["base_url"] + } + } +} diff --git a/poetry.lock b/poetry.lock index f254005..99fe40d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "amqp" @@ -1713,6 +1713,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2730,6 +2740,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2737,8 +2748,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2755,6 +2774,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2762,6 +2782,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2971,23 +2992,22 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "responses" -version = "0.23.3" +version = "0.25.0" description = "A utility library for mocking out the `requests` Python library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "responses-0.23.3-py3-none-any.whl", hash = "sha256:e6fbcf5d82172fecc0aa1860fd91e58cbfd96cee5e96da5b63fa6eb3caa10dd3"}, - {file = "responses-0.23.3.tar.gz", hash = "sha256:205029e1cb334c21cb4ec64fc7599be48b859a0fd381a42443cdd600bfe8b16a"}, + {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, + {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, ] [package.dependencies] pyyaml = "*" requests = ">=2.30.0,<3.0" -types-PyYAML = "*" urllib3 = ">=1.25.10,<3.0" [package.extras] -tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-requests"] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] [[package]] name = "rich" @@ -3317,6 +3337,20 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "to-json-schema" +version = "1.0.1" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "to_json_schema-1.0.1-py3-none-any.whl", hash = "sha256:5708663f1c81815e4ff01fce910ac32ee3964d0c6b3587fd4fff2e38d5c9aa7b"}, + {file = "to_json_schema-1.0.1.tar.gz", hash = "sha256:ec747bd5129256dd571105f66a7bc9a4546228cd5e5fbf5e06dc9776e255400e"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov", "setuptools"] + [[package]] name = "toml" version = "0.10.2" @@ -3387,17 +3421,6 @@ 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 = "types-pyyaml" -version = "6.0.12.12" -description = "Typing stubs for PyYAML" -optional = false -python-versions = "*" -files = [ - {file = "types-PyYAML-6.0.12.12.tar.gz", hash = "sha256:334373d392fde0fdf95af5c3f1661885fa10c52167b14593eb856289e1855062"}, - {file = "types_PyYAML-6.0.12.12-py3-none-any.whl", hash = "sha256:c05bc6c158facb0676674b7f11fe3960db4f389718e19e62bd2b84d6205cfd24"}, -] - [[package]] name = "typing-extensions" version = "4.8.0" @@ -3510,13 +3533,13 @@ files = [ [[package]] name = "werkzeug" -version = "2.3.7" +version = "3.0.1" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, - {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, + {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, + {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, ] [package.dependencies] @@ -3663,4 +3686,4 @@ thycotic = ["python-tss-sdk"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "8bd5c274369bdf4572b41d07b7961cd14ef9fc0120ede7c974fbc132dfd14572" +content-hash = "778aa31d640036f5e9b0cdda10add84f8fa425aeea14126070ba1227b88932be" diff --git a/pyproject.toml b/pyproject.toml index ce7463e..0797950 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ license = "Apache-2.0" readme = "README.md" homepage = "https://github.com/nautobot/nautobot-app-secrets-providers" repository = "https://github.com/nautobot/nautobot-app-secrets-providers" +documentation = "https://docs.nautobot.com/projects/secrets-providers/en/latest/" keywords = ["nautobot", "nautobot-app", "nautobot-plugin"] classifiers = [ "Intended Audience :: Developers", @@ -57,6 +58,8 @@ mkdocs-version-annotations = "1.0.0" mkdocstrings = "0.22.0" mkdocstrings-python = "1.5.2" towncrier = "~23.6.0" +to-json-schema = "*" +jsonschema = "*" moto = "~2.2.11" pyOpenSSL = "23.2.0" requests-mock = "1.9.3" @@ -173,7 +176,7 @@ requires = ["poetry_core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.towncrier] -package = "nautobot" +package = "nautobot_secrets_providers" directory = "changes" filename = "docs/admin/release_notes/version_X.Y.md" template = "development/towncrier_template.j2" diff --git a/tasks.py b/tasks.py index c257d86..6c08350 100644 --- a/tasks.py +++ b/tasks.py @@ -149,15 +149,27 @@ def docker_compose(context, command, **kwargs): def run_command(context, command, **kwargs): """Wrapper to run a command locally or inside the nautobot container.""" if is_truthy(context.nautobot_secrets_providers.local): + if "command_env" in kwargs: + kwargs["env"] = { + **kwargs.get("env", {}), + **kwargs.pop("command_env"), + } context.run(command, **kwargs) else: # Check if nautobot is running, no need to start another nautobot container to run a command docker_compose_status = "ps --services --filter status=running" results = docker_compose(context, docker_compose_status, hide="out") if "nautobot" in results.stdout: - compose_command = f"exec nautobot {command}" + compose_command = "exec" else: - compose_command = f"run --rm --entrypoint '{command}' nautobot" + compose_command = "run --rm --entrypoint=''" + + if "command_env" in kwargs: + command_env = kwargs.pop("command_env") + for key, value in command_env.items(): + compose_command += f' --env="{key}={value}"' + + compose_command += f" -- nautobot {command}" pty = kwargs.pop("pty", True) @@ -327,15 +339,22 @@ def logs(context, service="", follow=False, tail=0): # ------------------------------------------------------------------------------ # ACTIONS # ------------------------------------------------------------------------------ -@task(help={"file": "Python file to execute"}) -def nbshell(context, file=""): +@task( + help={ + "file": "Python file to execute", + "env": "Environment variables to pass to the command", + "plain": "Flag to run nbshell in plain mode (default: False)", + }, +) +def nbshell(context, file="", env={}, plain=False): """Launch an interactive nbshell session.""" command = [ "nautobot-server", "nbshell", + "--plain" if plain else "", f"< '{file}'" if file else "", ] - run_command(context, " ".join(command), pty=not bool(file)) + run_command(context, " ".join(command), pty=not bool(file), command_env=env) @task @@ -672,7 +691,7 @@ def pylint(context): def autoformat(context): """Run code autoformatting.""" black(context, autoformat=True) - ruff(context, action="both", fix=True) + ruff(context, fix=True) @task( @@ -800,8 +819,33 @@ def tests(context, failfast=False, keepdb=False, lint_only=False): pylint(context) print("Running mkdocs...") build_and_check_docs(context) + print("Checking app config schema...") + validate_app_config(context) if not lint_only: print("Running unit tests...") unittest(context, failfast=failfast, keepdb=keepdb) unittest_coverage(context) print("All tests have passed!") + + +@task +def generate_app_config_schema(context): + """Generate the app config schema from the current app config. + + WARNING: Review and edit the generated file before committing. + + Its content is inferred from: + + - The current configuration in `PLUGINS_CONFIG` + - `NautobotAppConfig.default_settings` + - `NautobotAppConfig.required_settings` + """ + start(context, service="nautobot") + nbshell(context, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "generate"}) + + +@task +def validate_app_config(context): + """Validate the app config based on the app config schema.""" + start(context, service="nautobot") + nbshell(context, plain=True, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "validate"}) From e5465d29c686a27b3c1ee23d9dc5603d0b7f94bc Mon Sep 17 00:00:00 2001 From: Steven Weiblinger <111259311+DistantVoyager@users.noreply.github.com> Date: Fri, 21 Jun 2024 10:14:40 -0400 Subject: [PATCH 06/11] Drift manager/pr (#130) * Cookie updated by NetworkToCode Cookie Drift Manager Tool Template: ``` { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "dir": "nautobot-app", "ref": "refs/tags/nautobot-app-v2.2.0", "path": null } ``` Cookie: ``` { "remote": "https://github.com/nautobot/nautobot-app-secrets-providers.git", "path": "/tmp/tmp6nzvny6c/nautobot-app-secrets-providers", "repository_path": "/tmp/tmp6nzvny6c/nautobot-app-secrets-providers", "dir": "", "branch_prefix": "drift-manager", "context": { "codeowner_github_usernames": "@smith-ntc", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_secrets_providers", "verbose_name": "Nautobot's Secrets Providers App", "app_slug": "nautobot-secrets-providers", "project_slug": "nautobot-app-secrets-providers", "repo_url": "https://github.com/nautobot/nautobot-app-secrets-providers", "base_url": "secrets-providers", "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSecretsProviders", "project_short_description": "Nautobot App that provides direct integrations with Enterprise secrets management systems. Provides patterns to securely fetch secrets for use by other Nautobot Apps and Nautobot Jobs.", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", "docs_app_url": "https://docs.nautobot.com/projects/secrets-providers/en/latest", "_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "_output_dir": "/tmp/tmp6nzvny6c", "_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app", "_checkout": "refs/tags/nautobot-app-v2.2.0" }, "base_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.CREATE", "post_actions": [ "PostAction.BLACK" ], "baked_commit_ref": "19d14aa7031336b5872b82806f71d7b1856d4fe1", "draft": true } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "", "template_dir": "", "template_ref": "refs/tags/nautobot-app-v2.2.0", "pull_request": null, "post_action": [], "disable_post_actions": false, "draft": null } ``` * fix: Added changelog fragment * chore: Manual fixes * chore: Lock poetry * update install docs * update json schema * update app overview doc * test * test * update compatibility matrix * major docs reorganization to match cookie * update lockfile * update doc index * Docker compose fix and removed version * change fragment --------- Co-authored-by: bakebot Co-authored-by: Jan Snasel Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com> --- changes/130.changed | 1 + development/docker-compose.base.yml | 1 - development/docker-compose.dev.yml | 1 - development/docker-compose.mysql.yml | 3 --- development/docker-compose.postgres.yml | 2 -- development/docker-compose.redis.yml | 1 - development/docker-compose.requirements.yml | 1 - 7 files changed, 1 insertion(+), 9 deletions(-) create mode 100644 changes/130.changed diff --git a/changes/130.changed b/changes/130.changed new file mode 100644 index 0000000..9303c67 --- /dev/null +++ b/changes/130.changed @@ -0,0 +1 @@ +Removed version from docker-compose files. \ No newline at end of file diff --git a/development/docker-compose.base.yml b/development/docker-compose.base.yml index 544babc..3d704d7 100644 --- a/development/docker-compose.base.yml +++ b/development/docker-compose.base.yml @@ -13,7 +13,6 @@ x-nautobot-base: &nautobot-base - "creds.env" tty: true -version: "3.8" services: nautobot: depends_on: diff --git a/development/docker-compose.dev.yml b/development/docker-compose.dev.yml index 96cc427..2d55cd5 100644 --- a/development/docker-compose.dev.yml +++ b/development/docker-compose.dev.yml @@ -3,7 +3,6 @@ # any override will need to include these volumes to use them. # see: https://github.com/docker/compose/issues/3729 --- -version: "3.8" services: nautobot: command: "nautobot-server runserver 0.0.0.0:8080" diff --git a/development/docker-compose.mysql.yml b/development/docker-compose.mysql.yml index 062ada9..dbe31cb 100644 --- a/development/docker-compose.mysql.yml +++ b/development/docker-compose.mysql.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: @@ -19,7 +17,6 @@ services: db: image: "mysql:8" command: - - "--default-authentication-plugin=mysql_native_password" - "--max_connections=1000" env_file: - "development.env" diff --git a/development/docker-compose.postgres.yml b/development/docker-compose.postgres.yml index 12d1de3..8d96fdb 100644 --- a/development/docker-compose.postgres.yml +++ b/development/docker-compose.postgres.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: diff --git a/development/docker-compose.redis.yml b/development/docker-compose.redis.yml index 6da9fa0..b5e266a 100644 --- a/development/docker-compose.redis.yml +++ b/development/docker-compose.redis.yml @@ -1,5 +1,4 @@ --- -version: "3.8" services: redis: image: "redis:6-alpine" diff --git a/development/docker-compose.requirements.yml b/development/docker-compose.requirements.yml index fcac573..fb77b63 100644 --- a/development/docker-compose.requirements.yml +++ b/development/docker-compose.requirements.yml @@ -1,5 +1,4 @@ --- -version: "3.4" services: postgres: image: "postgres:13-alpine" From d6a8d7f1d511b2919b5f240919f8984f5066637a Mon Sep 17 00:00:00 2001 From: Mathias Wegner <36479366+mathiaswegner@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:30:25 -0400 Subject: [PATCH 07/11] Fix/issue64 - added fallthrough in error handling (#129) * Added an else inside the except to catch error types that aren't specified in any of the elifs. * Added changes file. * Fix CI --------- Co-authored-by: Mathias Wegner Co-authored-by: Glenn Matthews --- changes/64.added | 1 + nautobot_secrets_providers/providers/aws.py | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 changes/64.added diff --git a/changes/64.added b/changes/64.added new file mode 100644 index 0000000..f972332 --- /dev/null +++ b/changes/64.added @@ -0,0 +1 @@ +Added fallthrough for boto3 error handling to catch errors not explicitly defined. diff --git a/nautobot_secrets_providers/providers/aws.py b/nautobot_secrets_providers/providers/aws.py index 34baba0..5ee63d8 100644 --- a/nautobot_secrets_providers/providers/aws.py +++ b/nautobot_secrets_providers/providers/aws.py @@ -83,6 +83,9 @@ def get_value_for_secret(cls, secret, obj=None, **kwargs): # We can't find the resource that you asked for. # Deal with the exception here, and/or rethrow at your discretion. raise exceptions.SecretValueNotFoundError(secret, cls, str(err)) + else: + # We got an error that isn't defined above + raise exceptions.SecretProviderError(secret, cls, str(err)) else: # Decrypts secret using the associated KMS CMK. # Depending on whether the secret is a string or binary, one of these fields will be populated. From 8db834f5ac2bd60afc4b7ab01d68403670e3d16a Mon Sep 17 00:00:00 2001 From: Steven Weiblinger <111259311+DistantVoyager@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:59:02 -0400 Subject: [PATCH 08/11] Azure Key Vault provider (#131) * add Azure secret provider * -- fix mistakenly upgraded nautobot dependency version * Updates to azure.oy and poetry * Change fragment * Formatting * Additional minor formatting * Update lock file * Update docs/admin/install.md Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com> --------- Co-authored-by: Jonathan Nathanson Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com> --- README.md | 13 +- changes/131.added | 1 + development/app_config_schema.py | 1 + development/creds.example.env | 20 +- development/nautobot_config.py | 1 + docs/admin/install.md | 16 + docs/index.md | 1 + nautobot_secrets_providers/__init__.py | 1 + .../providers/__init__.py | 2 + nautobot_secrets_providers/providers/azure.py | 62 + .../providers/choices.py | 1 + .../providers/delinea.py | 1 + .../nautobot_secrets_providers/home.html | 5 + .../tests/test_basic.py | 1 + .../tests/test_providers.py | 1 + nautobot_secrets_providers/urls.py | 1 + poetry.lock | 2212 ++++++++++------- pyproject.toml | 10 +- tasks.py | 8 +- 19 files changed, 1385 insertions(+), 973 deletions(-) create mode 100644 changes/131.added create mode 100644 nautobot_secrets_providers/providers/azure.py diff --git a/README.md b/README.md index 874e03f..afdbb78 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,13 @@ This app publishes secrets providers that are not included in the Nautobot core This app supports the following popular secrets backends: -| Secrets Backend | Supported Secret Types | Supported Authentication Methods | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | -| [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | -| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | -| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver)| [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| +| Secrets Backend | Supported Secret Types | Supported Authentication Methods | +| ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | +| [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | +| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | +| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver) | [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| +| [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/) | [Key Vault Secrets](https://learn.microsoft.com/en-us/azure/key-vault/secrets/about-secrets) | [Entra ID Service Principal](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python) | ## Screenshots diff --git a/changes/131.added b/changes/131.added new file mode 100644 index 0000000..80bc485 --- /dev/null +++ b/changes/131.added @@ -0,0 +1 @@ +Added a secrets provider for Azure Key Vault. \ No newline at end of file diff --git a/development/app_config_schema.py b/development/app_config_schema.py index 4700995..a779b14 100644 --- a/development/app_config_schema.py +++ b/development/app_config_schema.py @@ -1,4 +1,5 @@ """App Config Schema Generator and Validator.""" + import json from importlib import import_module from os import getenv diff --git a/development/creds.example.env b/development/creds.example.env index 77aca1c..7af55ec 100644 --- a/development/creds.example.env +++ b/development/creds.example.env @@ -26,7 +26,7 @@ MYSQL_PASSWORD=${NAUTOBOT_DB_PASSWORD} # NAUTOBOT_REDIS_HOST=localhost # NAUTOBOT_CONFIG=development/nautobot_config.py -############################################################################# +################################################################################ # Settings for Delinea/Thycotic Secret-Server-Reader # https://github.com/DelineaXPM/python-tss-sdk @@ -56,3 +56,21 @@ SECRET_SERVER_PASSWORD='my_thycotic_password' #REQUESTS_CA_BUNDLE='/etc/ssl/certs/ca-bundle.trust.crt' VAULT_TOKEN=nautobot + +################################################################################ +# Azure Key Vault Settings +# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python +# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python +# +# TLDR; Set up a Service Principal, grant it "Key Vault Secrets User" role, add service principal +# details to the environment variables below. + +AZURE_TENANT_ID='' +AZURE_CLIENT_ID='' + +AZURE_CLIENT_SECRET='' + +# AZURE_CLIENT_CERTIFICATE_PATH='' +# AZURE_CLIENT_CERTIFICATE_PASSWORD='' + +################################################################################ \ No newline at end of file diff --git a/development/nautobot_config.py b/development/nautobot_config.py index d61ed30..91f7ae7 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -1,4 +1,5 @@ """Nautobot development configuration file.""" + import os import sys diff --git a/docs/admin/install.md b/docs/admin/install.md index 637ea26..52bb018 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -45,6 +45,14 @@ The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` librar pip install nautobot-secrets-providers[thycotic] ``` +#### Azure Key Vault + +The Azure Key Vault provider requires the `azure-identity` and `azure-keyvault-secrets` libraries. This can be easily installed along with the app using the following command: + +```no-highlight +pip install nautobot-secrets-providers[azure] +``` + ### Access Requirements There are no special access requirements to install the app. @@ -210,3 +218,11 @@ PLUGINS_CONFIG = { - `tenant` - (optional) Required for 'Domain Authorization'. - `token` - (optional) Required for 'Access Token Authorization'. - `username` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. + +### Azure Key Vault + +#### Authentication + +No configuration is required within Nautobot for this provider to work. You must provide [Azure Service Principal credentials in one of the formats supported by the azure-identity library](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python). The credential variables should be injected into Nautobot's environment via your preferred method. + +The recommended method is to use a Service Principal with Secret, for which creds.example.env has an example. [More information on how to set up the SP in Azure in the Azure docs](https://learn.microsoft.com/en-us/azure/key-vault/general/rbac-guide?tabs=azure-cli). \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 6399752..303d7fc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,6 +21,7 @@ This app supports the following popular secrets backends: | [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | | [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | | [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver)| [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| +| [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/) | [Key Vault Secrets](https://learn.microsoft.com/en-us/azure/key-vault/secrets/about-secrets) | [Entra ID Service Principal](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python) | ## Audience (User Personas) - Who should use this App? diff --git a/nautobot_secrets_providers/__init__.py b/nautobot_secrets_providers/__init__.py index 32e5e07..538614d 100644 --- a/nautobot_secrets_providers/__init__.py +++ b/nautobot_secrets_providers/__init__.py @@ -1,4 +1,5 @@ """App declaration for nautobot_secrets_providers.""" + # Metadata is inherited from Nautobot. If not including Nautobot in the environment, this should be added from importlib import metadata diff --git a/nautobot_secrets_providers/providers/__init__.py b/nautobot_secrets_providers/providers/__init__.py index 3a0baf9..fbaca5e 100644 --- a/nautobot_secrets_providers/providers/__init__.py +++ b/nautobot_secrets_providers/providers/__init__.py @@ -1,12 +1,14 @@ """Nautobot Secrets Providers.""" from .aws import AWSSecretsManagerSecretsProvider, AWSSystemsManagerParameterStore +from .azure import AzureKeyVaultSecretsProvider from .hashicorp import HashiCorpVaultSecretsProvider from .delinea import ThycoticSecretServerSecretsProviderId, ThycoticSecretServerSecretsProviderPath __all__ = ( # type: ignore AWSSecretsManagerSecretsProvider, # pylint: disable=invalid-all-object AWSSystemsManagerParameterStore, # pylint: disable=invalid-all-object + AzureKeyVaultSecretsProvider, # pylint: disable=invalid-all-object HashiCorpVaultSecretsProvider, # pylint: disable=invalid-all-object ThycoticSecretServerSecretsProviderId, # pylint: disable=invalid-all-object ThycoticSecretServerSecretsProviderPath, # pylint: disable=invalid-all-object diff --git a/nautobot_secrets_providers/providers/azure.py b/nautobot_secrets_providers/providers/azure.py new file mode 100644 index 0000000..c0be6e7 --- /dev/null +++ b/nautobot_secrets_providers/providers/azure.py @@ -0,0 +1,62 @@ +"""Secrets Provider for Azure Key Vault.""" + +try: + from azure.identity import DefaultAzureCredential + from azure.keyvault.secrets import SecretClient + + azure_available = True # pylint: disable=invalid-name +except ImportError: + azure_available = False # pylint: disable=invalid-name + +from django import forms +from nautobot.core.forms import BootstrapMixin +from nautobot.extras.secrets import exceptions, SecretsProvider + +__all__ = ("AzureKeyVaultSecretsProvider",) + + +class AzureKeyVaultSecretsProvider(SecretsProvider): + """A secrets provider for Azure Key Vault.""" + + slug = "azure-key-vault" + name = "Azure Key Vault" + is_available = azure_available + + # pylint: disable-next=nb-incorrect-base-class + class ParametersForm(BootstrapMixin, forms.Form): + """Required parameters for Azure Key Vault.""" + + vault_url = forms.CharField( + required=True, + help_text="The URL of the Azure Key Vault", + ) + secret_name = forms.CharField( + required=True, + help_text="The name of the secret in the Azure Key Vault", + ) + + @classmethod + def get_value_for_secret(cls, secret, obj=None, **kwargs): + """Return the secret value by name from Azure Key Vault.""" + # Extract the parameters from the Secret. + parameters = secret.rendered_parameters(obj=obj) + vault_url = parameters.get("vault_url") + secret_name = parameters.get("secret_name") + + # Authenticate with Azure Key Vault using default credentials. + # This assumes that environment variables for Azure authentication are set. + credential = DefaultAzureCredential() + client = SecretClient(vault_url=vault_url, credential=credential) + + try: + # Retrieve the secret from Azure Key Vault. + response = client.get_secret(secret_name) + except Exception as err: + # Handle exceptions from the Azure SDK. + raise exceptions.SecretProviderError(secret, cls, str(err)) + + # The value is in the 'value' attribute of the response. + secret_value = response.value + + # Return the secret value. + return secret_value diff --git a/nautobot_secrets_providers/providers/choices.py b/nautobot_secrets_providers/providers/choices.py index f1bf2b9..d7eb1aa 100644 --- a/nautobot_secrets_providers/providers/choices.py +++ b/nautobot_secrets_providers/providers/choices.py @@ -1,4 +1,5 @@ """Choices for Thycotic Secret Server Plugin.""" + from nautobot.core.choices import ChoiceSet diff --git a/nautobot_secrets_providers/providers/delinea.py b/nautobot_secrets_providers/providers/delinea.py index ae56a1a..740bd5c 100644 --- a/nautobot_secrets_providers/providers/delinea.py +++ b/nautobot_secrets_providers/providers/delinea.py @@ -1,4 +1,5 @@ """Secrets Provider for Thycotic Secret Server.""" + import os from pathlib import Path diff --git a/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html b/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html index 10eafd3..ca0bcf1 100644 --- a/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html +++ b/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html @@ -46,6 +46,11 @@

{% block title %}Secrets Providers Home{% endblock %}

Domain Authorization
Access Token Authorization + + Azure Key Vault + Secrets
+ Entra ID Service Principal
+ diff --git a/nautobot_secrets_providers/tests/test_basic.py b/nautobot_secrets_providers/tests/test_basic.py index bcf7d12..30fc318 100644 --- a/nautobot_secrets_providers/tests/test_basic.py +++ b/nautobot_secrets_providers/tests/test_basic.py @@ -1,4 +1,5 @@ """Basic tests that do not require Django.""" + import unittest import os import toml diff --git a/nautobot_secrets_providers/tests/test_providers.py b/nautobot_secrets_providers/tests/test_providers.py index d8eba67..c4311c7 100644 --- a/nautobot_secrets_providers/tests/test_providers.py +++ b/nautobot_secrets_providers/tests/test_providers.py @@ -1,4 +1,5 @@ """Unit tests for Secrets Providers.""" + import os from unittest.mock import patch, mock_open diff --git a/nautobot_secrets_providers/urls.py b/nautobot_secrets_providers/urls.py index 7a00e21..5299d1d 100644 --- a/nautobot_secrets_providers/urls.py +++ b/nautobot_secrets_providers/urls.py @@ -1,4 +1,5 @@ """Django urlpatterns declaration for nautobot_secrets_providers app.""" + from django.urls import path from nautobot_secrets_providers import views diff --git a/poetry.lock b/poetry.lock index 99fe40d..111eb6e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,18 +1,18 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "amqp" -version = "5.1.1" +version = "5.2.0" description = "Low-level AMQP client for Python (fork of amqplib)." optional = false python-versions = ">=3.6" files = [ - {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"}, - {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"}, + {file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"}, + {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, ] [package.dependencies] -vine = ">=5.0.0" +vine = ">=5.0.0,<6.0.0" [[package]] name = "aniso8601" @@ -90,6 +90,21 @@ six = ">=1.12.0" astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + [[package]] name = "async-timeout" version = "4.0.3" @@ -103,21 +118,89 @@ files = [ [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "autopep8" +version = "2.0.0" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +optional = false +python-versions = "*" +files = [ + {file = "autopep8-2.0.0-py2.py3-none-any.whl", hash = "sha256:ad924b42c2e27a1ac58e432166cc4588f5b80747de02d0d35b1ecbd3e7d57207"}, + {file = "autopep8-2.0.0.tar.gz", hash = "sha256:8b1659c7f003e693199f52caffdc06585bb0716900bbc6a7442fd931d658c077"}, +] + +[package.dependencies] +pycodestyle = ">=2.9.1" +tomli = "*" + +[[package]] +name = "azure-core" +version = "1.30.0" +description = "Microsoft Azure Core Library for Python" +optional = true +python-versions = ">=3.7" +files = [ + {file = "azure-core-1.30.0.tar.gz", hash = "sha256:6f3a7883ef184722f6bd997262eddaf80cfe7e5b3e0caaaf8db1695695893d35"}, + {file = "azure_core-1.30.0-py3-none-any.whl", hash = "sha256:3dae7962aad109610e68c9a7abb31d79720e1d982ddf61363038d175a5025e89"}, +] + +[package.dependencies] +requests = ">=2.21.0" +six = ">=1.11.0" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["aiohttp (>=3.0)"] + +[[package]] +name = "azure-identity" +version = "1.15.0" +description = "Microsoft Azure Identity Library for Python" +optional = true +python-versions = ">=3.7" +files = [ + {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, + {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, +] + +[package.dependencies] +azure-core = ">=1.23.0,<2.0.0" +cryptography = ">=2.5" +msal = ">=1.24.0,<2.0.0" +msal-extensions = ">=0.3.0,<2.0.0" + +[[package]] +name = "azure-keyvault-secrets" +version = "4.8.0" +description = "Microsoft Azure Key Vault Secrets Client Library for Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "azure-keyvault-secrets-4.8.0.tar.gz", hash = "sha256:5636c0a1d8a20e3c5799cb3ccffd4ebf3f0d1acb7cae9526861833af8b0fe814"}, + {file = "azure_keyvault_secrets-4.8.0-py3-none-any.whl", hash = "sha256:e5898c87cef95e54a8c4aa48cdbf4717ee30543a10b793c95bd57a476554a893"}, +] + +[package.dependencies] +azure-core = ">=1.29.5,<2.0.0" +isodate = ">=0.6.1" +typing-extensions = ">=4.0.1" [[package]] name = "backcall" @@ -163,67 +246,67 @@ tzdata = ["tzdata"] [[package]] name = "bandit" -version = "1.7.5" +version = "1.7.7" description = "Security oriented static analyser for python code." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, - {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, + {file = "bandit-1.7.7-py3-none-any.whl", hash = "sha256:17e60786a7ea3c9ec84569fd5aee09936d116cb0cb43151023258340dbffb7ed"}, + {file = "bandit-1.7.7.tar.gz", hash = "sha256:527906bec6088cb499aae31bc962864b4e77569e9d529ee51df3a93b4b8ab28a"}, ] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" PyYAML = ">=5.3.1" rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +baseline = ["GitPython (>=3.1.30)"] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"] toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] [[package]] name = "billiard" -version = "4.1.0" +version = "4.2.0" description = "Python multiprocessing fork with improvements and bugfixes" optional = false python-versions = ">=3.7" files = [ - {file = "billiard-4.1.0-py3-none-any.whl", hash = "sha256:0f50d6be051c6b2b75bfbc8bfd85af195c5739c281d3f5b86a5640c65563614a"}, - {file = "billiard-4.1.0.tar.gz", hash = "sha256:1ad2eeae8e28053d729ba3373d34d9d6e210f6e4d8bf0a9c64f92bd053f1edf5"}, + {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, + {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, ] [[package]] name = "black" -version = "23.9.1" +version = "24.2.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, - {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, - {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, - {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, - {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, - {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, - {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, - {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, - {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, - {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, - {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, + {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, + {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, + {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, + {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, + {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, + {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, + {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, + {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, + {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, + {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, + {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, + {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, + {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, + {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, + {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, + {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, + {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, + {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, + {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, + {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, + {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, + {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, ] [package.dependencies] @@ -237,7 +320,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -281,30 +364,30 @@ crt = ["awscrt (==0.12.5)"] [[package]] name = "celery" -version = "5.3.4" +version = "5.3.6" description = "Distributed Task Queue." optional = false python-versions = ">=3.8" files = [ - {file = "celery-5.3.4-py3-none-any.whl", hash = "sha256:1e6ed40af72695464ce98ca2c201ad0ef8fd192246f6c9eac8bba343b980ad34"}, - {file = "celery-5.3.4.tar.gz", hash = "sha256:9023df6a8962da79eb30c0c84d5f4863d9793a466354cc931d7f72423996de28"}, + {file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"}, + {file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"}, ] [package.dependencies] "backports.zoneinfo" = {version = ">=0.2.1", markers = "python_version < \"3.9\""} -billiard = ">=4.1.0,<5.0" +billiard = ">=4.2.0,<5.0" click = ">=8.1.2,<9.0" click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -kombu = ">=5.3.2,<6.0" +kombu = ">=5.3.4,<6.0" python-dateutil = ">=2.8.2" tzdata = ">=2022.7" -vine = ">=5.0.0,<6.0" +vine = ">=5.1.0,<6.0" [package.extras] arangodb = ["pyArango (>=2.0.2)"] -auth = ["cryptography (==41.0.3)"] +auth = ["cryptography (==41.0.5)"] azureblockblob = ["azure-storage-blob (>=12.15.0)"] brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] cassandra = ["cassandra-driver (>=3.25.0,<4)"] @@ -314,36 +397,36 @@ couchbase = ["couchbase (>=3.0.0)"] couchdb = ["pycouchdb (==1.14.2)"] django = ["Django (>=2.2.28)"] dynamodb = ["boto3 (>=1.26.143)"] -elasticsearch = ["elasticsearch (<8.0)"] +elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"] eventlet = ["eventlet (>=0.32.0)"] gevent = ["gevent (>=1.5.0)"] librabbitmq = ["librabbitmq (>=2.0.0)"] memcache = ["pylibmc (==1.6.3)"] mongodb = ["pymongo[srv] (>=4.0.2)"] -msgpack = ["msgpack (==1.0.5)"] +msgpack = ["msgpack (==1.0.7)"] pymemcache = ["python-memcached (==1.59)"] pyro = ["pyro4 (==4.82)"] pytest = ["pytest-celery (==0.0.0)"] -redis = ["redis (>=4.5.2,!=4.5.5,<5.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] s3 = ["boto3 (>=1.26.143)"] slmq = ["softlayer-messaging (>=1.0.3)"] -solar = ["ephem (==4.1.4)"] +solar = ["ephem (==4.1.5)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.0)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] -zstd = ["zstandard (==0.21.0)"] +zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -412,86 +495,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -587,63 +685,63 @@ files = [ [[package]] name = "coverage" -version = "7.3.1" +version = "7.4.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, - {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, - {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, - {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, - {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, - {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, - {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, - {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, - {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, - {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, - {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, - {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, - {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, - {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, + {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, + {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, + {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, + {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, + {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, + {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, + {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, + {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, + {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, + {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, + {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, + {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, ] [package.extras] @@ -651,12 +749,13 @@ toml = ["tomli"] [[package]] name = "cron-descriptor" -version = "1.4.0" +version = "1.4.3" description = "A Python library that converts cron expressions into human readable strings." optional = false python-versions = "*" files = [ - {file = "cron_descriptor-1.4.0.tar.gz", hash = "sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd"}, + {file = "cron_descriptor-1.4.3-py3-none-any.whl", hash = "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0"}, + {file = "cron_descriptor-1.4.3.tar.gz", hash = "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488"}, ] [package.extras] @@ -664,34 +763,34 @@ dev = ["polib"] [[package]] name = "cryptography" -version = "41.0.4" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, - {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, - {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, - {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] @@ -731,27 +830,28 @@ files = [ [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "3.2.21" +version = "3.2.24" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.6" files = [ - {file = "Django-3.2.21-py3-none-any.whl", hash = "sha256:d31b06c58aa2cd73998ca5966bc3001243d3c4e77ee2d0c479bced124765fd99"}, - {file = "Django-3.2.21.tar.gz", hash = "sha256:a5de4c484e7b7418e6d3e52a5b8794f0e6b9f9e4ce3c037018cf1c489fa87f3c"}, + {file = "Django-3.2.24-py3-none-any.whl", hash = "sha256:5dd5b787c3ba39637610fe700f54bf158e33560ea0dba600c19921e7ff926ec5"}, + {file = "Django-3.2.24.tar.gz", hash = "sha256:aaee9fb0fb4ebd4311520887ad2e33313d368846607f82a9a0ed461cd4c35b18"}, ] [package.dependencies] @@ -842,12 +942,13 @@ Django = ">=3.2" [[package]] name = "django-db-file-storage" -version = "0.5.5" +version = "0.5.6.1" description = "Custom FILE_STORAGE for Django. Saves files in your database instead of your file system." optional = false python-versions = "*" files = [ - {file = "django-db-file-storage-0.5.5.tar.gz", hash = "sha256:5d5da694b78ab202accab4508b958e0e37b3d146310e76f6f6125e1bdeaaad14"}, + {file = "django-db-file-storage-0.5.6.1.tar.gz", hash = "sha256:f0c4540ed6b772e8b3141eae3222acde4c29ab771477a5c999013a3980856c7f"}, + {file = "django_db_file_storage-0.5.6.1-py3-none-any.whl", hash = "sha256:3feac1e060b550c3c03c35e95d2111d9f100bc247863ace691a78b107f1fc3d5"}, ] [package.dependencies] @@ -855,13 +956,13 @@ Django = "*" [[package]] name = "django-debug-toolbar" -version = "4.2.0" +version = "4.3.0" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.8" files = [ - {file = "django_debug_toolbar-4.2.0-py3-none-any.whl", hash = "sha256:af99128c06e8e794479e65ab62cc6c7d1e74e1c19beb44dcbf9bad7a9c017327"}, - {file = "django_debug_toolbar-4.2.0.tar.gz", hash = "sha256:bc7fdaafafcdedefcc67a4a5ad9dac96efd6e41db15bc74d402a54a2ba4854dc"}, + {file = "django_debug_toolbar-4.3.0-py3-none-any.whl", hash = "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6"}, + {file = "django_debug_toolbar-4.3.0.tar.gz", hash = "sha256:0b0dddee5ea29b9cb678593bc0d7a6d76b21d7799cb68e091a2148341a80f3c4"}, ] [package.dependencies] @@ -978,6 +1079,23 @@ redis = ">=3,<4.0.0 || >4.0.0,<4.0.1 || >4.0.1" [package.extras] hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] +[[package]] +name = "django-silk" +version = "5.1.0" +description = "Silky smooth profiling for the Django Framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-silk-5.1.0.tar.gz", hash = "sha256:34abb5852315f0f3303d45b7ab4a2caa9cf670102b614dbb2ac40a5d2d5cbffb"}, + {file = "django_silk-5.1.0-py3-none-any.whl", hash = "sha256:35a2051672b0be86af4ce734a0df0b6674c8c63f2df730b3756ec6e52923707d"}, +] + +[package.dependencies] +autopep8 = "*" +Django = ">=3.2" +gprof2dot = ">=2017.09.19" +sqlparse = "*" + [[package]] name = "django-tables2" version = "2.6.0" @@ -1027,13 +1145,13 @@ pytz = "*" [[package]] name = "django-tree-queries" -version = "0.15.0" +version = "0.16.1" description = "Tree queries with explicit opt-in, without configurability" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django_tree_queries-0.15.0-py3-none-any.whl", hash = "sha256:cf11340de59d3122919fde46e99966bad40ff942df768d683383b111554134a1"}, - {file = "django_tree_queries-0.15.0.tar.gz", hash = "sha256:0e994c2a4601c021a115a397ec8d0ff7d5e614fae95947f72126e6a419c60f08"}, + {file = "django_tree_queries-0.16.1-py3-none-any.whl", hash = "sha256:b57cebd85136897dc2d7d1da50f3944b13d4713009af655ae221c8202146c2f5"}, + {file = "django_tree_queries-0.16.1.tar.gz", hash = "sha256:5a7765bdbc78742ae7b206348aa674a7e39ef38069ac3854a51b330d25081c43"}, ] [package.extras] @@ -1115,13 +1233,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2023.9.1" +version = "2024.2.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-sidecar-2023.9.1.tar.gz", hash = "sha256:05a0819adf37844307671988383b6045e078cfd688ee23ad66c6311b04fe92aa"}, - {file = "drf_spectacular_sidecar-2023.9.1-py3-none-any.whl", hash = "sha256:027bb254e20385ae8c94bb86d13d891e0880564d859a37caf34412a9fb73622f"}, + {file = "drf-spectacular-sidecar-2024.2.1.tar.gz", hash = "sha256:db95a38971c9be09986356f82041fac60183d28ebdf60c0c51eb8c1f86da3937"}, + {file = "drf_spectacular_sidecar-2024.2.1-py3-none-any.whl", hash = "sha256:dc819ef7a35448c18b2bf4273b38fe1468e14daea5fc8675afb5d0f9e6d9a0ba"}, ] [package.dependencies] @@ -1157,19 +1275,19 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "flake8" -version = "3.9.2" +version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6.1" files = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, ] [package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "ghp-import" @@ -1190,13 +1308,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -1204,20 +1322,31 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.37" +version = "3.1.42" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.37-py3-none-any.whl", hash = "sha256:5f4c4187de49616d710a77e98ddf17b4782060a1788df441846bddefbb89ab33"}, - {file = "GitPython-3.1.37.tar.gz", hash = "sha256:f9b9ddc0761c125d5780eab2d64be4873fc6817c2899cbcb34b02344bdc7bc54"}, + {file = "GitPython-3.1.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, + {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar"] + +[[package]] +name = "gprof2dot" +version = "2022.7.29" +description = "Generate a dot graph from the output of several profilers." +optional = false +python-versions = ">=2.7" +files = [ + {file = "gprof2dot-2022.7.29-py2.py3-none-any.whl", hash = "sha256:f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6"}, + {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"}, +] [[package]] name = "graphene" @@ -1313,16 +1442,17 @@ six = ">=1.12" [[package]] name = "griffe" -version = "0.36.4" +version = "0.41.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.36.4-py3-none-any.whl", hash = "sha256:4e37a723891fa774fafdd67240571801a1d90d0236562c178707e5c37fb3ebe2"}, - {file = "griffe-0.36.4.tar.gz", hash = "sha256:7b5968f5cc6446637ed0d3ded9de07d6a928f10ccb24116b1dd843635bf1994a"}, + {file = "griffe-0.41.0-py3-none-any.whl", hash = "sha256:8aa7fc6eb00cb80af9c0198178c6b7110cb59fa2c5187bb13ea25eebbe4dd928"}, + {file = "griffe-0.41.0.tar.gz", hash = "sha256:850128c3198c18713eaf0a6cc8572e590a16b1965f72a4e871e66cf84740903f"}, ] [package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" [[package]] @@ -1342,31 +1472,31 @@ requests = ">=2.27.1,<3.0.0" [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 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"] @@ -1464,22 +1594,33 @@ qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = true +python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] + +[package.dependencies] +six = "*" + [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" @@ -1502,13 +1643,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -1553,28 +1694,28 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.7.1" +version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] [package.dependencies] importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -referencing = ">=0.28.0" +referencing = ">=0.31.0" [[package]] name = "kombu" -version = "5.3.2" +version = "5.3.5" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.2-py3-none-any.whl", hash = "sha256:b753c9cfc9b1e976e637a7cbc1a65d446a22e45546cd996ea28f932082b7dc9e"}, - {file = "kombu-5.3.2.tar.gz", hash = "sha256:0ba213f630a2cb2772728aef56ac6883dc3a2f13435e10048f6e97d48506dbbd"}, + {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, + {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, ] [package.dependencies] @@ -1586,14 +1727,14 @@ vine = "*" [package.extras] azureservicebus = ["azure-servicebus (>=7.10.0)"] azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] -confluentkafka = ["confluent-kafka (==2.1.1)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] consul = ["python-consul2"] librabbitmq = ["librabbitmq (>=2.0.0)"] mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack"] pyro = ["pyro4"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] @@ -1602,47 +1743,48 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] @@ -1688,71 +1830,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -1771,13 +1913,13 @@ traitlets = "*" [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] @@ -1835,17 +1977,18 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "0.5.0" +version = "1.0.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, - {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, + {file = "mkdocs_autorefs-1.0.0-py3-none-any.whl", hash = "sha256:2b6d288f0582589d1be7c99ce4470c8e7c5077892014051ff0d4ff574a73dbe8"}, + {file = "mkdocs_autorefs-1.0.0.tar.gz", hash = "sha256:1b20db41cade632b07b7a73dee818977b52e869c9deb438f6f20e2896ff01859"}, ] [package.dependencies] Markdown = ">=3.3" +markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] @@ -1872,13 +2015,13 @@ requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" -version = "1.2" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, - {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] @@ -1976,6 +2119,44 @@ server = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.4.0)" ssm = ["PyYAML (>=5.1)", "dataclasses"] xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] +[[package]] +name = "msal" +version = "1.27.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +optional = true +python-versions = ">=2.7" +files = [ + {file = "msal-1.27.0-py2.py3-none-any.whl", hash = "sha256:572d07149b83e7343a85a3bcef8e581167b4ac76befcbbb6eef0c0e19643cdc0"}, + {file = "msal-1.27.0.tar.gz", hash = "sha256:3109503c038ba6b307152b0e8d34f98113f2e7a78986e28d0baf5b5303afda52"}, +] + +[package.dependencies] +cryptography = ">=0.6,<45" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.13.2,<0.15)"] + +[[package]] +name = "msal-extensions" +version = "1.1.0" +description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." +optional = true +python-versions = ">=3.7" +files = [ + {file = "msal-extensions-1.1.0.tar.gz", hash = "sha256:6ab357867062db7b253d0bd2df6d411c7891a0ee7308d54d1e4317c1d1c54252"}, + {file = "msal_extensions-1.1.0-py3-none-any.whl", hash = "sha256:01be9711b4c0b1a151450068eeb2c4f0997df3bba085ac299de3a66f585e382f"}, +] + +[package.dependencies] +msal = ">=0.4.1,<2.0.0" +packaging = "*" +portalocker = [ + {version = ">=1.0,<3", markers = "platform_system != \"Windows\""}, + {version = ">=1.6,<3", markers = "platform_system == \"Windows\""}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -1989,18 +2170,18 @@ files = [ [[package]] name = "nautobot" -version = "2.0.0" +version = "2.1.5" description = "Source of truth and network automation platform." optional = false python-versions = ">=3.8,<3.12" files = [ - {file = "nautobot-2.0.0-py3-none-any.whl", hash = "sha256:71a1adb2a7a7fcd6df9da131f950f2d1ea397dfefba4cd8c8c85978f0a1d1f7a"}, - {file = "nautobot-2.0.0.tar.gz", hash = "sha256:2e319fafb33f4f3c7638e067c2ffeab89a521ca60a7b889cdbc95472baf3389e"}, + {file = "nautobot-2.1.5-py3-none-any.whl", hash = "sha256:62ab0115349f7c75c675f93324644e519d5fde5dd0c7ed3baa40a1c20d45118a"}, + {file = "nautobot-2.1.5.tar.gz", hash = "sha256:4c36d03592210c17bc899dd9cfcb05c26ad720727e6869d928540611aefa2f55"}, ] [package.dependencies] celery = ">=5.3.1,<5.4.0" -Django = ">=3.2.20,<3.3.0" +Django = ">=3.2.24,<3.3.0" django-ajax-tables = ">=1.1.1,<1.2.0" django-celery-beat = ">=2.5.0,<2.6.0" django-celery-results = ">=2.4.0,<2.5.0" @@ -2013,38 +2194,40 @@ django-health-check = ">=3.17.0,<3.18.0" django-jinja = ">=2.10.2,<2.11.0" django-prometheus = ">=2.3.1,<2.4.0" django-redis = ">=5.3.0,<5.4.0" +django-silk = ">=5.1.0,<5.2.0" django-tables2 = ">=2.6.0,<2.7.0" django-taggit = ">=4.0.0,<4.1.0" django-timezone-field = ">=5.1,<5.2" -django-tree-queries = ">=0.15.0,<0.16.0" +django-tree-queries = ">=0.16.1,<0.17.0" django-webserver = ">=1.2.0,<1.3.0" djangorestframework = ">=3.14.0,<3.15.0" drf-react-template-framework = ">=0.0.17,<0.0.18" drf-spectacular = {version = "0.26.3", extras = ["sidecar"]} emoji = ">=2.8.0,<2.9.0" -GitPython = ">=3.1.36,<3.2.0" +GitPython = ">=3.1.41,<3.2.0" graphene-django = ">=2.16.0,<2.17.0" graphene-django-optimizer = ">=0.8.0,<0.9.0" -Jinja2 = ">=3.1.2,<3.2.0" +Jinja2 = ">=3.1.3,<3.2.0" jsonschema = ">=4.7.0,<4.19.0" Markdown = ">=3.3.7,<3.4.0" -MarkupSafe = ">=2.1.3,<2.2.0" +MarkupSafe = ">=2.1.5,<2.2.0" netaddr = ">=0.8.0,<0.9.0" netutils = ">=1.6.0,<2.0.0" -packaging = ">=23.1,<23.2" -Pillow = ">=10.0.0,<10.1.0" +nh3 = ">=0.2.15,<0.3.0" +packaging = ">=23.1" +Pillow = ">=10.2.0,<10.3.0" prometheus-client = ">=0.17.1,<0.18.0" -psycopg2-binary = ">=2.9.6,<2.10.0" -python-slugify = ">=8.0.1,<8.1.0" -pyuwsgi = ">=2.0.21,<2.1.0" +psycopg2-binary = ">=2.9.9,<2.10.0" +python-slugify = ">=8.0.3,<8.1.0" +pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" social-auth-app-django = ">=5.2.0,<5.3.0" svgwrite = ">=1.4.2,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.3.0,<4.4.0)", "django-storages (>=1.13.2,<1.14.0)", "mysqlclient (>=2.2.0,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] +all = ["django-auth-ldap (>=4.3.0,<4.4.0)", "django-storages (>=1.13.2,<1.14.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] ldap = ["django-auth-ldap (>=4.3.0,<4.4.0)"] -mysql = ["mysqlclient (>=2.2.0,<2.3.0)"] +mysql = ["mysqlclient (>=2.2.3,<2.3.0)"] napalm = ["napalm (>=4.1.0,<4.2.0)"] remote-storage = ["django-storages (>=1.13.2,<1.14.0)"] sso = ["social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] @@ -2074,6 +2257,31 @@ files = [ [package.extras] optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] +[[package]] +name = "nh3" +version = "0.2.15" +description = "Python bindings to the ammonia HTML sanitization library." +optional = false +python-versions = "*" +files = [ + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, + {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, + {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, + {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, +] + [[package]] name = "oauthlib" version = "3.2.2" @@ -2092,13 +2300,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -2118,24 +2326,24 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pbr" -version = "5.11.1" +version = "6.0.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, - {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, ] [[package]] @@ -2165,70 +2373,88 @@ files = [ [[package]] name = "pillow" -version = "10.0.1" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pkgutil-resolve-name" @@ -2243,18 +2469,37 @@ files = [ [[package]] name = "platformdirs" -version = "3.10.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "portalocker" +version = "2.8.2" +description = "Wraps the portalocker recipe for easy usage" +optional = true +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] [[package]] name = "prometheus-client" @@ -2288,13 +2533,13 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -2302,71 +2547,83 @@ wcwidth = "*" [[package]] name = "psycopg2-binary" -version = "2.9.8" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "psycopg2-binary-2.9.8.tar.gz", hash = "sha256:80451e6b6b7c486828d5c7ed50769532bbb04ec3a411f1e833539d5c10eb691c"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e271ad6692d50d70ca75db3bd461bfc26316de78de8fe1f504ef16dcea8f2312"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ae22a0fa5c516b84ddb189157fabfa3f12eded5d630e1ce260a18e1771f8707"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a971086db0069aef2fd22ccffb670baac427f4ee2174c4f5c7206254f1e6794"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b6928a502af71ca2ac9aad535e78c8309892ed3bfa7933182d4c760580c8af4"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f955fe6301b84b6fd13970a05f3640fbb62ca3a0d19342356585006c830e038"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3723c3f009e2b2771f2491b330edb7091846f1aad0c08fbbd9a1383d6a0c0841"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e3142c7e51b92855cff300580de949e36a94ab3bfa8f353b27fe26535e9b3542"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:de85105c568dc5f0f0efe793209ba83e4675d53d00faffc7a7c7a8bea9e0e19a"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c7ff2b6a79a92b1b169b03bb91b41806843f0cdf6055256554495bffed1d496d"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59f45cca0765aabb52a5822c72d5ff2ec46a28b1c1702de90dc0d306ec5c2001"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-win32.whl", hash = "sha256:1dbad789ebd1e61201256a19dc2e90fed4706bc966ccad4f374648e5336b1ab4"}, - {file = "psycopg2_binary-2.9.8-cp310-cp310-win_amd64.whl", hash = "sha256:15458c81b0d199ab55825007115f697722831656e6477a427783fe75c201c82b"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:395c217156723fe21809dfe8f7a433c5bf8e9bce229944668e4ec709c37c5442"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:14f85ff2d5d826a7ce9e6c31e803281ed5a096789f47f52cb728c88f488de01b"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e11373d8e4f1f46cf3065bf613f0df9854803dc95aa4a35354ffac19f8c52127"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01f9731761f711e42459f87bd2ad5d744b9773b5dd05446f3b579a0f077e78e3"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bf5c27bd5867a5fa5341fad29f0d5838e2fed617ef5346884baf8b8b16dd82"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfabbd7e70785af726cc0209e8e64b926abf91741eca80678b221aad9e72135"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6369f4bd4d27944498094dccced1ae7ca43376a59dbfe4c8b6a16e9e3dc3ccce"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4879ee1d07a6b2c232ae6a74570f4788cd7a29b3cd38bc39bf60225b1d075c78"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4336afc0e81726350bd5863e3c3116d8c12aa7f457d3d0b3b3dc36137fec6feb"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63ce1dccfd08d9c5341ac82d62aa04345bc4bf41b5e5b7b2c6c172a28e0eda27"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-win32.whl", hash = "sha256:59421806c1a0803ea7de9ed061d656c041a84db0da7e73266b98db4c7ba263da"}, - {file = "psycopg2_binary-2.9.8-cp311-cp311-win_amd64.whl", hash = "sha256:ccaa2ae03990cedde1f618ff11ec89fefa84622da73091a67b44553ca8be6711"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5aa0c99c12075c593dcdccbb8a7aaa714b716560cc99ef9206f9e75b77520801"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91719f53ed2a95ebecefac48d855d811cba9d9fe300acc162993bdfde9bc1c3b"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c68a2e1afb4f2a5bb4b7bb8f90298d21196ac1c66418523e549430b8c4b7cb1e"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278ebd63ced5a5f3af5394cb75a9a067243eee21f42f0126c6f1cf85eaeb90f9"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c84ff9682bc4520504c474e189b3de7c4a4029e529c8b775e39c95c33073767"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6f5e70e40dae47a4dc7f8eb390753bb599b0f4ede314580e6faa3b7383695d19"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:673eafbdaa4ed9f5164c90e191c3895cc5f866b9b379fdb59f3a2294e914d9bd"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5a0a6e4004697ec98035ff3b8dfc4dba8daa477b23ee891d831cd3cd65ace6be"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d29efab3c5d6d978115855a0f2643e0ee8c6450dc536d5b4afec6f52ab99e99e"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-win32.whl", hash = "sha256:d4a19a3332f2ac6d093e60a6f1c589f97eb9f9de7e27ea80d67f188384e31572"}, - {file = "psycopg2_binary-2.9.8-cp37-cp37m-win_amd64.whl", hash = "sha256:5262713988d97a9d4cd54b682dec4a413b87b76790e5b16f480450550d11a8f7"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e46b0f4683539965ce849f2c13fc53e323bb08d84d4ba2e4b3d976f364c84210"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3fd44b52bc9c74c1512662e8da113a1c55127adeeacebaf460babe766517b049"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6c607ecb6a9c245ebe162d63ccd9222d38efa3c858bbe38d32810b08b8f87e"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6ef615d48fa60361e57f998327046bd89679c25d06eee9e78156be5a7a76e03"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65403113ac3a4813a1409fb6a1e43c658b459cc8ed8afcc5f4baf02ec8be4334"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debcb23a052f3fb4c165789ea513b562b2fac0f0f4f53eaf3cf4dc648907ff8"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dc145a241e1f6381efb924bcf3e3462d6020b8a147363f9111eb0a9c89331ad7"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1d669887df169a9b0c09e0f5b46891511850a9ddfcde3593408af9d9774c5c3a"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:19d40993701e39c49b50e75cd690a6af796d7e7210941ee0fe49cf12b25840e5"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b8b2cdf3bce4dd91dc035fbff4eb812f5607dda91364dc216b0920b97b521c7"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-win32.whl", hash = "sha256:4960c881471ca710b81a67ef148c33ee121c1f8e47a639cf7e06537fe9fee337"}, - {file = "psycopg2_binary-2.9.8-cp38-cp38-win_amd64.whl", hash = "sha256:aeb09db95f38e75ae04e947d283e07be34d03c4c2ace4f0b73dbb9143d506e67"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5aef3296d44d05805e634dbbd2972aa8eb7497926dd86047f5e39a79c3ecc086"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d6b592ecc8667e608b9e7344259fbfb428cc053df0062ec3ac75d8270cd5a9f"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:693a4e7641556f0b421a7d6c6a74058aead407d860ac1cb9d0bf25be0ca73de8"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf60c599c40c266a01c458e9c71db7132b11760f98f08233f19b3e0a2153cbf1"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cbe1e19f59950afd66764e3c905ecee9f2aee9f8df2ef35af6f7948ad93f620"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc37de7e3a87f5966965fc874d33c9b68d638e6c3718fdf32a5083de563428b0"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6e1bb4eb0d9925d65dabaaabcbb279fab444ba66d73f86d4c07dfd11f0139c06"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e7bdc94217ae20ad03b375a991e107a31814053bee900ad8c967bf82ef3ff02e"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:565edaf9f691b17a7fdbabd368b5b3e67d0fdc8f7f6b52177c1d3289f4e763fd"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0e3071c947bda6afc6fe2e7b64ebd64fb2cad1bc0e705a3594cb499291f2dfec"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-win32.whl", hash = "sha256:205cecdd81ff4f1ddd687ce7d06879b9b80cccc428d8d6ebf36fcba08bb6d361"}, - {file = "psycopg2_binary-2.9.8-cp39-cp39-win_amd64.whl", hash = "sha256:1f279ba74f0d6b374526e5976c626d2ac3b8333b6a7b08755c513f4d380d3add"}, + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, ] [[package]] @@ -2396,13 +2653,13 @@ tests = ["pytest"] [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.9.1" description = "Python style guide checker" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, ] [[package]] @@ -2418,28 +2675,29 @@ files = [ [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.5.0" description = "passive checker of Python programs" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyhcl" @@ -2463,6 +2721,9 @@ files = [ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] @@ -2471,17 +2732,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "2.17.6" +version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" files = [ - {file = "pylint-2.17.6-py3-none-any.whl", hash = "sha256:18a1412e873caf8ffb56b760ce1b5643675af23e6173a247b502406b24c716af"}, - {file = "pylint-2.17.6.tar.gz", hash = "sha256:be928cce5c76bf9acdc65ad01447a1e0b1a7bccffc609fb7fc40f2513045bd05"}, + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, ] [package.dependencies] -astroid = ">=2.15.7,<=2.17.0-dev0" +astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -2500,22 +2761,21 @@ testutils = ["gitpython (>3)"] [[package]] name = "pylint-django" -version = "2.5.3" +version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" optional = false -python-versions = "*" +python-versions = ">=3.7,<4.0" files = [ - {file = "pylint-django-2.5.3.tar.gz", hash = "sha256:0ac090d106c62fe33782a1d01bda1610b761bb1c9bf5035ced9d5f23a13d8591"}, - {file = "pylint_django-2.5.3-py3-none-any.whl", hash = "sha256:56b12b6adf56d548412445bd35483034394a1a94901c3f8571980a13882299d5"}, + {file = "pylint_django-2.5.5-py3-none-any.whl", hash = "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7"}, + {file = "pylint_django-2.5.5.tar.gz", hash = "sha256:2f339e4bf55776958283395c5139c37700c91bd5ef1d8251ef6ac88b5abbba9b"}, ] [package.dependencies] -pylint = ">=2.0,<3" -pylint-plugin-utils = ">=0.7" +pylint = ">=2.0,<4" +pylint-plugin-utils = ">=0.8" [package.extras] -for-tests = ["coverage", "django-tables2", "django-tastypie", "factory-boy", "pylint (>=2.13)", "pytest", "wheel"] -with-django = ["Django"] +with-django = ["Django (>=2.2)"] [[package]] name = "pylint-nautobot" @@ -2550,13 +2810,13 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.3" +version = "10.4" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, - {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, + {file = "pymdown_extensions-10.4-py3-none-any.whl", hash = "sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037"}, + {file = "pymdown_extensions-10.4.tar.gz", hash = "sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35"}, ] [package.dependencies] @@ -2618,13 +2878,13 @@ six = ">=1.5" [[package]] name = "python-slugify" -version = "8.0.1" +version = "8.0.4" description = "A Python slugify application that also handles Unicode" optional = false python-versions = ">=3.7" files = [ - {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, - {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, ] [package.dependencies] @@ -2667,65 +2927,88 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" 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"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] name = "pyuwsgi" -version = "2.0.22" +version = "2.0.23.post0" description = "The uWSGI server" optional = false python-versions = "*" files = [ - {file = "pyuwsgi-2.0.22-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b55e897318af6a4d993fc0ae21d714c3bc7b799c605bf89d9664f2e24b661fe6"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59c8b3a449999b9facb00d829d4f0558e8aa205b931214779285e7f2291d4c0b"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d7fa03dd3bc0639c918d071288f7b155867ab78c34852b8c596723bbf250920"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:883a91c6dbde362910a23f22e08fab0f1291cf00b5f3f30d9fbbcb778fcd2579"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bc5b33c33d3de6a15d569c80b8f78e1f131ccaf0bfdb35c51e8589df8a10191f"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ba47ebba2db5f4937ba9324c54ad02810408120059c766c849e54a1cfee90c6"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6f91278a833a0684269489115e1b381af2973d5563040e3cabd019703f25256"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:57132d305690b15e80742692021fba9fb16c5681329ee67639d99b3f37fbf828"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697913cb027faf6018ce477c44a2f51c5664f8fbd15e55de0ab0fabdcc522e5a"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b398d7e477aae52dfde03df294bb36fee6628da7a4a0ffc0c08af5a359fceb2c"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:820ef76fa84f8a412bfd67d68ec4739994f9c056937629c5f71e1844ed702cbc"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5cfa678ea5c836425539f39d284a26ba1a51e28a72653a9e940059db569a9d23"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e458e9625868301bbca768f26a067b5a5cb4b41501ddebe6d473c78395765cb"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b4f993181fd61858934c80a1467a67c8e99bf18335e7bda54a45bd66c07312b6"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:097224803e580c9ed1ae3a85cb50de55fccac300c0b6e1fee2e8a2519a51c29c"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa57f1e76b4bca45178810031667f89dd5e44714647e7ca18e1b0cc85f8730f8"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:435981fe542452afd5c52e8206ca2487a6b2c9c6696bd0d756f4fff898f46928"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe68513a26fcc56151a44cea8e78ba412793806fb84260c8f0e2319d43def235"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62fc4888caa104960245bcaa69220c15aa9bbc4bdeaa05ac9333777a4f4c7a7d"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:dcaa03376f77c438eb54fcbea51274e58f474165a8a08a0ca6562a864c08dfa8"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f80682b4419fdb85376c3e7b591b6512983ac09e28270f362eaab92238cfbf88"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad6363b4d70a63a0954f9d0b802282861b683c13537493a4053d1160b93c0f8c"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5e008fd88f5f79dd22463339fa90ac2e2d4a1c4698fb09ac9dc3efc8268d7a"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6f8f67ab1f87188f33f30f2d1e77c02ea3132f7e36be0f9201f22522c7828e9"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc35750a0969c129832af169867a7d6ad3e20ddd240a8fa4975fec0d996ea463"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1b7ad28d8ad5277ffa95102ec21e0651c68becce90655fdc51d033991c125fbe"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:24823dcf6fadabeb4c15a8bff8de8796441db095033c9036854bae17194809e2"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5d19e11fc8cf9d90b837484755690338110fdc7e38bf62a21fe2c066d2ca4315"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8da89b3ece90eceda36996601835b066edf4dae4d5b7a194e5ddea3e021009c"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41f5bcacea5c1c3e4a6def1cd229535a2789e884e7a26471b1dbc3afea35e682"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0d8788294d9ff207e572d7e7d04e2e3b8fd6d118c285177ab0c7d1f0d65588e"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f142c633a33906fa82a1a9afbeedd743402a513e9e2b6b38463b54fd8bed1d0"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2ec41159a30d5ef93c47ea4a211771d3d5a5d769b97c314af2129cb777aeb318"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dbc9ef80f3ddeea0225ac7f03165474d49162816982835d186ef820616fdc06f"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfc96fc6fa3173480f6f4148c2152eac256e1979420a6feb25232dbc3a4026e9"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:afaca18a6b7dcf51a9da5c7d88276206dcda10ed693f5e61b4d4607c0c130a1b"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e337758df2d715a505d7d3d39cfde2ce68a2dc9bee51016a3126151151cc5d97"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248e5358eb04caff4d9e035d35e47d761c38a9f834fb72e31c1bd50347dac599"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f0fd3fa83e58f05ebddb8ffbb2c91da1b8a921f447c3f22f580f5dabef1d4f"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26debc953203f23ac7609628565ec4aa186bfc7ed1fc34e7d664ca65e33e1765"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:55d6845135c615d648d857b6e5e9bc3d891d46e8170bce4a4682df47ef8b54c4"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ec1c38976c781374b630f2f9a5e224da039c29432afdc00cfca02f99e24ffa4e"}, - {file = "pyuwsgi-2.0.22.tar.gz", hash = "sha256:bed58e94ee0e497622d774c440c71bf6c472ad98cfedb934d0b14179f02e4adf"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49dfe43726f4a71d3440f7a36eb3ba5b361e04807164d34ececda138e2dc2375"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65420b185003dd5b66f41a6d1aa03d63d953a18e818bd4a013fc8e9d580f11cb"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bc7c60d8e1242b3a638754d2487c505112c642010c460442993be85f3ca9ec7"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ae2abaa47cb9c0018c790935897aec8001fb709dfac54286a37ab2e0b88dca"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:af376cafca1501b2d4b8184c427c55b32c1a3dcb6070dc27115ca552898c7ff8"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f56a729808ed7aa1d7973d6f900a75bc36b976b7ab6c8867064f36e34cdafd4e"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4270e68bb2633b0fc132aad6d415e4e0cde67093a97e64dd84bd186264a8c083"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97c940a69242dc45658dba3330e64d809f34e33d9631547b6928fd20075b4bb9"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cac396c2e8e0d199bde9bb8fc90538c82207d0c3d722d08b9a63619b41945d6"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59d6a718ad42be54b2b80c8c236b728b8b83fb93438786e95f63fc259229ccd7"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38b5bb59e1bf59030f2d43a3e67aa18e6089c8e7f43e9c5f2099567466d35f4"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7199009447770812056a5b417c4847bd44db1b0230d4bb64c48a4ffacd4e96f0"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f361d168cf175796fe36ab6a88dee079245a2f08e587e8190a38bd1b33238fa8"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:52a45e98fe746ae9c9437c5b6f0cdb6117f979c8800f09c8e4dae2997786affd"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7455976abfa1dd43b5f3376f7f04a925c16babba1c3fc6edcdd81f5c0f24383"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508f5d84cd677cecc640d0e321badc61080c40c61843cd130b32f356729a599f"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcf93afec49f5cf29b0a68f4d2fb3e44a3ad1f205704ab2f41f9db47dacb8e13"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19ab0d5c43bc179a70cb079feb7804e39be6326bf98ec38808fcea5e7d44bd0"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8c5283e38c4fd3130cd7384d57535d60435c63b81a41a6463f26f340efeda9de"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0d9dfb79bffa552e5985385bc114ecec1d4079b95ce24796f577ef0df727da06"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b531ac80155b6c839215d05f95569b34e614e97aab055072c74112b1d2a45546"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eae183104f3fa26f3d9c28fe75f2ad914e3a365103a6a66e329c0f59f9e461d4"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a34ab2863ff0120c6e0e75c63c9ced462bfb4777e6b8237e4e1df60fb34af51"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc18481f336be63e80fc983aaa1a040e7c69c25c3145edcf93f0e6de2f1ad0d6"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245da016b424c261d148bbb83d2407aac77e6d5793cbd4e23a17f7e3a8aa061f"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8de1d975be958cff9122ecc82bf393bf7f41fff6f1047e76ed972047763bbd31"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d75859311605a510a6050ec622ec4beb9f2f8cce5f090e5cea70a1ff74133f8b"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d3ad00212ffbb208b7146744ad3710b908734f844b5e2bf533fb09fc44726f37"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:374142b106de187c4572b4441a367fa3466d9ea5aaabe475da42bb9f2202a690"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:137db348bd5f585e8e5a609046d3ac9ef58483bba93de1e3c568c1a860c31b9c"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52b7a837dbc8702b245481514a32c88418a42df7b5ee68d45695eba457abd3ee"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcfeb1eaca5f4dd0e6ed9194e7ec98dcb3a8ac108e8f0414ed7c28d608517ef"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7887c2acc8262223ff9cdce974851da0917818c12ef3ec0f49ec11a9943731fe"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bae72689ddf8e0bdd1a974a364ed052dd19d7897f1d5c3efcf8d9010c60f56ef"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9565569474f9e9f02f6fa490d96d8c5c7e3004829c01c0446cdb74c618b6a433"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6ba86c6aa815635eefe7728b9b219af281a4e956bab240c5871db6c151c300a8"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ab8a02e812fbc34026ddb79f274a574c96fc488f384f320d3af37bd7edf932"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f9c0694a11d8dfbbe2814b8b242a7c4dfa143b63e01447fabce9966a90fa60"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75e45e14462cbb94fc32242378eef7bda97173de57a68a5d46e4053677a7547"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e7140fc3548cd9d0f02c4511b679ba47d26593d2cceb249d2d147c9901d90022"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ed348cc4c5a4964c8e8fa61ab0ef50c00f7676179a6c0cb0f55f0122db1db1c2"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17a8818ec98f92e7935cf0ff56ed4f02a069362e10554df969f70fcdf78d9199"}, + {file = "pyuwsgi-2.0.23.post0.tar.gz", hash = "sha256:04ec79c4a3acad21002ebf1479050c3208605d27cc6659008df51092951eeb8e"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = true +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] [[package]] @@ -2740,7 +3023,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2748,16 +3030,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2774,7 +3048,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2782,7 +3055,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2822,13 +3094,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.30.2" +version = "0.33.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, - {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, + {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, + {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, ] [package.dependencies] @@ -2837,99 +3109,104 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.8.8" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] @@ -3011,13 +3288,13 @@ tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asy [[package]] name = "rich" -version = "13.5.3" +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.5.3-py3-none-any.whl", hash = "sha256:9257b468badc3d347e146a4faa268ff229039d4c2d176ab0cffb4c4fbc73d5d9"}, - {file = "rich-13.5.3.tar.gz", hash = "sha256:87b43e0543149efa1253f485cd845bb7ee54df16c9617b8a893650ab84b4acb6"}, + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, ] [package.dependencies] @@ -3030,108 +3307,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.10.3" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.10.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e"}, - {file = "rpds_py-0.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e"}, - {file = "rpds_py-0.10.3-cp310-none-win32.whl", hash = "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391"}, - {file = "rpds_py-0.10.3-cp310-none-win_amd64.whl", hash = "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff"}, - {file = "rpds_py-0.10.3-cp311-none-win32.whl", hash = "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48"}, - {file = "rpds_py-0.10.3-cp311-none-win_amd64.whl", hash = "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b"}, - {file = "rpds_py-0.10.3-cp38-none-win32.whl", hash = "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1"}, - {file = "rpds_py-0.10.3-cp38-none-win_amd64.whl", hash = "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1"}, - {file = "rpds_py-0.10.3-cp39-none-win32.whl", hash = "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065"}, - {file = "rpds_py-0.10.3-cp39-none-win_amd64.whl", hash = "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599"}, - {file = "rpds_py-0.10.3.tar.gz", hash = "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] @@ -3241,29 +3520,28 @@ social-auth-core = ">=4.4.1" [[package]] name = "social-auth-core" -version = "4.4.2" +version = "4.5.3" description = "Python social authentication made simple." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "social-auth-core-4.4.2.tar.gz", hash = "sha256:9791d7c7aee2ac8517fe7a2ea2f942a8a5492b3a4ccb44a9b0dacc87d182f2aa"}, - {file = "social_auth_core-4.4.2-py3-none-any.whl", hash = "sha256:ea7a19c46b791b767e95f467881b53c5fd0d1efb40048d9ed3dbc46daa05c954"}, + {file = "social-auth-core-4.5.3.tar.gz", hash = "sha256:9d9b51b7ce2ccd0b7139e6b7f52a32cb922726de819fb13babe35f12ae89852a"}, + {file = "social_auth_core-4.5.3-py3-none-any.whl", hash = "sha256:8d16e66eb97bb7be43a023d6efa16628cdc94cefd8d8053930c98a0f676867e7"}, ] [package.dependencies] cryptography = ">=1.4" defusedxml = ">=0.5.0rc1" oauthlib = ">=1.0.3" -PyJWT = ">=2.0.0" +PyJWT = ">=2.7.0" python3-openid = ">=3.0.10" requests = ">=2.9.1" requests-oauthlib = ">=0.6.1" [package.extras] -all = ["cryptography (>=2.1.1)", "python-jose (>=3.0.0)", "python3-saml (>=1.5.0)"] -allpy3 = ["cryptography (>=2.1.1)", "python-jose (>=3.0.0)", "python3-saml (>=1.5.0)"] +all = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] +allpy3 = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] azuread = ["cryptography (>=2.1.1)"] -openidconnect = ["python-jose (>=3.0.0)"] saml = ["python3-saml (>=1.5.0)"] [[package]] @@ -3303,13 +3581,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "stevedore" -version = "5.1.0" +version = "5.2.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, - {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, + {file = "stevedore-5.2.0-py3-none-any.whl", hash = "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9"}, + {file = "stevedore-5.2.0.tar.gz", hash = "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d"}, ] [package.dependencies] @@ -3375,13 +3653,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.4" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, ] [[package]] @@ -3423,24 +3701,24 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" 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"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -3456,65 +3734,67 @@ files = [ [[package]] name = "urllib3" -version = "1.26.16" +version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "vine" -version = "5.0.0" -description = "Promises, promises, promises." +version = "5.1.0" +description = "Python promises." optional = false python-versions = ">=3.6" files = [ - {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, - {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, + {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, + {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, ] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] @@ -3522,13 +3802,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.7" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.7-py2.py3-none-any.whl", hash = "sha256:fabf3e32999d9b0dab7d19d845149f326f04fe29bac67709ee071dbd92640a36"}, - {file = "wcwidth-0.2.7.tar.gz", hash = "sha256:1b6d30a98ddd5ce9bbdb33658191fd2423fc9da203fe3ef1855407dcb7ee4e26"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -3548,88 +3828,97 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wheel" +version = "0.42.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] @@ -3645,13 +3934,13 @@ files = [ [[package]] name = "yamllint" -version = "1.32.0" +version = "1.35.1" description = "A linter for YAML files." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "yamllint-1.32.0-py3-none-any.whl", hash = "sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7"}, - {file = "yamllint-1.32.0.tar.gz", hash = "sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a"}, + {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, + {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] @@ -3677,8 +3966,9 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -all = ["boto3", "hvac", "python-tss-sdk"] +all = ["azure-identity", "azure-keyvault-secrets", "boto3", "hvac", "python-tss-sdk"] aws = ["boto3"] +azure = ["azure-identity", "azure-keyvault-secrets"] hashicorp = ["hvac"] nautobot = ["nautobot"] thycotic = ["python-tss-sdk"] @@ -3686,4 +3976,4 @@ thycotic = ["python-tss-sdk"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "778aa31d640036f5e9b0cdda10add84f8fa425aeea14126070ba1227b88932be" +content-hash = "82ba0e3552b9e10cbe8d2dcd4ae95279e7acc1ccb5a77d6dd878bf09bd787ce1" diff --git a/pyproject.toml b/pyproject.toml index 0797950..811f02f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,10 +27,13 @@ include = [ ] [tool.poetry.dependencies] +python = ">=3.8,<3.12" +# Used for local development +nautobot = "^2.0.0" +azure-identity = { version = "^1.15.0", optional = true } +azure-keyvault-secrets = { version = "^4.8.0", optional = true } boto3 = { version = "~1.19.5", optional = true } hvac = { version = ">=0.11.0, <1.1.0", optional = true } -nautobot = "^2.0.0" -python = ">=3.8,<3.12" python-tss-sdk = {version = "~1.2.0", optional = true} [tool.poetry.group.dev.dependencies] @@ -66,11 +69,14 @@ requests-mock = "1.9.3" [tool.poetry.extras] all = [ + "azure-identity", + "azure-keyvault-secrets", "boto3", "hvac", "python-tss-sdk", ] aws = ["boto3"] +azure = ["azure-identity", "azure-keyvault-secrets"] hashicorp = ["hvac"] nautobot = ["nautobot"] thycotic = ["python-tss-sdk"] diff --git a/tasks.py b/tasks.py index 6c08350..9680a6d 100644 --- a/tasks.py +++ b/tasks.py @@ -519,9 +519,11 @@ def import_db(context, db_name="", input_file="dump.sql"): '--execute="', f"DROP DATABASE IF EXISTS {db_name};", f"CREATE DATABASE {db_name};", - "" - if db_name == "$MYSQL_DATABASE" - else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;", + ( + "" + if db_name == "$MYSQL_DATABASE" + else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;" + ), '"', "&&", "mysql", From 58dccefe3ba88936d5199a192da4a8048c7fc948 Mon Sep 17 00:00:00 2001 From: Steven Weiblinger <111259311+DistantVoyager@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:12:53 -0400 Subject: [PATCH 09/11] Housekeeping and Docs Cleanup (#134) * Doc fixes * Various renaming and cleanup * Added old release notes * Change fragments * Additional docs * Updated screenshots * Update changes/134.removed Co-authored-by: Glenn Matthews * Fixed __all__ line for disabled pylint rule * Disable pylint rule for invalid name * Updated release notes * Update mkdocs nav * Added 0001 migration * Formatting * Added migration reverse code * Update 0001_update_thycotic_delinea_slug.py * Update 0001_update_thycotic_delinea_slug.py --------- Co-authored-by: Glenn Matthews --- .cookiecutter.json | 6 +- CHANGELOG.md | 85 - README.md | 61 +- changes/134.added | 3 + changes/134.changed | 6 + changes/134.removed | 2 + development/creds.example.env | 56 +- development/nautobot_config.py | 29 +- docs/admin/install.md | 134 +- docs/admin/providers/aws_setup.md | 31 + docs/admin/providers/azure_setup.md | 30 + docs/admin/providers/delinea_setup.md | 43 + docs/admin/providers/hashicorp_setup.md | 29 + docs/admin/providers/index.md | 8 + docs/admin/release_notes/index.md | 3 + docs/admin/release_notes/version_1.0.md | 15 + docs/admin/release_notes/version_1.1.md | 13 + docs/admin/release_notes/version_1.2.md | 14 + docs/admin/release_notes/version_1.3.md | 29 + docs/admin/release_notes/version_1.4.md | 29 + docs/admin/release_notes/version_2.0.md | 28 + docs/admin/release_notes/version_3.0.md | 6 + docs/admin/uninstall.md | 3 - docs/admin/upgrade.md | 7 + docs/assets/favicon.ico | Bin 0 -> 15086 bytes docs/assets/nautobot_logo.png | Bin 0 -> 9204 bytes docs/assets/nautobot_logo.svg | 131 ++ docs/assets/networktocode_bw.png | Bin 0 -> 7562 bytes docs/assets/overrides/partials/copyright.html | 1 - docs/dev/code_reference/index.md | 3 + docs/dev/code_reference/package.md | 1 + docs/dev/code_reference/providers.md | 5 + docs/dev/extending.md | 3 + ...s-secrets-manager-secrets-provider-add.png | Bin 0 -> 23661 bytes .../azure-key-vault-secrets-provider-add.png | Bin 0 -> 20437 bytes .../delinea-id-secrets-provider-add.png | Bin 0 -> 20744 bytes .../delinea-path-secrets-provider-add.png | Bin 0 -> 22178 bytes .../hashicorp-vault-secrets-provider-add.png | Bin 0 -> 26665 bytes .../icon-nautobot-secrets-providers.png | Bin 0 -> 7993 bytes docs/images/screenshot01.png | Bin 58517 -> 0 bytes docs/images/screenshot02.png | Bin 19096 -> 0 bytes docs/images/screenshot03.png | Bin 61386 -> 0 bytes docs/images/screenshot04.png | Bin 82010 -> 0 bytes docs/images/screenshot05.png | Bin 44052 -> 0 bytes docs/images/screenshot06.png | Bin 45558 -> 0 bytes docs/images/secrets-list.png | Bin 0 -> 40863 bytes docs/images/secrets-providers-home.png | Bin 0 -> 22079 bytes .../secrets-providers-installed-apps.png | Bin 0 -> 38131 bytes docs/index.md | 40 +- docs/user/app_getting_started.md | 15 + docs/user/app_overview.md | 18 + docs/user/app_use_cases.md | 35 + docs/user/faq.md | 1 + mkdocs.yml | 28 +- nautobot_secrets_providers/__init__.py | 2 +- .../0001_update_thycotic_delinea_slug.py | 24 + .../migrations/__init__.py | 0 .../providers/__init__.py | 16 +- .../providers/choices.py | 6 +- .../providers/delinea.py | 102 +- nautobot_secrets_providers/secrets.py | 3 +- .../nautobot_secrets_providers/home.html | 18 +- poetry.lock | 1525 ++++++++--------- pyproject.toml | 2 +- tasks.py | 2 +- 65 files changed, 1406 insertions(+), 1245 deletions(-) delete mode 100644 CHANGELOG.md create mode 100644 changes/134.added create mode 100644 changes/134.changed create mode 100644 changes/134.removed create mode 100644 docs/admin/providers/aws_setup.md create mode 100644 docs/admin/providers/azure_setup.md create mode 100644 docs/admin/providers/delinea_setup.md create mode 100644 docs/admin/providers/hashicorp_setup.md create mode 100644 docs/admin/providers/index.md create mode 100644 docs/admin/release_notes/index.md create mode 100644 docs/admin/release_notes/version_1.0.md create mode 100644 docs/admin/release_notes/version_1.1.md create mode 100644 docs/admin/release_notes/version_1.2.md create mode 100644 docs/admin/release_notes/version_1.3.md create mode 100644 docs/admin/release_notes/version_1.4.md create mode 100644 docs/admin/release_notes/version_2.0.md create mode 100644 docs/admin/release_notes/version_3.0.md create mode 100644 docs/admin/upgrade.md create mode 100644 docs/assets/favicon.ico create mode 100644 docs/assets/nautobot_logo.png create mode 100644 docs/assets/nautobot_logo.svg create mode 100644 docs/assets/networktocode_bw.png create mode 100644 docs/dev/code_reference/index.md create mode 100644 docs/dev/code_reference/package.md create mode 100644 docs/dev/code_reference/providers.md create mode 100644 docs/dev/extending.md create mode 100644 docs/images/aws-secrets-manager-secrets-provider-add.png create mode 100644 docs/images/azure-key-vault-secrets-provider-add.png create mode 100644 docs/images/delinea-id-secrets-provider-add.png create mode 100644 docs/images/delinea-path-secrets-provider-add.png create mode 100644 docs/images/hashicorp-vault-secrets-provider-add.png create mode 100644 docs/images/icon-nautobot-secrets-providers.png delete mode 100644 docs/images/screenshot01.png delete mode 100644 docs/images/screenshot02.png delete mode 100644 docs/images/screenshot03.png delete mode 100644 docs/images/screenshot04.png delete mode 100644 docs/images/screenshot05.png delete mode 100644 docs/images/screenshot06.png create mode 100644 docs/images/secrets-list.png create mode 100644 docs/images/secrets-providers-home.png create mode 100644 docs/images/secrets-providers-installed-apps.png create mode 100644 docs/user/app_getting_started.md create mode 100644 docs/user/app_overview.md create mode 100644 docs/user/app_use_cases.md create mode 100644 docs/user/faq.md create mode 100644 nautobot_secrets_providers/migrations/0001_update_thycotic_delinea_slug.py create mode 100644 nautobot_secrets_providers/migrations/__init__.py diff --git a/.cookiecutter.json b/.cookiecutter.json index 5067585..60025f8 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -1,11 +1,11 @@ { "cookiecutter": { - "codeowner_github_usernames": "@smith-ntc", + "codeowner_github_usernames": "@nautobot/core", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_secrets_providers", - "verbose_name": "Nautobot's Secrets Providers App", + "verbose_name": "Secrets Providers", "app_slug": "nautobot-secrets-providers", "project_slug": "nautobot-app-secrets-providers", "repo_url": "https://github.com/nautobot/nautobot-app-secrets-providers", @@ -21,7 +21,7 @@ "_drift_manager": { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "template_dir": "nautobot-app", - "template_ref": "refs/tags/nautobot-app-v2.2.0", + "template_ref": "refs/tags/nautobot-app-v2.2.1", "cookie_dir": "", "branch_prefix": "drift-manager", "pull_request_strategy": "create", diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 5a994d1..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,85 +0,0 @@ -# Nautobot Secrets Providers Changelog - -## v2.0.1 (2023-09-29) - -### Added - -- [#113](https://github.com/nautobot/nautobot-app-secrets-providers/pull/113) Added the missing fix for [issue](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) that was not included for v2.0.0 - -## v2.0.0 (2023-09-23) - -### Changed - -- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) Updated `nautobot` to `2.0`. - -### Removed - -- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) Removed `slug` field from `Secret` model. Can be replaced with `name` field or [natural keys](https://docs.nautobot.com/projects/core/en/next/development/apps/migration/model-updates/global/#replace-the-usage-of-slugs-with-composite-keys). - -## v1.4.1 (2023-06-07) - -### Fixed - -- [#91](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) Fixed Hashicorp Vault Authentication with AWS Credentials when region is not set. - -## v1.4.0 (2023-04-19) - -### Added - -- [#48](https://github.com/nautobot/nautobot-app-secrets-providers/issues/48) Add token as secret type choice for Delinea/Thycotic -- [#51](https://github.com/nautobot/nautobot-app-secrets-providers/issues/51) Add support for AWS Systems Manager Parameter Store -- [#53](https://github.com/nautobot/nautobot-app-secrets-providers/pull/53) Add support for Hashicorp Key/Value v1 response -- [#66](https://github.com/nautobot/nautobot-app-secrets-providers/pull/66) Add support for Vault Enterprise Namespace parameter - -### Changed - -- [#45](https://github.com/nautobot/nautobot-app-secrets-providers/pull/45) Change references of Thycotic to Delinea -- [#47](https://github.com/nautobot/nautobot-app-secrets-providers/pull/47) Change version constraint of HVAC module to allow non-major upgrades -- [#56](https://github.com/nautobot/nautobot-app-secrets-providers/pull/56) Change minimum supported Nautobot version to `1.4.0` -- [#63](https://github.com/nautobot/nautobot-app-secrets-providers/pull/63) Update app description when installed in Nautobot - -## v1.3.0 (2022-08-29) - -### Added - -- [#32](https://github.com/nautobot/nautobot-app-secrets-providers/issues/32) Add support for skipping certificate validation when connecting to HashiCorp Vault. -- [#34](https://github.com/nautobot/nautobot-app-secrets-providers/issues/34) Add support for alternate authentication to HashiCorp Vault via AWS and Kubernetes authentication methods. -- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/pull/38) Add support for Python 3.10. -- [#40](https://github.com/nautobot/nautobot-app-secrets-providers/issues/40) Add `default_mount_point` config option for HashiCorp Vault. - -### Changed - -- [#42](https://github.com/nautobot/nautobot-app-secrets-providers/issues/42) Now requires python-tss-sdk version v1.2 or later - -### Fixed - -- [#31](https://github.com/nautobot/nautobot-app-secrets-providers/issues/31) Fixed NameError at startup when installed as `nautobot_secrets_providers[thycotic]`, i.e. without HashiCorp Vault support. -- [#37](https://github.com/nautobot/nautobot-app-secrets-providers/pull/37) Various fixes and improvements to the development environment. - -### Removed - -- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/pull/38) - Dropped support for end-of-life Python 3.6 - -## v1.2.0 (2022-05-25) - -### Added - -- [#8](https://github.com/nautobot/nautobot-app-secrets-providers/issues/8) Add support for authentication to HashiCorp Vault via AppRole as an alternative to token authentication -- [#23](https://github.com/nautobot/nautobot-app-secrets-providers/issues/23) Add support for non-default HashiCorp Vault mountpoints - -## v1.1.0 (2022-03-10) - -### Added - -- [#21](https://github.com/nautobot/nautobot-app-secrets-providers/issues/21) Add Thycotic Secret Server plugin - **Requires Python 3.7 or greater** - -## v1.0.1 (2022-01-06) - -### Fixed - -- [#17](https://github.com/nautobot/nautobot-app-secrets-providers/issues/17) Fixed `ModuleNotFoundError` when not installing AWS dependencies - -## v1.0.0 (2021-12-22) - -This is the initial release of Nautobot Secrets Providers that includes support for basic key-value secrets AWS Secrets Manager and HashiCorp Vault. Please see [README.md](./README.md) for more information. diff --git a/README.md b/README.md index afdbb78..88638f4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -# Nautobot's Secrets Providers App +# Nautobot Secrets Providers App

+ +
@@ -9,11 +11,13 @@ An App for Nautobot.

-Nautobot Secrets Providers is an app for [Nautobot](https://github.com/nautobot/nautobot) 1.2.1 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.2.0 added support for integrating with retrieving secrets from various secrets providers. +## Overview + +Nautobot Secrets Providers is an app for [Nautobot](https://github.com/nautobot/nautobot) that bundles Secrets Providers for integrating with popular secrets backends. This app publishes secrets providers that are not included in the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. -## Supported Secrets Backends +### Supported Secrets Backends This app supports the following popular secrets backends: @@ -21,53 +25,38 @@ This app supports the following popular secrets backends: | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | | [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | -| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | -| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver) | [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| | [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/) | [Key Vault Secrets](https://learn.microsoft.com/en-us/azure/key-vault/secrets/about-secrets) | [Entra ID Service Principal](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python) | +| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver) | [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| +| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | -## Screenshots - -![Screenshot of installed apps](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot01.png "App landing page") - ---- - -![Screenshot of app home page](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot02.png "App Home page") - ---- - -![Screenshot of secret using AWS Secrets Manager](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot03.png "Secret using AWS Secrets Manager") - ---- - -![Screenshot of secret using HashiCorp Vault](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot04.png "Secret using HashiCorp Vault") +### Screenshots ---- +More screenshots can be found in the [Using the App](https://docs.nautobot.com/projects/secrets-providers/en/latest/user/app_use_cases/) page in the documentation. Here's a quick overview of some of the app's added functionality: -![Screenshot of secret using Delinea/Thycotic Secret Server by ID](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot05.png "Secret using Thycotic Secret Server by ID") +![Screenshot of app home page](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/secrets-providers-home.png "App Home page") --- -![Screenshot of secret using Delinea/Thycotic Secret Server by Path](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/screenshot06.png "Secret using Thycotic Secret Server by Path") - -## Installation - -See the [installation documentation](https://docs.nautobot.com/projects/secrets-providers/en/latest/admin/install/) for detailed instructions on installing the Nautobot Secrets Providers app. +![Screenshot of secret using AWS Secrets Manager](https://raw.githubusercontent.com/nautobot/nautobot-app-secrets-providers/develop/docs/images/aws-secrets-manager-secrets-provider-add.png "Secret using AWS Secrets Manager") -## Contributing +## Documentation -Pull requests are welcomed and automatically built and tested against multiple version of Python and multiple version of Nautobot through GitHub Actions. +Full web-based HTML documentation for this app can be found over on the [Nautobot Docs](https://docs.nautobot.com) website: -The project is packaged with a light development environment based on `docker-compose` to help with the local development of the project and to run the tests within GitHub Actions. +- [User Guide](https://docs.nautobot.com/projects/secrets-providers/en/latest/user/app_overview/) - Overview, Getting Started, Using the App. +- [Administrator Guide](https://docs.nautobot.com/projects/secrets-providers/en/latest/admin/install/) - How to Install, Configure, Upgrade, or Uninstall the App. +- [Developer Guide](https://docs.nautobot.com/projects/secrets-providers/en/latest/dev/contributing/) - Extending the App, Code Reference, Contribution Guide. +- [Release Notes / Changelog](https://docs.nautobot.com/projects/secrets-providers/en/latest/admin/release_notes/). +- [Frequently Asked Questions](https://docs.nautobot.com/projects/secrets-providers/en/latest/user/faq/). -The project is following Network to Code software development guidelines and is leveraging: +### Contributing to the Docs -- Black, Pylint, Bandit and pydocstyle for Python linting and formatting. -- Django unit test to ensure the app is working properly. +You can find all the Markdown source for the App documentation under the [docs](https://github.com/nautobot/nautobot-app-data-validation-engine/tree/develop/docs) folder in this repository. For simple edits, a Markdown capable editor is sufficient - clone the repository and edit away. -### Development Environment +If you need to view the fully generated documentation site, you can build it with [mkdocs](https://www.mkdocs.org/). A container hosting the docs will be started using the invoke commands (details in the [Development Environment Guide](https://docs.nautobot.com/projects/data-validation/en/latest/dev/dev_environment/#docker-development-environment)) on [http://localhost:8001](http://localhost:8001). As your changes are saved, the live docs will be automatically reloaded. -For information on setting up a local development environment, see the [documentation](https://docs.nautobot.com/projects/secrets-providers/en/latest/dev/dev_environment/). +Any PRs with fixes or improvements are very welcome! ## Questions -For any questions or comments, please check the [FAQ](FAQ.md) first and feel free to swing by the [Network to Code Slack workspace](https://networktocode.slack.com/) (channel `#networktocode`). +For any questions or comments, please check the [FAQ](https://docs.nautobot.com/projects/secrets-providers/en/latest/user/faq/) first. Feel free to also swing by the [Network to Code Slack](https://networktocode.slack.com/) (channel `#nautobot`), sign up [here](http://slack.networktocode.com/) if you don't have an account. \ No newline at end of file diff --git a/changes/134.added b/changes/134.added new file mode 100644 index 0000000..9978834 --- /dev/null +++ b/changes/134.added @@ -0,0 +1,3 @@ +Added previous release notes to docs. +Added logos and missing doc sections. +Added `0001_update_thycotic_delinea_slug.py` migration to update any legacy Thycotic secrets. \ No newline at end of file diff --git a/changes/134.changed b/changes/134.changed new file mode 100644 index 0000000..07823a6 --- /dev/null +++ b/changes/134.changed @@ -0,0 +1,6 @@ +Updated `creds.example.env` file with clearer environment variables for providers. +Updated lock file dependencies. +Moved installation guides for specific secrets providers to separate pages. +Renamed any existing references of `Thycotic` to `Delinea`. +Updated app's verbose name to `Secrets Providers`. +Updated screenshots in Nautobot 2.0 UI. \ No newline at end of file diff --git a/changes/134.removed b/changes/134.removed new file mode 100644 index 0000000..d4ac899 --- /dev/null +++ b/changes/134.removed @@ -0,0 +1,2 @@ +Removed unnecessary provider config from `nautobot_config.py`. +Removed old references to previous Nautobot versions. \ No newline at end of file diff --git a/development/creds.example.env b/development/creds.example.env index 7af55ec..f867869 100644 --- a/development/creds.example.env +++ b/development/creds.example.env @@ -27,7 +27,23 @@ MYSQL_PASSWORD=${NAUTOBOT_DB_PASSWORD} # NAUTOBOT_CONFIG=development/nautobot_config.py ################################################################################ -# Settings for Delinea/Thycotic Secret-Server-Reader +# Azure Key Vault Environment Variables +# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python +# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python +# +# TLDR; Set up a Service Principal, grant it "Key Vault Secrets User" role, add Service Principal +# details to the environment variables below. + +AZURE_TENANT_ID='' +AZURE_CLIENT_ID='' + +AZURE_CLIENT_SECRET='' + +# AZURE_CLIENT_CERTIFICATE_PATH='' +# AZURE_CLIENT_CERTIFICATE_PASSWORD='' + +################################################################################ +# Delinea/Thycotic Secret Server Environment Variables # https://github.com/DelineaXPM/python-tss-sdk SECRET_SERVER_BASE_URL='https://pw.example.local/SecretServer' @@ -36,41 +52,29 @@ SECRET_SERVER_BASE_URL='https://pw.example.local/SecretServer' # cloud based service. (Default: 'False' on-prem) # SECRET_SERVER_IS_CLOUD_BASED='False' -# Required when SECRET_SERVER_IS_CLOUD_BASED == True +# Tenant is required when SECRET_SERVER_IS_CLOUD_BASED == True # SECRET_SERVER_TENANT='' -# Specify either username and password or token. If both are defined +# Specify either username and password or token. If both are defined, # username and password will be used for authentication # Username | Password | Token | Domain | Authorizer # def | def | * | - | PasswordGrantAuthorizer # def | def | * | def | DomainPasswordGrantAuthorizer # * | * | def | - | AccessTokenAuthorizer -SECRET_SERVER_USERNAME='my_thycotic_user' -SECRET_SERVER_PASSWORD='my_thycotic_password' -# SECRET_SERVER_TOKEN="" -# SECRET_SERVER_DOMAIN="" - -# REQUESTS_CA_BUNDLE (Optional) -# Specify the trusted certificates file path for self signed certificates -# e.g. '/etc/ssl/certs/ca-bundle.trust.crt' -#REQUESTS_CA_BUNDLE='/etc/ssl/certs/ca-bundle.trust.crt' +SECRET_SERVER_USERNAME='' +SECRET_SERVER_PASSWORD='' +# SECRET_SERVER_TOKEN='' +# SECRET_SERVER_DOMAIN='' -VAULT_TOKEN=nautobot +# REQUESTS_CA_BUNDLE (optional) +# Specify the trusted certificates file path for self signed certificates +# e.g. '/etc/ssl/certs/ca-bundle.trust.crt' +# REQUESTS_CA_BUNDLE='/etc/ssl/certs/ca-bundle.trust.crt' ################################################################################ -# Azure Key Vault Settings -# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python -# https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python -# -# TLDR; Set up a Service Principal, grant it "Key Vault Secrets User" role, add service principal -# details to the environment variables below. +# HashiCorp Vault Environment Variables -AZURE_TENANT_ID='' -AZURE_CLIENT_ID='' - -AZURE_CLIENT_SECRET='' - -# AZURE_CLIENT_CERTIFICATE_PATH='' -# AZURE_CLIENT_CERTIFICATE_PASSWORD='' +HASHICORP_VAULT_URL='' +HASHICORP_VAULT_TOKEN='' ################################################################################ \ No newline at end of file diff --git a/development/nautobot_config.py b/development/nautobot_config.py index 91f7ae7..f715a27 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -134,30 +134,19 @@ PLUGINS_CONFIG = { "nautobot_secrets_providers": { - "hashicorp_vault": { - "url": os.environ.get("VAULT_URL"), - "token": os.environ.get("VAULT_TOKEN"), - }, - "thycotic": { # https://github.com/thycotic/python-tss-sdk + "delinea": { "base_url": os.getenv("SECRET_SERVER_BASE_URL"), + "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", ""), "cloud_based": is_truthy(os.getenv("SECRET_SERVER_IS_CLOUD_BASED", "False")), - # tenant: required when cloud_based == True - "tenant": os.getenv("SECRET_SERVER_TENANT", ""), - # Setup thycotic authorizer - # Username | Password | Token | Domain | Authorizer - # def | def | * | - | PasswordGrantAuthorizer - # def | def | * | def | DomainPasswordGrantAuthorizer - # - | - | def | * | AccessTokenAuthorizer - # def | - | def | * | AccessTokenAuthorizer - # - | def | def | * | AccessTokenAuthorizer - "username": os.getenv("SECRET_SERVER_USERNAME", ""), + "domain": os.getenv("SECRET_SERVER_DOMAIN", ""), "password": os.getenv("SECRET_SERVER_PASSWORD", ""), + "tenant": os.getenv("SECRET_SERVER_TENANT", ""), "token": os.getenv("SECRET_SERVER_TOKEN", ""), - "domain": os.getenv("SECRET_SERVER_DOMAIN", ""), - # ca_bundle_path: (optional) Path to trusted certificates file. - # This must be set as environment variable. - # see: https://docs.python-requests.org/en/master/user/advanced/ - "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", ""), + "username": os.getenv("SECRET_SERVER_USERNAME", ""), + }, + "hashicorp_vault": { + "url": os.environ.get("HASHICORP_VAULT_URL"), + "token": os.environ.get("HASHICORP_VAULT_TOKEN"), }, }, } diff --git a/docs/admin/install.md b/docs/admin/install.md index 52bb018..54395bb 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -4,8 +4,7 @@ Here you will find detailed instructions on how to **install** and **configure** ## Prerequisites -- This app is compatible with Nautobot 1.2.1 and higher. -- Support for Thycotic Secret Server requires Python 3.7 or later. +- This app is compatible with Nautobot 2.0.0 and higher. - Databases supported: PostgreSQL, MySQL !!! note @@ -29,12 +28,12 @@ AWS Secrets Manager and Systems Manager Parameter Store are supported. Both prov pip install nautobot-secrets-providers[aws] ``` -#### HashiCorp Vault +#### Azure Key Vault -The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the app using the following command: +The Azure Key Vault provider requires the `azure-identity` and `azure-keyvault-secrets` libraries. This can be easily installed along with the app using the following command: ```no-highlight -pip install nautobot-secrets-providers[hashicorp] +pip install nautobot-secrets-providers[azure] ``` #### Delinea/Thycotic Secret Server @@ -45,12 +44,12 @@ The Delinea/Thycotic Secret Server provider requires the `python-tss-sdk` librar pip install nautobot-secrets-providers[thycotic] ``` -#### Azure Key Vault +#### HashiCorp Vault -The Azure Key Vault provider requires the `azure-identity` and `azure-keyvault-secrets` libraries. This can be easily installed along with the app using the following command: +The HashiCorp Vault provider requires the `hvac` library. This can easily be installed along with the app using the following command: ```no-highlight -pip install nautobot-secrets-providers[azure] +pip install nautobot-secrets-providers[hashicorp] ``` ### Access Requirements @@ -108,121 +107,4 @@ sudo systemctl restart nautobot nautobot-worker nautobot-scheduler ## App Configuration -### AWS - -#### Authentication - -No configuration is needed within Nautobot for this provider to operate. Instead you must provide [AWS credentials in one of the methods supported by the `boto3` library](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials). - -Boto3 credentials can be configured in multiple ways (eight as of this writing) that are mirrored here: - -1. Passing credentials as parameters in the `boto.client()` method -2. Passing credentials as parameters when creating a Session object -3. Environment variables -4. Shared credential file (`~/.aws/credentials`) -5. AWS config file (`~/.aws/config`) -6. Assume Role provider -7. Boto2 config file (`/etc/boto.cfg` and `~/.boto`) -8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured. - -**The AWS providers only support methods 3-8. Methods 1 and 2 ARE NOT SUPPORTED at this time.** - -We highly recommend you defer to using environment variables for your deployment as specified in the credentials documentation linked above. The values specified in the linked documentation should be [set within your `~.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) (or similar profile) on your system. - -#### Configuration - -This is an example based on our recommended deployment pattern in the section above (item 3) that is using [environment variables](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#environment-variables). You will need to set these in the environment prior to starting Nautobot: - -```no-highlight -export AWS_ACCESS_KEY_ID=foo # The access key for your AWS account. -export AWS_SECRET_ACCESS_KEY=bar # The secret key for your AWS account. -``` - -Please refer to the [Nautobot documentation on updating your `.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) for how to do this for production Nautobot deployments. - -### HashiCorp Vault - -#### Configuration - -You must provide a mapping in `PLUGINS_CONFIG` within your `nautobot_config.py`, for example: - -```python -PLUGINS_CONFIG = { - "nautobot_secrets_providers": { - "hashicorp_vault": { - "url": "http://localhost:8200", - "auth_method": "token", - "token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN"), - } - }, -} -``` - -- `url` - (required) The URL to the HashiCorp Vault instance (e.g. `http://localhost:8200`). -- `auth_method` - (optional / defaults to "token") The method used to authenticate against the HashiCorp Vault instance. Either `"approle"`, `"aws"`, `"kubernetes"` or `"token"`. For information on using AWS authentication with vault see the [authentication](#authentication) section above. -- `ca_cert` - (optional) Path to a PEM formatted CA certificate to use when verifying the Vault connection. Can alternatively be set to `False` to ignore SSL verification (not recommended) or `True` to use the system certificates. -- `default_mount_point` - (optional / defaults to "secret") The default mount point of the K/V Version 2 secrets engine within Hashicorp Vault. -- `kv_version` - (optional / defaults to "v2") The version of the KV engine to use, can be `v1` or `v2` -- `k8s_token_path` - (optional) Path to the kubernetes service account token file. Defaults to "/var/run/secrets/kubernetes.io/serviceaccount/token". -- `token` - (optional) Required when `"auth_method": "token"` or `auth_method` is not supplied. The token for authenticating the client with the HashiCorp Vault instance. As with other sensitive service credentials, we recommend that you provide the token value as an environment variable and retrieve it with `{"token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN")}` rather than hard-coding it in your `nautobot_config.py`. -- `role_name` - (optional) Required when `"auth_method": "kubernetes"`, optional when `"auth_method": "aws"`. The Vault Kubernetes role or Vault AWS role to assume which the pod's service account has access to. -- `role_id` - (optional) Required when `"auth_method": "approle"`. As with other sensitive service credentials, we recommend that you provide the role_id value as an environment variable and retrieve it with `{"role_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_ROLE_ID")}` rather than hard-coding it in your `nautobot_config.py`. -- `secret_id` - (optional) Required when `"auth_method": "approle"`.As with other sensitive service credentials, we recommend that you provide the secret_id value as an environment variable and retrieve it with `{"secret_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_SECRET_ID")}` rather than hard-coding it in your `nautobot_config.py`. -- `login_kwargs` - (optional) Additional optional parameters to pass to the login method for [`approle`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.AppRole.login), [`aws`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Aws.iam_login) and [`kubernetes`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Kubernetes.login) authentication methods. -- `namespace` - (optional) Namespace to use for the [`X-Vault-Namespace` header](https://github.com/hvac/hvac/blob/main/hvac/adapters.py#L287) on all hvac client requests. Required when the [`Namespaces`](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#usage) feature is enabled in Vault Enterprise. - -### Delinea/Thycotic Secret Server (TSS) - -The Delinea/Thycotic Secret Server app includes two providers: - -#### Thycotic Secret Server by ID - -This provider uses the `Secret ID` to specifiy the secret that is selected. The `Secret ID` is displayed in the browser's URL field if you `Edit` the data in Thycotic Secret Server. - -!!! example - The url is: _https://pw.example.local/SecretServer/app/#/secret/**1234**/general_ - In this example the value for `Secret ID` is **1234**. - -#### Thycotic Secret Server by Path - -This provider allows to select the secret by folder-path and secret-name. The path delimiter is a '\\'. The `Secret path` is displayed as page header when `Edit` a secret. - -!!! example - The header is: **NET-Automation > Nautobot > My-Secret** - In this example the value for `Secret path` is **`\NET-Automation\Nautobot\My-Secret`**. - -#### Configuration - -```python -PLUGINS_CONFIG = { - "nautobot_secrets_providers": { - "thycotic": { # https://github.com/thycotic/python-tss-sdk - "base_url": os.getenv("SECRET_SERVER_BASE_URL", None), - "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", None), - "cloud_based": is_truthy(os.getenv("SECRET_SERVER_IS_CLOUD_BASED", "False")), - "domain": os.getenv("SECRET_SERVER_DOMAIN", None), - "password": os.getenv("SECRET_SERVER_PASSWORD", None), - "tenant": os.getenv("SECRET_SERVER_TENANT", None), - "token": os.getenv("SECRET_SERVER_TOKEN", None), - "username": os.getenv("SECRET_SERVER_USERNAME", None), - }, - } -} -``` - -- `base_url` - (required) The Secret Server base_url. _e.g.'https://pw.example.local/SecretServer'_ -- `ca_bundle_path` - (optional) When using self-signed certificates this variable must be set to a file containing the trusted certificates (in .pem format). _e.g. '/etc/ssl/certs/ca-bundle.trust.crt'_. -- `cloud_based` - (optional) Set to "True" if Secret Server Cloud should be used. (Default: "False"). -- `domain` - (optional) Required for 'Domain Authorization' -- `password` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. -- `tenant` - (optional) Required for 'Domain Authorization'. -- `token` - (optional) Required for 'Access Token Authorization'. -- `username` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. - -### Azure Key Vault - -#### Authentication - -No configuration is required within Nautobot for this provider to work. You must provide [Azure Service Principal credentials in one of the formats supported by the azure-identity library](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python). The credential variables should be injected into Nautobot's environment via your preferred method. - -The recommended method is to use a Service Principal with Secret, for which creds.example.env has an example. [More information on how to set up the SP in Azure in the Azure docs](https://learn.microsoft.com/en-us/azure/key-vault/general/rbac-guide?tabs=azure-cli). \ No newline at end of file +View configuration details for specific secrets providers on their dedicated pages [here](./providers/index.md). diff --git a/docs/admin/providers/aws_setup.md b/docs/admin/providers/aws_setup.md new file mode 100644 index 0000000..512e10d --- /dev/null +++ b/docs/admin/providers/aws_setup.md @@ -0,0 +1,31 @@ +# AWS + +## Authentication + +No configuration is needed within Nautobot for this provider to operate. Instead, you must provide AWS credentials in one of the [methods supported by the `boto3` library](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials). + +Boto3 credentials can be configured in multiple ways (eight as of this writing) that are mirrored here: + +1. Passing credentials as parameters in the `boto.client()` method +2. Passing credentials as parameters when creating a Session object +3. Environment variables +4. Shared credential file (`~/.aws/credentials`) +5. AWS config file (`~/.aws/config`) +6. Assume Role provider +7. Boto2 config file (`/etc/boto.cfg` and `~/.boto`) +8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured. + +**The AWS providers only support methods 3-8. Methods 1 and 2 ARE NOT SUPPORTED at this time.** + +We highly recommend you defer to using environment variables for your deployment as specified in the credentials documentation linked above. The values specified in the linked documentation should be [set within your `~.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) (or similar profile) on your system. + +## Configuration + +This is an example based on our recommended deployment pattern in the section above (method 3) that uses [environment variables](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#environment-variables). You will need to set these in the environment prior to starting Nautobot: + +```no-highlight +export AWS_ACCESS_KEY_ID=foo # The access key for your AWS account. +export AWS_SECRET_ACCESS_KEY=bar # The secret key for your AWS account. +``` + +Please refer to the [Nautobot documentation on updating your `.bashrc`](https://nautobot.readthedocs.io/en/latest/installation/nautobot/#update-the-nautobot-bashrc) for how to do this for production Nautobot deployments. diff --git a/docs/admin/providers/azure_setup.md b/docs/admin/providers/azure_setup.md new file mode 100644 index 0000000..10730ec --- /dev/null +++ b/docs/admin/providers/azure_setup.md @@ -0,0 +1,30 @@ +# Azure Key Vault + +## Prerequisites + +Ensure that an Azure Service Principal is created and has been configured with access to the targeted Key Vault(s) using the "Key Vault Secrets User" role. More information on how to set up the Service Principal in Azure can be found in the [Azure docs](https://learn.microsoft.com/en-us/azure/key-vault/general/rbac-guide?tabs=azure-cli). + +## Authentication + +No configuration is needed within Nautobot for this provider to operate. Instead, you must provide Azure Service Principal credentials in one of the [formats supported by the `azure-identity` library](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python). The credential variables should then be injected into Nautobot's environment via your preferred method. The `creds.example.env` file has examples of the variables from the methods discussed below. + +### Service Principal with Secret + +The recommended method is to use a [Service Principal with Secret](https://learn.microsoft.com/en-us/python/api/overview/azure/identity-readme?view=azure-python#service-principal-with-secret). This method requires three environment variables to be set within the Nautobot environment: + +``` +AZURE_TENANT_ID='' +AZURE_CLIENT_ID='' +AZURE_CLIENT_SECRET='' +``` + +### Service Principal with Certificate + +You can also use a [Service Principal with Certificate](https://learn.microsoft.com/en-us/python/api/overview/azure/identity-readme?view=azure-python#service-principal-with-certificate), which has these environment variables: + +``` +AZURE_TENANT_ID='' +AZURE_CLIENT_ID='' +AZURE_CLIENT_CERTIFICATE_PATH='' +AZURE_CLIENT_CERTIFICATE_PASSWORD='' # Optional +``` diff --git a/docs/admin/providers/delinea_setup.md b/docs/admin/providers/delinea_setup.md new file mode 100644 index 0000000..5d36de3 --- /dev/null +++ b/docs/admin/providers/delinea_setup.md @@ -0,0 +1,43 @@ +# Delinea/Thycotic Secret Server (TSS) + +The Delinea (formerly Thycotic) Secret Server provider includes two secret retrieval methods: + +### Delinea Secret Server by ID + +This method uses the `Secret ID` to specifiy the secret that is selected. The `Secret ID` is displayed in the browser's URL field if you `Edit` the data in Delinea Secret Server. + +> **Example:** for the URL `https://pw.example.local/SecretServer/app/#/secret/1234/general`, the value for `Secret ID` is **1234**. + +### Delinea Secret Server by Path + +This method allows to select the secret by folder-path and secret-name. The path delimiter is a '\\'. The `Secret path` is displayed as page header when `Edit` a secret. + +> **Example:** for the header `NET-Automation > Nautobot > My-Secret`, the value for `Secret path` is **\NET-Automation\Nautobot\My-Secret**. + +## Configuration + +```python +PLUGINS_CONFIG = { + "nautobot_secrets_providers": { + "delinea": { + "base_url": os.getenv("SECRET_SERVER_BASE_URL", None), + "ca_bundle_path": os.getenv("REQUESTS_CA_BUNDLE", None), + "cloud_based": is_truthy(os.getenv("SECRET_SERVER_IS_CLOUD_BASED", "False")), + "domain": os.getenv("SECRET_SERVER_DOMAIN", None), + "password": os.getenv("SECRET_SERVER_PASSWORD", None), + "tenant": os.getenv("SECRET_SERVER_TENANT", None), + "token": os.getenv("SECRET_SERVER_TOKEN", None), + "username": os.getenv("SECRET_SERVER_USERNAME", None), + }, + } +} +``` + +- `base_url` - (required) The Secret Server base_url. _e.g.'https://pw.example.local/SecretServer'_ +- `ca_bundle_path` - (optional) When using self-signed certificates, this variable must be set to a file containing the trusted certificates (in .pem format). _e.g. '/etc/ssl/certs/ca-bundle.trust.crt'_. +- `cloud_based` - (optional) Set to "True" if Secret Server Cloud should be used. (Default: "False"). +- `domain` - (optional) Required for 'Domain Authorization' +- `password` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. +- `tenant` - (optional) Required for 'Domain Authorization'. +- `token` - (optional) Required for 'Access Token Authorization'. +- `username` - (optional) Required for 'Secret Server Cloud', 'Password Authorization', 'Domain Authorization'. diff --git a/docs/admin/providers/hashicorp_setup.md b/docs/admin/providers/hashicorp_setup.md new file mode 100644 index 0000000..3fd3ae5 --- /dev/null +++ b/docs/admin/providers/hashicorp_setup.md @@ -0,0 +1,29 @@ +# HashiCorp Vault + +## Configuration + +You must provide a mapping in `PLUGINS_CONFIG` within your `nautobot_config.py`, for example: + +```python +PLUGINS_CONFIG = { + "nautobot_secrets_providers": { + "hashicorp_vault": { + "url": os.environ.get("HASHICORP_VAULT_URL"), + "token": os.environ.get("HASHICORP_VAULT_TOKEN"), + } + }, +} +``` + +- `url` - (required) The URL to the HashiCorp Vault instance (e.g. `http://localhost:8200`). +- `auth_method` - (optional / defaults to "token") The method used to authenticate against the HashiCorp Vault instance. Either `"approle"`, `"aws"`, `"kubernetes"` or `"token"`. For information on using AWS authentication with vault see the [authentication](#authentication) section above. +- `ca_cert` - (optional) Path to a PEM formatted CA certificate to use when verifying the Vault connection. Can alternatively be set to `False` to ignore SSL verification (not recommended) or `True` to use the system certificates. +- `default_mount_point` - (optional / defaults to "secret") The default mount point of the K/V Version 2 secrets engine within Hashicorp Vault. +- `kv_version` - (optional / defaults to "v2") The version of the KV engine to use, can be `v1` or `v2` +- `k8s_token_path` - (optional) Path to the kubernetes service account token file. Defaults to "/var/run/secrets/kubernetes.io/serviceaccount/token". +- `token` - (optional) Required when `"auth_method": "token"` or `auth_method` is not supplied. The token for authenticating the client with the HashiCorp Vault instance. As with other sensitive service credentials, we recommend that you provide the token value as an environment variable and retrieve it with `{"token": os.getenv("NAUTOBOT_HASHICORP_VAULT_TOKEN")}` rather than hard-coding it in your `nautobot_config.py`. +- `role_name` - (optional) Required when `"auth_method": "kubernetes"`, optional when `"auth_method": "aws"`. The Vault Kubernetes role or Vault AWS role to assume which the pod's service account has access to. +- `role_id` - (optional) Required when `"auth_method": "approle"`. As with other sensitive service credentials, we recommend that you provide the role_id value as an environment variable and retrieve it with `{"role_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_ROLE_ID")}` rather than hard-coding it in your `nautobot_config.py`. +- `secret_id` - (optional) Required when `"auth_method": "approle"`.As with other sensitive service credentials, we recommend that you provide the secret_id value as an environment variable and retrieve it with `{"secret_id": os.getenv("NAUTOBOT_HASHICORP_VAULT_SECRET_ID")}` rather than hard-coding it in your `nautobot_config.py`. +- `login_kwargs` - (optional) Additional optional parameters to pass to the login method for [`approle`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.AppRole.login), [`aws`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Aws.iam_login) and [`kubernetes`](https://hvac.readthedocs.io/en/stable/source/hvac_api_auth_methods.html#hvac.api.auth_methods.Kubernetes.login) authentication methods. +- `namespace` - (optional) Namespace to use for the [`X-Vault-Namespace` header](https://github.com/hvac/hvac/blob/main/hvac/adapters.py#L287) on all hvac client requests. Required when the [`Namespaces`](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#usage) feature is enabled in Vault Enterprise. diff --git a/docs/admin/providers/index.md b/docs/admin/providers/index.md new file mode 100644 index 0000000..0dc5440 --- /dev/null +++ b/docs/admin/providers/index.md @@ -0,0 +1,8 @@ +# Secrets Providers + +This Nautobot app supports the following secrets providers: + +- [AWS](./aws_setup.md) +- [Azure](./azure_setup.md) +- [Delinea/Thycotic](./delinea_setup.md) +- [HashiCorp](./hashicorp_setup.md) diff --git a/docs/admin/release_notes/index.md b/docs/admin/release_notes/index.md new file mode 100644 index 0000000..59abac7 --- /dev/null +++ b/docs/admin/release_notes/index.md @@ -0,0 +1,3 @@ +# Release Notes + +All the published release notes can be found via the navigation menu. All patch releases are included in the same minor release (e.g. `v1.2`) document. \ No newline at end of file diff --git a/docs/admin/release_notes/version_1.0.md b/docs/admin/release_notes/version_1.0.md new file mode 100644 index 0000000..1392105 --- /dev/null +++ b/docs/admin/release_notes/version_1.0.md @@ -0,0 +1,15 @@ +# v1.0 Release Notes + +This document describes all new features and changes in the release `1.0`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This is the initial release of Nautobot Secrets Providers that includes support for basic key-value secrets AWS Secrets Manager and HashiCorp Vault. + +## [v1.0.1 (2022-01-06)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.0.1) + +### Fixed + +- [#17](https://github.com/nautobot/nautobot-app-secrets-providers/issues/17) - Fixed `ModuleNotFoundError` when not installing AWS dependencies. + +## [v1.0.0 (2021-12-22)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.0.0) diff --git a/docs/admin/release_notes/version_1.1.md b/docs/admin/release_notes/version_1.1.md new file mode 100644 index 0000000..3507089 --- /dev/null +++ b/docs/admin/release_notes/version_1.1.md @@ -0,0 +1,13 @@ +# v1.1 Release Notes + +This document describes all new features and changes in the release `1.1`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This release adds support for Thycotic Secret Server. Requires Python 3.7 or higher. + +## [v1.1.0 (2022-03-10)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.1.0) + +### Added + +- [#21](https://github.com/nautobot/nautobot-app-secrets-providers/issues/21) - Added Thycotic Secret Server plugin. diff --git a/docs/admin/release_notes/version_1.2.md b/docs/admin/release_notes/version_1.2.md new file mode 100644 index 0000000..ee973e0 --- /dev/null +++ b/docs/admin/release_notes/version_1.2.md @@ -0,0 +1,14 @@ +# v1.2 Release Notes + +This document describes all new features and changes in the release `1.2`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This release adds additional functionality for the HashiCorp Vault provider. + +## [v1.2.0 (2022-05-25)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.2.0) + +### Added + +- [#8](https://github.com/nautobot/nautobot-app-secrets-providers/issues/8) - Add support for authentication to HashiCorp Vault via AppRole as an alternative to token authentication. +- [#23](https://github.com/nautobot/nautobot-app-secrets-providers/issues/23) - Add support for non-default HashiCorp Vault mountpoints. diff --git a/docs/admin/release_notes/version_1.3.md b/docs/admin/release_notes/version_1.3.md new file mode 100644 index 0000000..304efcb --- /dev/null +++ b/docs/admin/release_notes/version_1.3.md @@ -0,0 +1,29 @@ +# v1.3 Release Notes + +This document describes all new features and changes in the release `1.3`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This release adds support for Python 3.10, along with other provider enhancements and bug fixes. + +## [v1.3.0 (2022-08-30)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.3.0) + +### Added + +- [#32](https://github.com/nautobot/nautobot-app-secrets-providers/issues/32) - Add support for skipping certificate validation when connecting to HashiCorp Vault. +- [#34](https://github.com/nautobot/nautobot-app-secrets-providers/issues/34) - Add support for alternate authentication to HashiCorp Vault via AWS and Kubernetes authentication methods. +- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/issues/38) - Add support for Python 3.10. +- [#40](https://github.com/nautobot/nautobot-app-secrets-providers/issues/40) - Add `default_mount_point` config option for HashiCorp Vault. + +### Changed + +- [#42](https://github.com/nautobot/nautobot-app-secrets-providers/issues/42) - Now requires python-tss-sdk version v1.2 or later. + +### Fixed + +- [#31](https://github.com/nautobot/nautobot-app-secrets-providers/issues/31) - Fixed NameError at startup when installed as `nautobot_secrets_providers[thycotic]`, i.e. without HashiCorp Vault support. +- [#37](https://github.com/nautobot/nautobot-app-secrets-providers/issues/37) - Various fixes and improvements to the development environment. + +### Removed + +- [#38](https://github.com/nautobot/nautobot-app-secrets-providers/issues/38) - Dropped support for end-of-life Python 3.6 diff --git a/docs/admin/release_notes/version_1.4.md b/docs/admin/release_notes/version_1.4.md new file mode 100644 index 0000000..d058f65 --- /dev/null +++ b/docs/admin/release_notes/version_1.4.md @@ -0,0 +1,29 @@ +# v1.4 Release Notes + +This document describes all new features and changes in the release `1.4`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This release adds additional enhancements for the Delinea/Thycotic, AWS, and HashiCorp providers. + +## [v1.4.1 (2023-06-08)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.4.1) + +### Fixed + +- [#91](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) - Fixed Hashicorp Vault Authentication with AWS Credentials when region is not set. + +## [v1.4.0 (2023-04-19)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v1.4.0) + +### Added + +- [#48](https://github.com/nautobot/nautobot-app-secrets-providers/issues/48) - Add token as secret type choice for Delinea/Thycotic. +- [#51](https://github.com/nautobot/nautobot-app-secrets-providers/issues/51) - Add support for AWS Systems Manager Parameter Store. +- [#53](https://github.com/nautobot/nautobot-app-secrets-providers/issues/53) - Add support for Hashicorp Key/Value v1 response. +- [#66](https://github.com/nautobot/nautobot-app-secrets-providers/issues/66) - Add support for Vault Enterprise Namespace parameter. + +### Changed + +- [#45](https://github.com/nautobot/nautobot-app-secrets-providers/issues/45) - Change references of Thycotic to Delinea. +- [#47](https://github.com/nautobot/nautobot-app-secrets-providers/issues/47) - Change version constraint of HVAC module to allow non-major upgrades. +- [#56](https://github.com/nautobot/nautobot-app-secrets-providers/issues/56) - Change minimum supported Nautobot version to 1.4.0. +- [#63](https://github.com/nautobot/nautobot-app-secrets-providers/issues/63) - Update plugin description when installed in Nautobot. diff --git a/docs/admin/release_notes/version_2.0.md b/docs/admin/release_notes/version_2.0.md new file mode 100644 index 0000000..eb0d075 --- /dev/null +++ b/docs/admin/release_notes/version_2.0.md @@ -0,0 +1,28 @@ +# v2.0 Release Notes + +This document describes all new features and changes in the release `2.0`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +This release updates Secrets Provider to be compatible with Nautobot v2.0. + +## [v2.0.1 (2023-09-29)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v2.0.1) + +### Added + +- [#113](https://github.com/nautobot/nautobot-app-secrets-providers/issues/113) - Added the missing fix for [issue](https://github.com/nautobot/nautobot-app-secrets-providers/issues/91) that was not included for v2.0.0. + +## [v2.0.0 (2023-09-29)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v2.0.0) + +### Changed + +- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) Updated `nautobot` to `2.0`. +- [#111](https://github.com/nautobot/nautobot-app-secrets-providers/issues/111) - Migrate app to Nautobot v2.0 compatible. + +### Fixed + +- [#92](https://github.com/nautobot/nautobot-app-secrets-providers/issues/92) - Fixed null AWS region. + +### Removed + +- [#105](https://github.com/nautobot/nautobot-app-secrets-providers/pull/106) - Removed `slug` field from `Secret` model. Can be replaced with `name` field or [natural keys](https://docs.nautobot.com/projects/core/en/next/development/apps/migration/model-updates/global/#replace-the-usage-of-slugs-with-composite-keys). diff --git a/docs/admin/release_notes/version_3.0.md b/docs/admin/release_notes/version_3.0.md new file mode 100644 index 0000000..6716fe8 --- /dev/null +++ b/docs/admin/release_notes/version_3.0.md @@ -0,0 +1,6 @@ +# v3.0 Release Notes + +This document describes all new features and changes in the release `3.0`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + diff --git a/docs/admin/uninstall.md b/docs/admin/uninstall.md index 46ff4cd..a087e24 100644 --- a/docs/admin/uninstall.md +++ b/docs/admin/uninstall.md @@ -10,9 +10,6 @@ Prior to removing the app from the `nautobot_config.py`, run the following comma nautobot-server migrate nautobot_secrets_providers zero ``` -!!! warning "Developer Note - Remove Me!" - Any other cleanup operations to ensure the database is clean after the app is removed. Is there anything else that needs cleaning up, such as CFs, relationships, etc. if they're no longer desired? - ## Remove App configuration Remove the configuration you added in `nautobot_config.py` from `PLUGINS` & `PLUGINS_CONFIG`. diff --git a/docs/admin/upgrade.md b/docs/admin/upgrade.md new file mode 100644 index 0000000..02959f5 --- /dev/null +++ b/docs/admin/upgrade.md @@ -0,0 +1,7 @@ +# Upgrading the App + +Here you will find any steps necessary to upgrade the App in your Nautobot environment. + +## Upgrade Guide + +When a new release comes out it may be necessary to run a migration of the database to account for any changes in the data models used by this app. Execute the command `nautobot-server post-upgrade` within the runtime environment of your Nautobot installation after updating the `nautobot-secrets-providers` package via `pip`. diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fcaa3d653334894025d867436969693afa2d7c51 GIT binary patch literal 15086 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 KMNUMnLSTZbe~(ZA literal 0 HcmV?d00001 diff --git a/docs/assets/nautobot_logo.svg b/docs/assets/nautobot_logo.svg new file mode 100644 index 0000000..c9bba8e --- /dev/null +++ b/docs/assets/nautobot_logo.svg @@ -0,0 +1,131 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/networktocode_bw.png b/docs/assets/networktocode_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..075c4926d570b9db02c8808f34f40c8eb5f18a90 GIT binary patch literal 7562 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
- diff --git a/docs/dev/code_reference/index.md b/docs/dev/code_reference/index.md new file mode 100644 index 0000000..6d6cb81 --- /dev/null +++ b/docs/dev/code_reference/index.md @@ -0,0 +1,3 @@ +# Code Reference + +Auto-generated code reference documentation from docstrings. \ No newline at end of file diff --git a/docs/dev/code_reference/package.md b/docs/dev/code_reference/package.md new file mode 100644 index 0000000..927648d --- /dev/null +++ b/docs/dev/code_reference/package.md @@ -0,0 +1 @@ +::: nautobot_secrets_providers \ No newline at end of file diff --git a/docs/dev/code_reference/providers.md b/docs/dev/code_reference/providers.md new file mode 100644 index 0000000..d97e98b --- /dev/null +++ b/docs/dev/code_reference/providers.md @@ -0,0 +1,5 @@ +# Nautobot Secrets Providers Package + +::: nautobot_secrets_providers.providers + options: + show_submodules: True \ No newline at end of file diff --git a/docs/dev/extending.md b/docs/dev/extending.md new file mode 100644 index 0000000..0ce360a --- /dev/null +++ b/docs/dev/extending.md @@ -0,0 +1,3 @@ +# Extending the App + +Extending the application is welcome, however it is best to open an issue first, to ensure that a PR would be accepted and makes sense in terms of features and design. \ No newline at end of file diff --git a/docs/images/aws-secrets-manager-secrets-provider-add.png b/docs/images/aws-secrets-manager-secrets-provider-add.png new file mode 100644 index 0000000000000000000000000000000000000000..30201346bf00591caf57ff0e97de1b07dca9e873 GIT binary patch literal 23661 zcmbrm2UJr_+cq4J=cq`8qaYZnh*G5Y4gyM%js@vPAOY#pYg8~OT|%!SRi*bLphkMA zp@$+Jq)8`0;Ggic^Ss}B|F^N0OR}@~%YZW-DVl5iF|yoO{(f z#@#lBn^eAA;|Ryn(^qU4`fUF+!dVra<}JD<@i6(1xyRT?ElkvOwRrUFQ|_Y|u-VWn zw&#TDTBUZe+B-2U{t{`K}TEqz{%EOBo4H<{Mw}6Pfg+n0E6I%o!kXu@o zS0Iodp``s!=6;lYD>$RlmIMh!2601Vk#5JFzEhPAW8flE5 zIK&E2=`UqSiDG5z*HyTh3r#6e_3kT(5lIegDETeyiUZO}L1{UVO-6-=`hyLEW9stf z%H8?OG~a`j_5+l#?^Z10#@TOIiJHRE%Ua8=p(2`iB$9)^ z5faIrdTe=Ci$EA3e_CrpW5A$}?^@t-TG^dq*gVbOgbBOu;7HG=uF5OEBhrymG)24& zftV{}vlz?I(b$?j*hmY3JWe|Nd3<0M%r%YTfXzwx6IbzNgZmGW@f??E#rz&- zAo~w>OC-{*JU5)w&Pn3c!gyYjDxgUtDxbN?|28D&<<6+m)OkUCyoteF~?cP zXA`c`=O@6M&UTdfHEmrAzkJ|3-4qtX{eJQ3y0eyOC8=m$FyI+b_@XAO& z{2TvB5;%T$csysmKQD1S9cL4l@rWct0=lZ|{;M>o!SH*G`QgHPWg6)Yk-7AEa#9DC zGQxVI*vU0JLz|hZ4u_zjkDfR|NdGepx;Bxh)KZK%D5zj(*NzCytPY z4vR;`oa3L9ItmJi=M*Q(kMni;HQekoc#Op!6U|A7mB+h5s9#7Q1s~5yd1?OtrVV+= zL7qvM=D&TrYKx$`?|S3v>S||aXApSR=8Yaz)>oPrqwciObK5ZW7{NHUj#@d>WWBc* z7V$Y$UM~5=*FbWMywJC+3FGL^eJ|?kEr_~NgDn~v$q`yYeXtY4 z9!@J9O>?ICZfq^$`-Fhe8$KsAx3fZE3&<2L>3xEx5L%eT27S-~qm|P3HYY|rnG?}G zcWZZTV)svAZzWlEQe`P%mMN-2A+WjW2nFpFV0n{^kzJ{;pwHezH!D#Gl^;aF(;{@j zxFA-4&-YN89i5Y#O{(h7K&Q=5|(0~jEXcV_csn*-4f z`7d4K|M)on<@C35llAKPrfV-0GY+Op{_l(RFQWkMX0%74P#zv0NF?W|Es&Xdu9H#< z&Bv7cyLo)eJlHQB=XYJIir2>L4i6#d${Uf*KxpUziAztGzH z@ihRb%G%0`oY%(8a4FIpMcQtU6EHsoF`-MZpt!7^>!MUn^E6eL7`V^*Kq=@g{PA=k zJHw@gQ_ao(3npQDJ;$wdu>3JF8)Vx3M;)ceUC5~mtN z+#Iwa&qrP*a^9EsyBuA?kAXifT?Rj3X4H|%^HY!t)m&dC63xeVx|CU3?Uq-DuCCnc z1DZi02>DV$v8|K)a>TJOM~jmDO>J$hkB?8GS>4?=@Su9`OC>(qoA0;$Ux1CVL?Y*b zO;{SmfNcR!De<{347QS=nnX)WN=CvV&sS*4voJFV{q3qZal^{{G^EH+iSIi0me#im zvvJ@id%CA=urnuNk+C-VMH`4FzQkhS?}X_i;o}WEBesJM;sUGUqTm?6>&HbZ=boi?EO#(;+jH%dIkzsK15#KJc+FE;*RXTXaor{2hr;2AD- z_q`}@A8^<1VS&?VZ&k|{*d4ME-m5Wph`h+eu>{n6r~0JK$ClN(dWmS-JV3)dV*L7& zczwFd7e|`KSG>`*v@*Q)h*;YwO`n&L=X@MkCv{qiOcbN&WtXEx=|ZG1u1dN=5Sa|0 zV{yeH&1HOvnUL(Jh-7{wFg4AI;bT}SeoJ(3Abt6@7Kmia}qZ857dh@Jz9gRYSs zLkq}b4e|!v`OW6C)Xd(*4ck!nG@nP#W}U*=Xmc#1u(}M%eLyRc>xrf?(SK}DQH#eX zHtM0+gphxtz1QJUxv%VRP{^Mxg1QM95UV}^*(#_D1MXw!nK1Oe3JCTqlA)(#fVq3l z$BDgV1uW9zc5q9Ald|7ths5Fq$d?_8@<`}uvEkuiDM?8+M-cAm_hty_mI2R#{#d85!XG)X8H3eWfB@GrWrZ zf*78dXmFViKbD3;itJCcUzzpW@4$2-L7ul?zb~2IDW&gi^U9AL+P-7>cT@XcWJv#V2jU|~M@J_?i+0r@1j3K` z`@A1k4ULBkfVHJvop-XBsPozF$xt;H{YD4oPUmwxvD>#o#6b2Cl%I1gq)7R2P4dcOnrz0JlD`lZoi2&9~n zyo38Ux$I3j$PxiRVCJL4YRGAbUBrpqzpt21cQ+}vRj^2LBqtX{TQrY>eWdxBru#?v zM6ON}T?_ce-NR#dXUDA0J7yd_h|&Gyl@Ztd+l!>%z<#%YI1ZnqGg!@e3c?SbdS$fG zU5Fu%_w9n4lhaj@dJ?$Fvq+0RA&>R#!uG~&`_>uAp9)_=au)^XG`c|7I&G^69^oe^URd~NwC_{DZ`T*vVdzN0d{rW2wo1VfAL z_~)vLAPo_XZ3pGHsaq4j@6blQn>d~j;wWlB$ULh*emj*SY4xTP{-T=D(~ zPV9GEpB0>MW|OMNU0?^kT}k`ib9+CY!5qrDx-K&q9&dW;$2rR@osSaWFWsV=hNbd< z9{!f1gjTm&coODw_Y-Y{n){Y77nZ4c(KpU+=Np%*{L$c_q#UHIBBZ5NFuC~AaA>`j zXntf=y5Q5J6bIq^2^SuFijrrlZ|=GjRlhkWa{j zF!5QstMF=4--fEVTLh9U3}isZlca~Xx!YPX-qxNm>Gsg)!V{RpNPNslm}g!E9j~|b z&Bpue;U2BV;kM=VL3=ekod~pZr*PIJ3mjMs5Tdg2l9{rbLPn4?Z} z)ri@nmG_&6$^3QN97w6Qh@`qysq|0$QHO3qpG}IXS~H#HQ$4@0;xm})6z-178}`3S zZyFTg^do+2iRH4Rwy-@8U2C?m#ko;Ia_*uhLpx|SmFphFmMY89Rz^JS9_p$xV>0kj zPWoJS9-a8?&WlG>9FB(3nHh-rwLn<5$%};Z^45e=uFh}0QHYRxfnVN}dY|k(2`Kw$ z7%-KIWR9g*mda?_`pDB1yRGZq&)`wzT2<}G=$tzpV%g^@nrb&-%i`zC+-VxC!BgRT z9zES8KDNl1O+)xjKZ$q$g)f+jZCY-Fd|8ZyOIj3r-u%>>Cma0A;6tHz5_4&Z-TmLh zV?Wisf8IF}?g5i$IA3nLkk8e}A(vcOV@_k{fDYXRrdIe%cl{X=ph&*$@gezN?h z7+w0!2#EVx7p&Gjdc?)h3eVueCvPP_ z_L6t*Zb-+*$R`xD6<>%jzraN4M{nsF2^ma&RlGX! zaE`MVHm1c3Clft?z+y2e` zQ5NHH%0gkR<^E5;7Wv=+?xpH%emko>X0i?nq18{eBx{x*6D~`tvOFeCBekyXfDb! z03VTLoOgOtfZEFXW7%?WhYg0Pxe<)jV7KWs^<+ZI75ypJl0Y{9%q;HZ(gV!cp(g@4tXs5OCR4UH>i;vm*LLtE(j>58??_r z?2>ek18**L2c3iy^S}}Bu8z@IfVnS{J!s%fFoinVkvsg5@mQ7h+ZU}n3#s~i;$X#2 zYl7L)BNG!7!^736V}H-}L*k~J!+pqeqredka*T13dkqlJ8|t86gwd_ekByBvSp@l9 zfcy|X$+W_w&5YpYCy74#f0u^7=-5~uF4a*WZ3R%vS5ZKUwEmG&eY8#h5z_V1vdLA_ ztN@BgoKIUj@zdnD>Qf48x_0&07MUdB=ug@n1TpA;2m-H8hWl;*eDD|P z{v-DM=K=W7!_$A>GM5W-8gu{S%9pIZ(c`Ft6;%bUac$o%)rM_j)Rsg?djo}l%!JRb zb15Hv?N8rhft)n+&{q_Q&EFtTIY7J{9uH6aMmoD5QJ)*}frI+GP%bphzjk+Z7qxV- zwpuQLet*1fexx@VZ_}&SFg@*o5~O*i-E18gL;;&Sm|%<$cikYZ`Jr51(m|Z;grUYW zbH;^#7>p;}FJ3bbVg2l!5xlWu4dZxlEYu2}^?^~0Ai1%pgOBjoC@j3oMZ2p<7&qn!Jy!{p$jxBS3;xyZY-D+*MH%C+S`v&t1Ic{~C?Q`zD3Y39^{J!b!qalJaJ;!8N(ZN-F|whauuGUVxlA~kEx>`fn+V9ZDjGK(1*R~qA$ z$y!zfZI4|7?)Nlhs9^mho_q z%GNVOPjc?w3a8}NqZWy|ur9&~ESq~vwI;EaXTTy!yg0MhH{Hqc<=5b$Zn_06gW{mK z+2ke83u}HLx!O#$2BdH$DOuB?`;K6*{A;j{nL_dHf?mlyoaNG=qUBUUdJ;FdXc>Ps zGw#IbfbD={o~Ue!%VE@~)>@;D8HAe3;OwMpT7>KlJ})%vZ2VQ`EyTr`_u@^_1j1+6 zivt~kc+pF?3l18_I>0|Z7#r9%j8V9xvH2>3p?JzX=H=YYy=th4!K{G2qss`F;VkBS zA?lZdHv^3;NtDQGi?1_l5gh9q$tSwRXF)|6cj%C(Aa2rGYf;PrV0*Y(E6PSx`MHas zlWebow{B(ojYnA}aeSin;%FC~t;grcad%}R1++@t#{{{*GSh%Z$qGXm5y@~gt|$_|e`c6)bYL;N+Xh+< z1c`P&kuLY2IKewBHRW*Q`;P!>76t#q4vC3OEs&+L{RfW_>xB2;U(A_Yt^21(I?-cL0R4X&j{i!h z|I7ZQHXAmtQ~^}DTl3Qt=|phNtf)g!X#`~fu$!;8E(*825ypY6xZ!Z4{ogN6H%F|E z)y9ED6_T74DX(-!3S=Uzv%cH?1~xP&W&P?5l2z<9GX6*ZCxbM82v%|Y}w3w5I#`=QJkdq19y+F&08+X)T&7LaHJkbT z_McqJ{=eToa}G8aB2YgxHb$Dk=*aIcWKffrz3OXB%hBiXj zz$;szztqPHW;X<*^!%mCgW8x;{|P!qKX~Q9vMeLrSQ>c|@hK_H=GVc7cdDwff)lz9 z4y7uqU$iv1B|%=U2P_t8|WuYJv~9`8}d#Cl&?1`xx32z=Yw_$bmpYJU3|8RHF1$T z$uA0YbqY-DeTI%Q@(fwDkGvPwY8CFDRmZB;%qzL@ZH6hjY&{7id4di`srwOZ?uZ(d z!+n@kX%)HfL^`I8cPzb)5!Dxcdav2l$NPS-yq*oq9<6F`4oNA~)s z*d@Z-I7JkbSWEKsKX>XkFPzf0kWa{)cqYpZ2V(8)kV3@sp1wX@8a}lxiJj?^3r1dD zLdM(R9<>SDmNDh+0iBVgWQ>GA;}OwxSb^f}Iy0m7nf#7+;Ulq_^@wIX3uv25o~2KO z*ZdHQ?-JxB@*8GAHT-5;l-o^;3>WOT@=L3|z*#}g0G9&fZ$oYw{S__of7gb;Vlkv% zk&^(YR8aB&ISbfxPAm}g|HWedw~yCf03h*ZpFP)?%#Zg!v7fIEWWGnQ>d^z6!!8vz z_>&%PK3g06RM9=2Te1{+gWf5qX|vbJ*`0spn(Uk+ zDcX2YY9eaV3BOsgJKjH7C~X`!u&i#*J>HPtQ4_Mss#1xb0VKX-qpeCqX?Ia1;ulp@}(Da7igy<>f5*Ot$w$y>h0yL zUVY$vol?OjA_-nXIKE$oa&xZaMR{Fy_73y+{o)v?@pBHu~f zT3WU@_#WyKOx18hhZ~zL_@zvV^FwV0xs`c1>qpvOQ2EG@O?EG??d{>u2yyaPfOYL` zNUq?$YhWCr3*N6O%I z@~#H*I39-R@9J&Dlu*F36CC}sR_c7}R=l^A=e`|hw-f|X=EX;NE-0f~EC&hMW1lH0 z<$Z)qe!vo9NXY^ZlHuB0mA?{_-(gX=1;UBv6!d{u-|DyI`AF0s*D-qFla!gJHLT`i z;k_`1LYs=0Njs;XjKAT>XNcP~dvhH~IhhPf zS$0)+Z1Sf@A=b%y$r(1>Gj#Otvf>JGVavjxob&mNm3liSRPHz%wZCIYYta*b=efKVTtmt#f=TG&= z%5>tO@abN%LA8mANg1uOKw3w>S<=P5f4lv8#|maN&R~9~XCaxYJ&M)aJ$WfLtBg7)f*1OuV3^$P$_!!^HN{7YwCK-ReY( zR=rg0?;r5xDfiHC+T$MP$le&f)ZEWnu$?(Hls9ep$Fx!5XCFpvxv_-2=6d7Srk@NYo;y4#j5EBt_GQo@@kdUukS1?FvcArMDfbc1_Y3Au2pz)= zQg*GV>eBne?%}1@;)lua{C$KrK5U%ru)K))embj%Ka{V2ReRJD_w_I`@huMegR4}V z)Ad=ohkdYAlV5ErXUM^qc1%e4m z^|y(=m-*&7>c>Z#;)ZQZCAaT5mXb6Ft|#(NA2KuzHkJ=k`#6|2Hu?U#GwoYm3eS_i zmvLI_%mfcrAGH38(;#Zx&NGGD?optf*XEfNV!_G&(mR$;?;f{rb@=-C|8_?Aa6 z23gDwDzhuxYfKE?=XS?&NFx1VoIz&Q=&x+5tty_6+PRG1zb6&dNwT}N4<#(iSJTcT zfulg6#i>C_xNshGg)jjG9^NCTB}FFLn(N3WeSC%LU4uGR>+*kE?!5b?nXSv)$)u%HUW8VjcYZm{kLd>uZRlyUE05$uw>$6KBGfU5w=x)!VKkzl zYy=M*FUAnlj@Pxw={M+|Qd?nhhA-AHu{l=Mex-T`>4wR7{Il*TJ5JxzP5tnIy-S{9 z?SYX|lQNZ@#T?Tt`r@30G2Ms`f52Y0d8=L9^eo?nG_<;D-AD(IJE7Cs|7)|x$Rn3( z#13s(A8=-m=6% zG}PC(N^zj;(9$BHZ*#%2ql4$lfMwrRf?vFWS9gMQ_OG73)`o@+l7g*Eo6eExfn4#j zl;)1jrHZ~t_>^#%R@c7gHe*Iu#toLt8=VC?4`piu%C;~e9|$*O1}qaXJKD zN#u@aMvh;7N`G?@Ra1r5Xpadgjc1+=CZsd}DjMu2TGwl&@UpnZw9*FOU|9V=L{Rf; z$g8f^2?!J8*ehDrb$Hi|^@kE2Bi$may0ZnEnqk*2YiP z9NL zmm?8Vg|YdSpLuE$gTvaTsAv*QF~vQQfrC~-QO3$N7B0p~r@VD0Rpis{mV46)S?zp$ z(`-ShZD&Mm-M?x$=aO!|+F5iPmQS)V>d)eaj<7gn9rIf)Oz!7bIacy+f^aX>D&U=C z>FO1<9Q|sygZ|tYf<>4C0{+;rRGIENjex3@hoSY%tph~d_q|IiLA2($e08ZgyWPpHjyxysR}l-(5b?|Ut5D9X z#$VTeN(6^>yh$7PEY>ob>M0JcoYcgbKJ`laOsMjki()X3bB?Q~kri1|WV)qUiv3QN zqU}7I=jUwG$z9l^A~N^n!{C)$wSK-YIb`OLF21AR^aD1yh9ONfhLVcYhz?7nwr;f_ zA||++nqJ4Tq&?pwXp?4cpu8(KcgV`Yr{^m4@zL3iPzxZ!u57#E(ii1~T4iec0p|H{ zQa?Lzwl>vw*E6O^sa)=H%`x)1l{j_#zG*^dTpyNhmftU}_=r&{wkRvASbt684i8w? zb{6W$tK9DDSyt-syYIk?mNN|Fniv|DblLThZ`qT!6#+q0Ba?j^wBBG`W<6VSisGq! z@TYNz9Nw{uBitrgVxuJ97s+Vw;Uq-9DPbnIFv>aM1WJd|DLVZFh9-i>d= z%VH#xE}tu1*Nh%DwWd$kXDH8{ZXtB>PcOfW3!Z$nGb|=j)`c8lT3A^cPRx@&AT=@t zG2nPL>JLVvVoCEFm1UuIPv|;4_2)5|65kKsGw9j7nlZbEuKLN@U!NRwep|evsWQ%D z`#>RthE?mj!b6cIy|f;|Ldm^qM*H_LvkC?bCaUS49rb=Xe|{^dgumXCPFl0PAj0h{ zs_$T9#&S?=8Dxg3F6|O*WN<@MzOSnyoayjt)47$1d)MGZU^z2js^{$DmZr9G zrG~qd_}Yf@)>xB9ehhj9S}Wr62QJ=ZbQ7$Fpo>R`ATH&Yo@;k>xBgUPRs0 zv!9ly&0OgGO0z^_9J}~)28!mw*8eDSvM-cWbXN1Co^5TT7YTDJ_#_z$-+#67-3>1g zULsmMWl|PAUIUK{;zGnlR4o0B^!aEV$q{4UI&hQ4LwIQ?v6bVJH-AuHq5?Z!nK}e- zrndf$_`UWNF7;*lSDf5XLLDMI?rXP~Oy=ZAGueaU`FhYt7*?SXCX$SQepW30nE&bx zJq;{8DYjVB8lNY1arVL6CWSf&kq*O_I9FFCyy~=uDC5u3L|U5Ak{Dd!`wfPcpo=lb z_Ome!_~W(q&%&*OD=1?x;o%3JlTx@hp*j>M@{L{JDGiQRlscv+j4=&A1aONc^HzMG z4C2#{34(?1OJvP+8a{FgNwcr7z)YJO#k^8;9+&-~_t`Pf3n(68J7$gh^!*D48LxG8 zTqVn~OC4v%D=M*YEe_5f5!NP{139|jESYI zOgdkyimHE1OT%^`9s5BPbj1D4v9pwaT5p;5XqDW`g*YE-ZMx^W#bcO`b zn9UcLh1DfDHdcSVGgCbj3dQ)dqz-naQA#eZ=h#}fuzY4!y3mvk5Jql&S41wkQ>SFE zhCjiJfJ#hJG00|}L$A}gOEnp^c>gc)TmL@==VWs<5mYCSeik16)H&YLIi7j{N+|Gc z;Ckj;P!HOcjDV5>X^}AheSF&L%1WL0_D%abNjMaK9WD#M54W=ctt8!m%@#qnn}>VN z3fhk1>cGhvgH9-$21)bkhK}Z2*9-iyddj|!usQMqBqlu`#|9R^x|l5i3QHyz+aMsk<0w#+7x*+0Ah+< zssiPyP;yBLl#s}kAVB|N2Nfl9-IrVi22fXW*$3eC=N_>i4rA92n*dXw%5RfeVSf;{ zn=+wxe7M>*5|%%eF>w@vQcDUL!cO?jn=2gg)=@v1et!W15iGt4o9jUx?W7$7{L}Hy z^j43QBpgj#WS!HS37H^a1$x_?BT%(1d|IiC3ijT6E7!`%b2?RBXcJUWU+W~a3gh&D zanWdeQWslP)LI5~27*G;1@b%ODWgF_?4JLPytmCU;PBLJU1FWi%q73Umq~FM>>;W0 z`2B(VaKm1gjqxwXQpXfhP6I3I@(L#_b>U`RY%(vltT1W9vo)<|=7KPmzN-d`&rIo$ za0QjMuV<{{C(~>v3vxT@&5ic!=7$bPG9nqYeWEP&!9a+-L!(fa&l5pX z?el_Kt~Mw?)E@O)E5>Ps41xH|X>>%(jq9B9e_MwjV>0|DM`U2cH-(I2{^2|1Bk^O( z{x-V$5&4zw|Ig0M|N6LLM7ji7eSax>mw)(nP8r}mA>y|`_R%MMky&YycgRcmA5cgB z@3+4Qt7vFw00{HaQks9kLjiQ-qt5`{P7M4p&8q{c(IJnuaX(P~rw=Ro1M=gUb$im^ zL78xkk1qxQ5QM|~*N?BDYXmTnseqCKP#J{{NBgtwafJXG8lp=GJkQxDl|Dj2245-IieZ>`tpZLFlHvlH3uCC6Y&@5{gJb0Z9$~=Er&%5Ck`o)Ek(o(XS zb6Zshun+JQz-w+TS(3+dQf6jiA|vG8&y#1N3cK>Rt98Ca;kr|hA^CK=DEK>$N%TfL zxJjJy1YQiZ;olL+|7cOheV_Iy_)PcNO{9)`yn(Lrv-7mGH%gs6K0x4CUDrngG9k~J zYr-8gd>O#oOL%^Vd{#=_{!Fb=xHfK?vk ztXXzhu!51!a41u*(jnu49XbDn0@j)9k}cl<$YOtAWb?f0aDvR$qrx zGM&$Odcc%ogf@K5LkhWCpl%Y#));pBRw$jl>=kb+A5*XCwjytPM`zfc`&xS@AF^2k1NK2rUmp|>0cu1{CviA;s>uQ*>sY^ao89ow0d(yX-}bU-Uuq_Odt zRIdv%6?pDkYD8ed0yz9dGundU3?;BQtINPs@t;1y_+Qn#civ-|-7nGBXwK)doFyzf zKZ24z5ecxsWi~S-zJXlEbFggV+=}C}R1sUTHbx8OV@jKxMXxfyQ6wJ0@tkkw+DZR1 z?)Jy{&5g1aHq*>SF}}^ZV3uINfSy&6#`S8c2qM3T5hV?n`rY? zEKCOLj8|80JMEUJjGK8s^?Ekfi02tCqzF(=a&f?o)wHPrPKhG<6Cgh+*RTEoae6`i zG>nMf(QqC10E#Id27vfd1h7d(>)f_MhNf%&cy(7kJ9Dn@xtrC#GRM;l_KMj zD({yFI_V~6WbRK_;wcU=yYkA~+S>B+Xah>&v**zvQCi|AJ6~AEXPxtdgr%QfOgy=y&X-ZDF%GXgey z&c~;t!esfQ%l6pfJiP_{W$#r;9AHN#HbLw_z% zo5-A>hpiwL&oe?l(Kk=9=AwEpz0xi)L-}y62L0I&eRijxkk@Kg*7DFXsyPbbBR}kL z-UZVZ%M<2OWA$e^3({k0WjWN>Q|<&;hSc$vN<9pmo98kAIj8r)@rwF@e+ow4$Boa# zh}c4C>?(|`m|fnFpl5yF4k%|AXg?K~sD))cGN5l79Lw=)Uo`vL8y=9?-Q~l@Ko7tA zFw68}TEprr<7OeEL)-y+@tV|*FM-{C)=~C}`FSKMaAneoOeLx!sF*1u_s@fhdFgG_ z^t8HE!_8JpdJZwO0$;7{Z#f;$38TFZ-nGMWTNutr6@R78b zE2TVtHlEI}e^!GLR><6l4jX}U0hpuW{1_xh$c+FuhfT~ci8IJXv*wmsk;Hm zNq2JO3`uPQCPtgcoGK+1W&5(Td`YLA3_$?%0^M6w`aawI=AXum;eO>K(ci|xi;ry0 z>6`iP5+-lqi^D=0^F&5ULaD-KCTu|8aj~MTmU`2^B5=9_RbhO0y_=F%Y)W$4a(-!< zcq)QZW{|^ZWIXSe4mel5P&$e=|3mz+svsTM*G<2O(8)4@M ztFkpVVWYHvSptK^fet#OwGr-e)}x04bg$-;pETDS@wE-4C-a3HgYEBmPn#MOm#_S) zrX-me<%%Q5&U*4pWO?a>FRdU(4-xZ~LC&ACp zsFg)vK$m???r5UPasN#0q|bBSeKtTeTQNc3*#G4{ew@iWUc2qS?ltg$$wh!srCv_E z0S66xrG8oKXv^KHk7VHf+BP90w^!unYI(7-C+RU=sZdd?Yx zP&}yOGlkpVNKzG<4Avmkw0lqHp4I#LI6AHYKS{>7?JpIY*ZUIBLw=N;E7$rv)%Nf4 z_=ii4kq>rCW33JbmguC(oBjpBr`(`T9*;tz@9S4Up8Gpk zexds{+uyDN7BK#AsCzOE_L2iv1No*>T}nU|BvbkS$|l5$*Z$+rd-z=jhl0!}?3*KT zctEwIZdt~6M5f?*)?~FAPeB0Uz7JqA-{;@-UBU?p@tgT5)Pa(9!I+)7IHyNC407ul zRyRo;3t-e*d=V4XQ4M2f;`p&MEEAsCj4O~Ie+om(xkYf5)Q+NT*$4E*Mf>Ueviyr7 z)0zjQ;&qQ!hx&fsp#{oST8#IdO8OrlC~Udp{M6>g=Jq08X>>l8jYr&rZY0Yg?|ibY z3Nz&KC$LaNqf7kaATIk4SK$u9j7XaD#w|%~AT$4#;#Wh6iOcBZWA&sTWMJsB7R5oZefySbVEHC z@+~}Zky^*#r6`^&uazqncP6SxX!}o{?~)fU*Ftq1(TJ7mKOaM$W65iYg4eWp&MDqC zriuHSksm`ZtZA+fx)@`s9sJ)CEaR>31V7qjdl36_^!N<~j#r2W!wuw)z9>a-H{A(KAdo|&M?IOMD?oH3;gg6EQdo1~G20(^ zc;tVB#Iu1p^@10kwfmYZHl+56Eoq8q>VA)(g5M!O+WkkvLy@>i`ui{ad+y#za`+=S ztnnj6 zISPmq@r3n|e(mlWK(-etk~tt_wPbwN-*|}sNO?QRDep`xhCEghnHeGwMFzyif(#uH zK=ukTryv9lGTK#oi;YbGXz~JCKOlI12Rh($lCGzpzq@7-MXnk!?scY+l~4MSuWyrgKW8b^gD-8g`e8#H-FAooi(V@RsH}7a{Z-<$G0{O?8I+_x&50B2SRE{+4`NJdUVr?gKKQL0ZJC3q zqd1~%b7OK_q*gqfPT^a0VZE1|Y&;mh!K*xF&|P}+)$d=xUlL-pb`i$Sx;Vf%n7Q1A zU5#1l{9=Wf-XFVqMdo8u=aW;hD*ESpmiB{u*6K{5D+7c<$5-Vs@Lm~+HkmPOZ6w(Q z72#_8x}1?9EHokXpib+-*v+3m_STNh+7HVysQV^G$Lu~Xc-S6(#qw-eaXOw_e&PxP zD&EiLX4>NcJGL=q`H?5hd06+h5G=pEQOl*`O2mbvcfBV;^>^*@dVfDPNk4u2Gu7{Z z+V3Za(P^A+pYLUQ0(hh~CRo>~*6jhyc+WgIT=}4z_i%XEYfrtaQ^UXNnc^J(;A3|> z5f4RSg_Ku5PkmqEOf?LX{OK@_XMbb@BJZtY@kB&?!Ty`VTAj^UeBDdmW)*YexI&9N zkM1X|>@*&g?o5m0d&LKwOy{-a1`U!^vZHYyzx2JcPOb#cJP}37Jwldc`C2iAV9g$3 zO=O=K1wGL!@t@k+>$`R|>?^)nA!LYqX#Ta(<=OmzuP@y4Gz+!7alveV2xw4?2;+9W zO}-XoHPm<$DVQUCy_GiGnTg)NB?MDcHIaYUP{o@ayPF6eNT$#_sDJ~G4|n| zi{i9MuUQH6n_(X-^}0X?AO?eug+Hyzqhh&R_P%TQS^iM`pjU$6hlJCY!-7uFW<9O< zD;l?^%rI5L6X6lw@%a%UVZ~|n^PbTaY26(4uhYa`68KF^Ekwx?_sTraS#g=!XG0kn zVctg1iK-3ECgDvOLEf=$tfSbT=|EthLJZZbYO%CM*}oMlwyX zA=XOyX>gC(&&&lj)?=r4Rlj9Ds~%vncM#rqGK9Uvmj`$7HbaY#sVOB@Y!11|uA0O! ziMh0Pc0LkG9qRA>g2+i0u#-UpAi&&?JyJrXFRzQbu(@soFbTrPmK2}r^7{XO?VNcu zoB1Bb(`u`&U}j1y)=@>3LG6^9N^N85SV}Ze5<(HR1XEiVt*se?)K0Z_Q(G;ec1>+1 zc0wpqnxcYgQAPCrV(#42d(J)goO|Y+d;hurCg;3)^ZwrRzR&M@zR%}o|Jd9koq2D0 zK~@u?^0f3hr8M(xHCjf#zcMI|R5k4G(_lZC9=W|n@S(903$o32Iqy8l8J>h@xKht1 zf+CO2!o#n0Dz54`JEaUy-ubY~%X#I@Cr*!8HFenM`%vX+xT{h_tx1jK()pg6am$b* zT&@gtPS;&UT>94#H^<6}ZZ0RkebA&W+*^&(Zg^Ix^y-nG-~~6+sV`d6jk?!D2Fjc> zT(*N$=r^a^>>iLZl}%lJVO3IdDgp|KfC;JSwm&qmdMiw9xLZ8h|r4N=XnQddnu+Qxfly+PzJtH5(R_?}foT;e~+8D-t^;ZNDO(^PG!3l%OL7}A6 z=SJ6g32Hfuzqx7Jwi=>4mUAeVf&yXDquY=SlBk94!xZ7I2i?t=}1_JUC`8Z+jciO&}JlBDrl|2U-oh zpY3N`P5&nIVh1z--A=&&0Sf;!fWnzRMWR>3Dn0QRQ8vxb5Xdr547Ugh$n)mUHX%Z4 zlcqvynSc0`5uR4gDSVDowH6j;_7@@oztDZ99sn<&lz<*ngGU7J^d?HRT7Nu{F9`$* zVCSGGa-n!e%xB0@Xti9e?<~4f#^y~~4iq z=%H)Tf~496Y)Yj1jHXer*|uBk`C>d-0#g3US%6HR!tWeN}?6{2>EU~6lmT8 zCFIqCp*IA)kAb~)=T+j#i%vVYCHwft7kw&GwBjR*%G)kwgn{-A``->g$mviDIa<-N?CEMO3M2trN)M=^%IrEiC(ES#A|ND}k3>RIz8=@bG157=FaXXPYoP#*{CVEHP^ z=$}{>#4sxvottig>Q6Ft<@WE%Tk?Xk>5W$`p7x&uIV;?h3n zFfP0n%*E&+wb)hEM`gm0BoY}j*7ZKIe9BV(ejSvQRJG*!II9pghs>GX4?&uNH3CSV z%Y&4p*U9SH4c`#k{3cZ#+_SPs&MBAx_;q6|5A3lXxP2wx5T}&=VchzYE4w_V*E<#M zznDdGu?{R9se6y*gs4SAIXqq-UFPynfLi5UzT^*@*5ECQo}olKAA5KRhm2UA*nzY} zK{+A?ZXR<{KC@8LrT9vHQhw`19OSl{1gNW#rNB+o!{#gjtD&3$TyfLd$LzB4S2PfS zjS?0X&IQT$g!Hf;5b<7r5=e9bEbyy%>Q5QZUD4cpYh{WJ+Zr?fv#h+mr{uw20n~~1 zjs?Q5$eZzO#7!j=nCH*%9k()}kTErObk_fv7tP*8^xoy<1@J5B_ODX4pymXyZ$AwT zfaS@+tu;5W{q_#rBVBnMVms*E)gVx;ti*rWWxbyP`})PnLV#WQ+DIt=$X@{p>q0+F z_5u6ibvw@|K}ZYsJ2vS>Sf;V+dDC93$^BOz*LTiL)&Y(Tjfk%i3GR>>4_=|tkhasW zOeWqk8-v%^)u)jo`ys!BaRFRxin>cfs0T&4r=-TgK{*v*tEx=={O2(%jZZ#LL^Gq{ z{YPC!PX&zBiyjY^kTd;R@PK1F2p#WWs_oDBkG+8^i+Fm4tR1tN`n#|f!Dy$Xlwl4F zA1p!A(qmG``pRb`X??f>8#!7AplLM(`D@b~KTS0S`QyVzpB;O>M<@~kSjt2mzH_jb zpFYelRX%tPfG4tt#xNOH1_DmE4~)?6e>DkyNR|&6Ta73(gfa?0AK@g zwC(o+MWZWV>ij$vY5wVGok+S~`64=?4D$&g5i7f!ePLsyczl-p0c{vqV+N!1zx26* zFH^R&i8f@Kye`hFWo<<+Wl>#cuM6pO>&(k;hO|8H7VpNE5n82ZyW~yX8&G%?ov5t# zeUXiIr5jWA4|{Fnf6SKB^>aehxf~idmb*G9(U%k&a`dhF7IP!SX*bBldUgcybhn#u zs3i|%GeG=?>4$1RNC-^Sb{JDV*OZ=2CImC;=Mp_EmlOFPm@sfZL(iQys2!u+C^L9^ zc4LTFil=x>rhxi8fufowk`unKBfcuDrap18pNJ25nS)j^bFWxY+=a1FdX)iX zNG~9E?D8~zFa3zoR+d(YDtKhqzIk%7M3-iVi;D1Y3^iD~b2%QTV+A6jd(ve)F4dphUm zm7PTCeuhUpBcfkC?me-*q?qIc7rZodnfZ9Q#}AxXm%N#~&-DAxe#PT_*X@aL_b*V4 z?t(WpdeI+P^j)@18P@pzykg6Z$!naN=LqJ(6uTmQDP?{my*_PcJ3a=51Pz z8(F3G-5Q=x_VAq?W!^R98R;H4p!HR>Dr3!pwidM2&-$d4yYqO zB55?rvukT}K~v4+ zOqLBx6_vW%W0->ct=qK#CdkW$;A64q$Ahs;ge7X&i`5Nt^#2wr#rbUedZ^) zw9hGg%&iAZqDQjyEo%QstgAIpUhfZ*zlJQ_S+Vk;yb_ z##gp!ki3c2gNz;i>mw(BA>;g)ZaK-SQ*n_Aim2Yci>`5P(2uJfV$C;JPXbs8M8iZp z^d1{FiU&5hLi3K&KYjRdb9EMEz3kZ!h^q{{^lJV9O*hnZ2wlHSXE#*U^p>yPN@Z-q zq;7ydo@-WU!1l(He-L|A=V6?N-tyrE3Fo*fx4bs!(E0o0V3q`sSOhpg+c-QV+ZH@o)-1(sc;_Q{1D6HY*fZ3qC5o~!W|yJD^=28Q2+Z9DnI?d}1DYx~)U z@c;rF*1zz?woGq@4XjiI|7FAqT(=x9x0BBIEwiEQqnb`NdK_$FRQvEeBlU literal 0 HcmV?d00001 diff --git a/docs/images/azure-key-vault-secrets-provider-add.png b/docs/images/azure-key-vault-secrets-provider-add.png new file mode 100644 index 0000000000000000000000000000000000000000..d503b3c892d6d64dd8da66c73c4bcb094ccfd51b GIT binary patch literal 20437 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 PATfBl`njxgN@xNAC!&TK literal 0 HcmV?d00001 diff --git a/docs/images/delinea-id-secrets-provider-add.png b/docs/images/delinea-id-secrets-provider-add.png new file mode 100644 index 0000000000000000000000000000000000000000..ffad4c446c3c599f3a3f47ab645724df4abd16b4 GIT binary patch literal 20744 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 literal 0 HcmV?d00001 diff --git a/docs/images/delinea-path-secrets-provider-add.png b/docs/images/delinea-path-secrets-provider-add.png new file mode 100644 index 0000000000000000000000000000000000000000..8517924551833e98f3e6d38f1067951791b96be5 GIT binary patch literal 22178 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 literal 0 HcmV?d00001 diff --git a/docs/images/hashicorp-vault-secrets-provider-add.png b/docs/images/hashicorp-vault-secrets-provider-add.png new file mode 100644 index 0000000000000000000000000000000000000000..2512117ce2f12337d6cc813539969e0683aa4dc1 GIT binary patch literal 26665 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

I1A|V1gCVLvNq{fZw6qWi m0R93ang09z1T(3g`=R@%k3Z>Qc^ literal 0 HcmV?d00001 diff --git a/docs/images/icon-nautobot-secrets-providers.png b/docs/images/icon-nautobot-secrets-providers.png new file mode 100644 index 0000000000000000000000000000000000000000..8c16101914d6acd4a3b36cb061beac2761b0b494 GIT binary patch literal 7993 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 buW$9bi_1uAssSh7AdrHL>YE~|cmDqe;n1p! literal 0 HcmV?d00001 diff --git a/docs/images/screenshot01.png b/docs/images/screenshot01.png deleted file mode 100644 index 5bbe805eef1bcc8efc2fb49674c99d130c01f9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58517 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 diff --git a/docs/images/screenshot02.png b/docs/images/screenshot02.png deleted file mode 100644 index ccdec3972b25ead868dbb45b80a2c5ceb6590025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19096 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 F0swUS$mak6 diff --git a/docs/images/screenshot03.png b/docs/images/screenshot03.png deleted file mode 100644 index 51224959dac5e013057ba9a151b3ba0e76a6cb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61386 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


ymf!o^vUP@!^Dff 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 J`_PGe>u*A;2XFuY diff --git a/docs/images/screenshot04.png b/docs/images/screenshot04.png deleted file mode 100644 index 957c3ff8c08d4f8950ae44884841993eb2cfd079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82010 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 ZZ)Pfx+P8^wpl)EgenszcfyS+%{{m7wzG46X diff --git a/docs/images/screenshot06.png b/docs/images/screenshot06.png deleted file mode 100644 index 6786f15eb5b74e878eaee2864af785a4e0aa4b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45558 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∋2fZR;;hRN#*eFu#VCV$&4IGXPtF0{Cn@qm`T0Lr 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 literal 0 HcmV?d00001 diff --git a/docs/images/secrets-providers-installed-apps.png b/docs/images/secrets-providers-installed-apps.png new file mode 100644 index 0000000000000000000000000000000000000000..e86dd7fc4a7249d30f0d42fa937898f788aed357 GIT binary patch literal 38131 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

rVcS$eV|?xmKl7-@GhZG5l> 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 VQZ+*X6AAcFRY?m{pkQ(D{{VmJDRuw= literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 303d7fc..f8e5c92 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,36 +1,6 @@ -# Nautobot Secrets Providers App +--- +hide: + - navigation +--- -This document provides an overview of the App including critical information and important considerations when applying it to your Nautobot environment. - -!!! note - Throughout this documentation, the terms "app" and "plugin" will be used interchangeably. - -## Description - -Nautobot Secrets Providers is an app for [Nautobot](https://github.com/nautobot/nautobot) 1.2.1 or higher that bundles Secrets Providers for integrating with popular secrets backends. Nautobot 1.2.0 added support for integrating with retrieving secrets from various secrets providers. - -This app publishes secrets providers that are not included in the Nautobot core software package so that it will be easier to maintain and extend support for various secrets providers without waiting on Nautobot software releases. - -### Supported Secrets Backends - -This app supports the following popular secrets backends: - -| Secrets Backend | Supported Secret Types | Supported Authentication Methods | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | -| [AWS Systems Manager Parameter Store](https://aws.amazon.com/secrets-manager/) | [Other: Key/value pairs](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) | [AWS credentials](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html) (see Usage section below) | -| [HashiCorp Vault](https://www.vaultproject.io) | [K/V Version 2](https://www.vaultproject.io/docs/secrets/kv/kv-v2)
[K/V Version 1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1) | [Token](https://www.vaultproject.io/docs/auth/token)
[AppRole](https://www.vaultproject.io/docs/auth/approle)
[AWS](https://www.vaultproject.io/docs/auth/aws)
[Kubernetes](https://www.vaultproject.io/docs/auth/kubernetes) | -| [Delinea/Thycotic Secret Server](https://delinea.com/products/secret-server) | [Secret Server Cloud](https://github.com/DelineaXPM/python-tss-sdk#secret-server-cloud)
[Secret Server (on-prem)](https://github.com/DelineaXPM/python-tss-sdk#initializing-secretserver)| [Access Token Authorization](https://github.com/DelineaXPM/python-tss-sdk#access-token-authorization)
[Domain Authorization](https://github.com/DelineaXPM/python-tss-sdk#domain-authorization)
[Password Authorization](https://github.com/DelineaXPM/python-tss-sdk#password-authorization)
| -| [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/) | [Key Vault Secrets](https://learn.microsoft.com/en-us/azure/key-vault/secrets/about-secrets) | [Entra ID Service Principal](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python) | - -## Audience (User Personas) - Who should use this App? - -- Anyone who needs to retrieve secrets from Hashicorp Vault, AWS, or Delinea/Thycotic and use them in Nautobot - -## Authors and Maintainers - -- Nautobot Core Team - -## Nautobot Features Used - -- Secrets Providers +--8<-- "README.md" \ No newline at end of file diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md new file mode 100644 index 0000000..6edefeb --- /dev/null +++ b/docs/user/app_getting_started.md @@ -0,0 +1,15 @@ +# Getting Started with the App + +This document provides a step-by-step tutorial on how to get the App going and how to use it. + +## Install the App + +To install the App, please follow the instructions detailed in the [Installation Guide](../admin/install.md). + +## First steps with the App + +Use the newly installed Secrets Provider app to configure a new secret within Nautobot. + +## What are the next steps? + +You can check out the [Use Cases](app_use_cases.md) section for more examples. \ No newline at end of file diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md new file mode 100644 index 0000000..68316c7 --- /dev/null +++ b/docs/user/app_overview.md @@ -0,0 +1,18 @@ +# App Overview + +This document provides an overview of the App including critical information and import considerations when applying it to your Nautobot environment. + +!!! note + Throughout this documentation, the terms "app" and "plugin" will be used interchangeably. + +## Description + +The Secrets Providers App enables direct integrations with Enterprise secrets management systems. Provides patterns to securely fetch secrets for use by other Nautobot Apps and Nautobot Jobs. + +## Audience (User Personas) - Who should use this App? + +Network Engineers, Network Automation Engineers who need to enable Nautobot to securely retrieve secrets from a third-party application. + +## Authors and Maintainers + +- Network to Code, LLC \ No newline at end of file diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md new file mode 100644 index 0000000..e24e158 --- /dev/null +++ b/docs/user/app_use_cases.md @@ -0,0 +1,35 @@ +# Using the App + +This document describes common use-cases and scenarios for this App. + +## General Usage + +## Use-cases and common workflows + +## Screenshots + +![Screenshot of installed apps](../images/secrets-providers-installed-apps.png "App landing page") + +--- + +![Screenshot of plugin home page](../images/secrets-providers-home.png "App Home page") + +--- + +![Screenshot of secret using AWS Secrets Manager](../images/aws-secrets-manager-secrets-provider-add.png "Secret using AWS Secrets Manager") + +--- + +![Screenshot of secret using HashiCorp Vault](../images/hashicorp-vault-secrets-provider-add.png "Secret using HashiCorp Vault") + +--- + +![Screenshot of secret using Delinea Secret Server by ID](../images/delinea-id-secrets-provider-add.png "Secret using Delinea Secret Server by ID") + +--- + +![Screenshot of secret using Delinea Secret Server by Path](../images/delinea-path-secrets-provider-add.png "Secret using Delinea Secret Server by Path") + +--- + +![Screenshot of secret using Azure Key Vault](../images/azure-key-vault-secrets-provider-add.png "Secret using Azure Key Vault") \ No newline at end of file diff --git a/docs/user/faq.md b/docs/user/faq.md new file mode 100644 index 0000000..87b9930 --- /dev/null +++ b/docs/user/faq.md @@ -0,0 +1 @@ +# Frequently Asked Questions \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 39f03bf..2340e39 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,7 +2,7 @@ dev_addr: "127.0.0.1:8001" edit_uri: "edit/main/nautobot-app-secrets-providers/docs" site_dir: "nautobot_secrets_providers/static/nautobot_secrets_providers/docs" -site_name: "Nautobot's Secrets Providers App Documentation" +site_name: "Secrets Providers Documentation" site_url: "https://docs.nautobot.com/projects/secrets-providers/en/latest/" repo_url: "https://github.com/nautobot/nautobot-app-secrets-providers" copyright: "Copyright © The Authors" @@ -102,11 +102,37 @@ watch: nav: - Overview: "index.md" + - User Guide: + - App Overview: "user/app_overview.md" + - Getting Started: "user/app_getting_started.md" + - Using the App: "user/app_use_cases.md" + - Frequently Asked Questions: "user/faq.md" - Administrator Guide: - Install and Configure: "admin/install.md" + - Provider Setup: + - "admin/providers/index.md" + - AWS: "admin/providers/aws_setup.md" + - Azure: "admin/providers/azure_setup.md" + - Delinea/Thycotic: "admin/providers/delinea_setup.md" + - HashiCorp: "admin/providers/hashicorp_setup.md" + - Upgrade: "admin/upgrade.md" - Uninstall: "admin/uninstall.md" - Compatibility Matrix: "admin/compatibility_matrix.md" + - Release Notes: + - "admin/release_notes/index.md" + - v3.0: "admin/release_notes/version_3.0.md" + - v2.0: "admin/release_notes/version_2.0.md" + - v1.4: "admin/release_notes/version_1.4.md" + - v1.3: "admin/release_notes/version_1.3.md" + - v1.2: "admin/release_notes/version_1.2.md" + - v1.1: "admin/release_notes/version_1.1.md" + - v1.0: "admin/release_notes/version_1.0.md" - Developer Guide: + - Extending the App: "dev/extending.md" - Contributing to the App: "dev/contributing.md" - Development Environment: "dev/dev_environment.md" + - Code Reference: + - "dev/code_reference/index.md" + - Package: "dev/code_reference/package.md" + - Providers: "dev/code_reference/providers.md" - Nautobot Docs Home ↗︎: "https://docs.nautobot.com" diff --git a/nautobot_secrets_providers/__init__.py b/nautobot_secrets_providers/__init__.py index 538614d..748e0de 100644 --- a/nautobot_secrets_providers/__init__.py +++ b/nautobot_secrets_providers/__init__.py @@ -12,7 +12,7 @@ class NautobotSecretsProvidersConfig(NautobotAppConfig): """App configuration for the nautobot_secrets_providers app.""" name = "nautobot_secrets_providers" - verbose_name = "Nautobot's Secrets Providers App" + verbose_name = "Secrets Providers" version = __version__ author = "Network to Code, LLC" description = "Nautobot App that provides direct integrations with Enterprise secrets management systems. Provides patterns to securely fetch secrets for use by other Nautobot Apps and Nautobot Jobs." diff --git a/nautobot_secrets_providers/migrations/0001_update_thycotic_delinea_slug.py b/nautobot_secrets_providers/migrations/0001_update_thycotic_delinea_slug.py new file mode 100644 index 0000000..2109896 --- /dev/null +++ b/nautobot_secrets_providers/migrations/0001_update_thycotic_delinea_slug.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.25 on 2024-06-26 14:32 + +from django.db import migrations + + +def update_secrets_provider_slugs(apps, schema_editor): + Secret = apps.get_model("extras", "Secret") + Secret.objects.filter(provider="thycotic-tss-id").update(provider="delinea-tss-id") + Secret.objects.filter(provider="thycotic-tss-path").update(provider="delinea-tss-path") + + +def reverse_secrets_provider_slugs(apps, schema_editor): + Secret = apps.get_model("extras", "Secret") + Secret.objects.filter(provider="delinea-tss-id").update(provider="thycotic-tss-id") + Secret.objects.filter(provider="delinea-tss-path").update(provider="thycotic-tss-path") + + +class Migration(migrations.Migration): + + dependencies = [] + + operations = [ + migrations.RunPython(update_secrets_provider_slugs, reverse_code=reverse_secrets_provider_slugs), + ] diff --git a/nautobot_secrets_providers/migrations/__init__.py b/nautobot_secrets_providers/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nautobot_secrets_providers/providers/__init__.py b/nautobot_secrets_providers/providers/__init__.py index fbaca5e..dd18866 100644 --- a/nautobot_secrets_providers/providers/__init__.py +++ b/nautobot_secrets_providers/providers/__init__.py @@ -3,13 +3,13 @@ from .aws import AWSSecretsManagerSecretsProvider, AWSSystemsManagerParameterStore from .azure import AzureKeyVaultSecretsProvider from .hashicorp import HashiCorpVaultSecretsProvider -from .delinea import ThycoticSecretServerSecretsProviderId, ThycoticSecretServerSecretsProviderPath +from .delinea import DelineaSecretServerSecretsProviderId, DelineaSecretServerSecretsProviderPath -__all__ = ( # type: ignore - AWSSecretsManagerSecretsProvider, # pylint: disable=invalid-all-object - AWSSystemsManagerParameterStore, # pylint: disable=invalid-all-object - AzureKeyVaultSecretsProvider, # pylint: disable=invalid-all-object - HashiCorpVaultSecretsProvider, # pylint: disable=invalid-all-object - ThycoticSecretServerSecretsProviderId, # pylint: disable=invalid-all-object - ThycoticSecretServerSecretsProviderPath, # pylint: disable=invalid-all-object +__all__ = ( + "AWSSecretsManagerSecretsProvider", + "AWSSystemsManagerParameterStore", + "AzureKeyVaultSecretsProvider", + "DelineaSecretServerSecretsProviderId", + "DelineaSecretServerSecretsProviderPath", + "HashiCorpVaultSecretsProvider", ) diff --git a/nautobot_secrets_providers/providers/choices.py b/nautobot_secrets_providers/providers/choices.py index d7eb1aa..21f8695 100644 --- a/nautobot_secrets_providers/providers/choices.py +++ b/nautobot_secrets_providers/providers/choices.py @@ -1,10 +1,10 @@ -"""Choices for Thycotic Secret Server Plugin.""" +"""Choices for Secrets Providers App.""" from nautobot.core.choices import ChoiceSet -class ThycoticSecretChoices(ChoiceSet): - """Choices for Thycotic Secret Server Result.""" +class DelineaSecretChoices(ChoiceSet): + """Choices for Delinea Secret Server Result.""" SECRET_TOKEN = "token" # nosec SECRET_PASSWORD = "password" # nosec diff --git a/nautobot_secrets_providers/providers/delinea.py b/nautobot_secrets_providers/providers/delinea.py index 740bd5c..2eecc73 100644 --- a/nautobot_secrets_providers/providers/delinea.py +++ b/nautobot_secrets_providers/providers/delinea.py @@ -1,4 +1,4 @@ -"""Secrets Provider for Thycotic Secret Server.""" +"""Secrets Provider for Delinea Secret Server.""" import os from pathlib import Path @@ -17,7 +17,7 @@ SecretServerError, ) - thycotic_installed = True # pylint: disable=invalid-name + delinea_installed = True # pylint: disable=invalid-name except ImportError: try: from thycotic.secrets.server import ( @@ -30,34 +30,34 @@ SecretServerError, ) - thycotic_installed = True # pylint: disable=invalid-name + delinea_installed = True # pylint: disable=invalid-name except ImportError: - thycotic_installed = False # pylint: disable=invalid-name + delinea_installed = False # pylint: disable=invalid-name from nautobot.core.forms import BootstrapMixin from nautobot.extras.secrets import exceptions, SecretsProvider -from .choices import ThycoticSecretChoices +from .choices import DelineaSecretChoices __all__ = ( - "ThycoticSecretServerSecretsProviderId", - "ThycoticSecretServerSecretsProviderPath", + "DelineaSecretServerSecretsProviderId", + "DelineaSecretServerSecretsProviderPath", ) -class ThycoticSecretServerSecretsProviderBase(SecretsProvider): - """A secrets provider for Thycotic Secret Server.""" +class DelineaSecretServerSecretsProviderBase(SecretsProvider): + """A secrets provider for Delinea Secret Server.""" - is_available = thycotic_installed + is_available = delinea_installed @classmethod def get_value_for_secret(cls, secret, obj=None, **kwargs): # pylint: disable=too-many-locals """Return the value stored under the secret's key in the secret's path.""" - # This is only required for Thycotic Secret Server therefore not defined in + # This is only required for Delinea Secret Server therefore not defined in # `required_settings` for the app config. plugin_settings = settings.PLUGINS_CONFIG["nautobot_secrets_providers"] - if "thycotic" not in plugin_settings: - raise exceptions.SecretProviderError(secret, cls, "Thycotic Secret Server is not configured!") + if "delinea" not in plugin_settings: + raise exceptions.SecretProviderError(secret, cls, "Delinea Secret Server is not configured!") # Try to get parameters and error out early. parameters = secret.rendered_parameters(obj=obj) @@ -79,28 +79,28 @@ def get_value_for_secret(cls, secret, obj=None, **kwargs): # pylint: disable=to msg = "The secret parameter could not be retrieved for field!" raise exceptions.SecretParametersError(secret, cls, msg) - thycotic_settings = plugin_settings["thycotic"] - if thycotic_settings["base_url"] is None: - raise exceptions.SecretProviderError(secret, cls, "Thycotic Secret Server is not configured!") + delinea_settings = plugin_settings["delinea"] + if delinea_settings["base_url"] is None: + raise exceptions.SecretProviderError(secret, cls, "Delinea Secret Server is not configured!") - return cls.query_thycotic_secret_server( + return cls.query_delinea_secret_server( secret=secret, - base_url=thycotic_settings["base_url"], - ca_bundle_path=thycotic_settings["ca_bundle_path"], - cloud_based=thycotic_settings["cloud_based"], - domain=thycotic_settings["domain"], - password=thycotic_settings["password"], + base_url=delinea_settings["base_url"], + ca_bundle_path=delinea_settings["ca_bundle_path"], + cloud_based=delinea_settings["cloud_based"], + domain=delinea_settings["domain"], + password=delinea_settings["password"], secret_id=secret_id, secret_path=secret_path, secret_selected_value=secret_selected_value, - tenant=thycotic_settings["tenant"], - token=thycotic_settings["token"], - username=thycotic_settings["username"], + tenant=delinea_settings["tenant"], + token=delinea_settings["token"], + username=delinea_settings["username"], caller_class=cls, ) @staticmethod - def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expressions,too-many-locals,too-many-branches,too-many-arguments + def query_delinea_secret_server( # pylint: disable=too-many-boolean-expressions,too-many-locals,too-many-branches,too-many-arguments secret, base_url, ca_bundle_path=None, @@ -115,7 +115,7 @@ def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expression username=None, caller_class=None, ): - """Query Thycotic Secret Server.""" + """Query Delinea Secret Server.""" # Ensure required parameters are set if any( [token is None and not all([username, password]), cloud_based and not all([tenant, username, password])] @@ -123,8 +123,8 @@ def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expression raise exceptions.SecretProviderError( secret, caller_class, - """Thycotic Secret Server is not configured! - See section 'Thycotic Secret Server (TSS)' in `README.md'. + """Delinea Secret Server is not configured! + See section 'Delinea Secret Server' in `README.md'. """, ) @@ -138,7 +138,7 @@ def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expression secret, caller_class, ( - "Delinea/Thycotic Secret Server is not configured properly! " + "Delinea Secret Server is not configured properly! " "Trusted certificates file not found: " "Environment variable 'REQUESTS_CA_BUNDLE': " f"{ca_bundle_path}." @@ -147,35 +147,33 @@ def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expression if original_env != ca_bundle_path: os.environ["REQUESTS_CA_BUNDLE"] = ca_bundle_path must_restore_env = True - # Setup thycotic authorizer + # Setup Delinea authorizer # Username | Password | Token | Domain | Authorizer # def | def | * | - | PasswordGrantAuthorizer # def | def | * | def | DomainPasswordGrantAuthorizer - # - | - | def | * | AccessTokenAuthorizer - # def | - | def | * | AccessTokenAuthorizer - # - | def | def | * | AccessTokenAuthorizer + # * | * | def | - | AccessTokenAuthorizer if all([username, password]): if domain is not None: - thy_authorizer = DomainPasswordGrantAuthorizer( + delinea_authorizer = DomainPasswordGrantAuthorizer( base_url=base_url, domain=domain, username=username, password=password, ) else: - thy_authorizer = PasswordGrantAuthorizer( + delinea_authorizer = PasswordGrantAuthorizer( base_url=base_url, username=username, password=password, ) else: - thy_authorizer = AccessTokenAuthorizer(token) + delinea_authorizer = AccessTokenAuthorizer(token) # Get the client. if cloud_based: - delinea = SecretServerCloud(tenant=tenant, authorizer=thy_authorizer) + delinea = SecretServerCloud(tenant=tenant, authorizer=delinea_authorizer) else: - delinea = SecretServer(base_url=base_url, authorizer=thy_authorizer) + delinea = SecretServer(base_url=base_url, authorizer=delinea_authorizer) # Attempt to retrieve the secret. try: @@ -197,41 +195,41 @@ def query_thycotic_secret_server( # pylint: disable=too-many-boolean-expression os.environ["REQUESTS_CA_BUNDLE"] = original_env -class ThycoticSecretServerSecretsProviderId(ThycoticSecretServerSecretsProviderBase): - """A secrets provider for Thycotic Secret Server.""" +class DelineaSecretServerSecretsProviderId(DelineaSecretServerSecretsProviderBase): + """A secrets provider for Delinea Secret Server.""" - slug = "thycotic-tss-id" # type: ignore - name = "Thycotic Secret Server by ID" # type: ignore + slug = "delinea-tss-id" # type: ignore + name = "Delinea Secret Server by ID" # type: ignore # TBD: Remove after pylint-nautobot bump # pylint: disable-next=nb-incorrect-base-class class ParametersForm(BootstrapMixin, forms.Form): - """Required parameters for Thycotic Secret Server.""" + """Required parameters for Delinea Secret Server.""" secret_id = forms.IntegerField( label="Secret ID", required=True, min_value=1, - help_text="The secret-id used to select the entry in Thycotic Secret Server.", + help_text="The secret-id used to select the entry in Delinea Secret Server.", ) secret_selected_value = forms.ChoiceField( label="Return value", required=True, - choices=ThycoticSecretChoices, + choices=DelineaSecretChoices, help_text="Select which value to return.", ) -class ThycoticSecretServerSecretsProviderPath(ThycoticSecretServerSecretsProviderBase): - """A secrets provider for Thycotic Secret Server.""" +class DelineaSecretServerSecretsProviderPath(DelineaSecretServerSecretsProviderBase): + """A secrets provider for Delinea Secret Server.""" - slug = "thycotic-tss-path" # type: ignore - name = "Thycotic Secret Server by Path" # type: ignore + slug = "delinea-tss-path" # type: ignore + name = "Delinea Secret Server by Path" # type: ignore # TBD: Remove after pylint-nautobot bump # pylint: disable-next=nb-incorrect-base-class class ParametersForm(BootstrapMixin, forms.Form): - """Required parameters for Thycotic Secret Server.""" + """Required parameters for Delinea Secret Server.""" secret_path = forms.CharField( required=True, @@ -242,6 +240,6 @@ class ParametersForm(BootstrapMixin, forms.Form): secret_selected_value = forms.ChoiceField( label="Return value", required=True, - choices=ThycoticSecretChoices, + choices=DelineaSecretChoices, help_text="Select which value to return.", ) diff --git a/nautobot_secrets_providers/secrets.py b/nautobot_secrets_providers/secrets.py index 6b2ddad..76f2193 100644 --- a/nautobot_secrets_providers/secrets.py +++ b/nautobot_secrets_providers/secrets.py @@ -12,7 +12,8 @@ # (meaning their dependent library is installed). secrets_providers = [] -for provider in providers.__all__: +for provider_name in providers.__all__: + provider = getattr(providers, provider_name) # pylint: disable=invalid-name # Don't publish multiple times. if provider in secrets_providers: continue diff --git a/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html b/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html index ca0bcf1..8020656 100644 --- a/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html +++ b/nautobot_secrets_providers/templates/nautobot_secrets_providers/home.html @@ -9,7 +9,7 @@

{% block title %}Secrets Providers Home{% endblock %}

{% block content %}
- Enabled Secrets Providers + Enabled Secrets Providers
@@ -32,11 +32,9 @@

{% block title %}Secrets Providers Home{% endblock %}

- - - + + @@ -47,9 +45,11 @@

{% block title %}Secrets Providers Home{% endblock %}

Access Token Authorization - - + +
AWS credentials
HashiCorp VaultK/V Version 1
- K/V Version 2
Token
- AppRole
Azure Key VaultSecrets
+
Entra ID Service Principal
Delinea/Thycotic Secret Server
Azure Key VaultSecrets
-
Entra ID Service Principal
+
HashiCorp VaultK/V Version 1
+ K/V Version 2
Token
+ AppRole
diff --git a/poetry.lock b/poetry.lock index 111eb6e..27fd91a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -27,24 +27,24 @@ files = [ [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] name = "asgiref" -version = "3.7.2" +version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, - {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] [package.dependencies] @@ -55,22 +55,17 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "2.15.8" +version = "3.2.2" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" files = [ - {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, - {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, + {file = "astroid-3.2.2-py3-none-any.whl", hash = "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0"}, + {file = "astroid-3.2.2.tar.gz", hash = "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94"}, ] [package.dependencies] -lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, -] [[package]] name = "asttokens" @@ -152,13 +147,13 @@ tomli = "*" [[package]] name = "azure-core" -version = "1.30.0" +version = "1.30.2" description = "Microsoft Azure Core Library for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-core-1.30.0.tar.gz", hash = "sha256:6f3a7883ef184722f6bd997262eddaf80cfe7e5b3e0caaaf8db1695695893d35"}, - {file = "azure_core-1.30.0-py3-none-any.whl", hash = "sha256:3dae7962aad109610e68c9a7abb31d79720e1d982ddf61363038d175a5025e89"}, + {file = "azure-core-1.30.2.tar.gz", hash = "sha256:a14dc210efcd608821aa472d9fb8e8d035d29b68993819147bc290a8ac224472"}, + {file = "azure_core-1.30.2-py3-none-any.whl", hash = "sha256:cf019c1ca832e96274ae85abd3d9f752397194d9fea3b41487290562ac8abe4a"}, ] [package.dependencies] @@ -171,20 +166,21 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.15.0" +version = "1.17.1" description = "Microsoft Azure Identity Library for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, - {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, + {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, + {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, ] [package.dependencies] -azure-core = ">=1.23.0,<2.0.0" +azure-core = ">=1.23.0" cryptography = ">=2.5" -msal = ">=1.24.0,<2.0.0" -msal-extensions = ">=0.3.0,<2.0.0" +msal = ">=1.24.0" +msal-extensions = ">=0.3.0" +typing-extensions = ">=4.0.0" [[package]] name = "azure-keyvault-secrets" @@ -246,13 +242,13 @@ tzdata = ["tzdata"] [[package]] name = "bandit" -version = "1.7.7" +version = "1.7.9" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.8" files = [ - {file = "bandit-1.7.7-py3-none-any.whl", hash = "sha256:17e60786a7ea3c9ec84569fd5aee09936d116cb0cb43151023258340dbffb7ed"}, - {file = "bandit-1.7.7.tar.gz", hash = "sha256:527906bec6088cb499aae31bc962864b4e77569e9d529ee51df3a93b4b8ab28a"}, + {file = "bandit-1.7.9-py3-none-any.whl", hash = "sha256:52077cb339000f337fb25f7e045995c4ad01511e716e5daac37014b9752de8ec"}, + {file = "bandit-1.7.9.tar.gz", hash = "sha256:7c395a436743018f7be0a4cbb0a4ea9b902b6d87264ddecf8cfdc73b4f78ff61"}, ] [package.dependencies] @@ -263,6 +259,7 @@ stevedore = ">=1.20.0" [package.extras] baseline = ["GitPython (>=3.1.30)"] +sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"] test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"] toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] @@ -280,33 +277,33 @@ files = [ [[package]] name = "black" -version = "24.2.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, - {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, - {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, - {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, - {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, - {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, - {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, - {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, - {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, - {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, - {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, - {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, - {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, - {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, - {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, - {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, - {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, - {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, - {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, - {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, - {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, - {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -420,13 +417,13 @@ zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -625,13 +622,13 @@ test = ["pytest"] [[package]] name = "click-didyoumean" -version = "0.3.0" +version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" optional = false -python-versions = ">=3.6.2,<4.0.0" +python-versions = ">=3.6.2" files = [ - {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, - {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, + {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, + {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, ] [package.dependencies] @@ -685,63 +682,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.3" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, - {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, - {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, - {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, - {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, - {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, - {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, - {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, - {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, - {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, - {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, - {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, - {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, - {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.extras] @@ -845,13 +842,13 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "3.2.24" +version = "3.2.25" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.6" files = [ - {file = "Django-3.2.24-py3-none-any.whl", hash = "sha256:5dd5b787c3ba39637610fe700f54bf158e33560ea0dba600c19921e7ff926ec5"}, - {file = "Django-3.2.24.tar.gz", hash = "sha256:aaee9fb0fb4ebd4311520887ad2e33313d368846607f82a9a0ed461cd4c35b18"}, + {file = "Django-3.2.25-py3-none-any.whl", hash = "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38"}, + {file = "Django-3.2.25.tar.gz", hash = "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777"}, ] [package.dependencies] @@ -876,37 +873,37 @@ files = [ [[package]] name = "django-celery-beat" -version = "2.5.0" +version = "2.6.0" description = "Database-backed Periodic Tasks." optional = false python-versions = "*" files = [ - {file = "django-celery-beat-2.5.0.tar.gz", hash = "sha256:cd0a47f5958402f51ac0c715bc942ae33d7b50b4e48cba91bc3f2712be505df1"}, - {file = "django_celery_beat-2.5.0-py3-none-any.whl", hash = "sha256:ae460faa5ea142fba0875409095d22f6bd7bcc7377889b85e8cab5c0dfb781fe"}, + {file = "django-celery-beat-2.6.0.tar.gz", hash = "sha256:f75b2d129731f1214be8383e18fae6bfeacdb55dffb2116ce849222c0106f9ad"}, ] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} celery = ">=5.2.3,<6.0" cron-descriptor = ">=1.2.32" -Django = ">=2.2,<5.0" +Django = ">=2.2,<5.1" django-timezone-field = ">=5.0" python-crontab = ">=2.3.4" tzdata = "*" [[package]] name = "django-celery-results" -version = "2.4.0" +version = "2.5.1" description = "Celery result backends for Django." optional = false python-versions = "*" files = [ - {file = "django_celery_results-2.4.0-py3-none-any.whl", hash = "sha256:be91307c02fbbf0dda21993c3001c60edb74595444ccd6ad696552fe3689e85b"}, - {file = "django_celery_results-2.4.0.tar.gz", hash = "sha256:75aa51970db5691cbf242c6a0ff50c8cdf419e265cd0e9b772335d06436c4b99"}, + {file = "django_celery_results-2.5.1-py3-none-any.whl", hash = "sha256:0da4cd5ecc049333e4524a23fcfc3460dfae91aa0a60f1fae4b6b2889c254e01"}, + {file = "django_celery_results-2.5.1.tar.gz", hash = "sha256:3ecb7147f773f34d0381bac6246337ce4cf88a2ea7b82774ed48e518b67bb8fd"}, ] [package.dependencies] -celery = ">=5.2.3,<6.0" +celery = ">=5.2.7,<6.0" +Django = ">=3.2.18" [[package]] name = "django-constance" @@ -928,16 +925,17 @@ redis = ["redis"] [[package]] name = "django-cors-headers" -version = "4.2.0" +version = "4.3.1" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." optional = false python-versions = ">=3.8" files = [ - {file = "django_cors_headers-4.2.0-py3-none-any.whl", hash = "sha256:9ada212b0e2efd4a5e339360ffc869cb21ac5605e810afe69f7308e577ea5bde"}, - {file = "django_cors_headers-4.2.0.tar.gz", hash = "sha256:f9749c6410fe738278bc2b6ef17f05195bc7b251693c035752d8257026af024f"}, + {file = "django-cors-headers-4.3.1.tar.gz", hash = "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207"}, + {file = "django_cors_headers-4.3.1-py3-none-any.whl", hash = "sha256:0b1fd19297e37417fc9f835d39e45c8c642938ddba1acce0c1753d3edef04f36"}, ] [package.dependencies] +asgiref = ">=3.6" Django = ">=3.2" [[package]] @@ -985,13 +983,13 @@ Django = ">=3.2" [[package]] name = "django-filter" -version = "23.1" +version = "23.5" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." optional = false python-versions = ">=3.7" files = [ - {file = "django-filter-23.1.tar.gz", hash = "sha256:dee5dcf2cea4d7f767e271b6d01f767fce7500676d5e5dc58dac8154000b87df"}, - {file = "django_filter-23.1-py3-none-any.whl", hash = "sha256:e3c52ad83c32fb5882125105efb5fea2a1d6a85e7dc64b04ef52edbf14451b6c"}, + {file = "django-filter-23.5.tar.gz", hash = "sha256:67583aa43b91fe8c49f74a832d95f4d8442be628fd4c6d65e9f811f5153a4e5c"}, + {file = "django_filter-23.5-py3-none-any.whl", hash = "sha256:99122a201d83860aef4fe77758b69dda913e874cc5e0eaa50a86b0b18d708400"}, ] [package.dependencies] @@ -999,13 +997,13 @@ Django = ">=3.2" [[package]] name = "django-health-check" -version = "3.17.0" +version = "3.18.3" description = "Run checks on services like databases, queue servers, celery processes, etc." optional = false python-versions = ">=3.8" files = [ - {file = "django-health-check-3.17.0.tar.gz", hash = "sha256:d1b8671e79d1de6e3dd1a9c69566222b0bfcfacca8b90511a4407b2d0d3d2778"}, - {file = "django_health_check-3.17.0-py2.py3-none-any.whl", hash = "sha256:20dc5ccb516a4e7163593fd4026f0a7531e3027b47d23ebe3bd9dbc99ac4354c"}, + {file = "django_health_check-3.18.3-py2.py3-none-any.whl", hash = "sha256:f5f58762b80bdf7b12fad724761993d6e83540f97e2c95c42978f187e452fa07"}, + {file = "django_health_check-3.18.3.tar.gz", hash = "sha256:18b75daca4551c69a43f804f9e41e23f5f5fb9efd06cf6a313b3d5031bb87bd0"}, ] [package.dependencies] @@ -1013,32 +1011,32 @@ django = ">=2.2" [package.extras] docs = ["sphinx"] -test = ["celery", "pytest", "pytest-cov", "pytest-django", "redis"] +test = ["boto3", "celery", "django-storages", "pytest", "pytest-cov", "pytest-django", "redis"] [[package]] name = "django-jinja" -version = "2.10.2" +version = "2.11.0" description = "Jinja2 templating language integrated in Django." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django-jinja-2.10.2.tar.gz", hash = "sha256:bfdfbb55c1f5a679d69ad575d550c4707d386634009152efe014089f3c4d1412"}, - {file = "django_jinja-2.10.2-py3-none-any.whl", hash = "sha256:dd003ec1c95c0989eb28a538831bced62b1b61da551cb44a5dfd708fcf75589f"}, + {file = "django-jinja-2.11.0.tar.gz", hash = "sha256:47c06d3271e6b2f27d3596278af517bfe2e19c1eb36ae1c0b1cc302d7f0259af"}, + {file = "django_jinja-2.11.0-py3-none-any.whl", hash = "sha256:cc4c72246a6e346aa0574e0c56c3e534c1a20ef47b8476f05d7287781f69a0a9"}, ] [package.dependencies] -django = ">=2.2" +django = ">=3.2" jinja2 = ">=3" [[package]] name = "django-picklefield" -version = "3.1" +version = "3.2" description = "Pickled object field for Django" optional = false python-versions = ">=3" files = [ - {file = "django-picklefield-3.1.tar.gz", hash = "sha256:c786cbeda78d6def2b43bff4840d19787809c8909f7ad683961703060398d356"}, - {file = "django_picklefield-3.1-py3-none-any.whl", hash = "sha256:d77c504df7311e8ec14e8b779f10ca6fec74de6c7f8e2c136e1ef60cf955125d"}, + {file = "django-picklefield-3.2.tar.gz", hash = "sha256:aa463f5d79d497dbe789f14b45180f00a51d0d670067d0729f352a3941cdfa4d"}, + {file = "django_picklefield-3.2-py3-none-any.whl", hash = "sha256:e9a73539d110f69825d9320db18bcb82e5189ff48dbed41821c026a20497764c"}, ] [package.dependencies] @@ -1063,13 +1061,13 @@ prometheus-client = ">=0.7" [[package]] name = "django-redis" -version = "5.3.0" +version = "5.4.0" description = "Full featured redis cache backend for Django." optional = false python-versions = ">=3.6" files = [ - {file = "django-redis-5.3.0.tar.gz", hash = "sha256:8bc5793ec06b28ea802aad85ec437e7646511d4e571e07ccad19cfed8b9ddd44"}, - {file = "django_redis-5.3.0-py3-none-any.whl", hash = "sha256:2d8660d39f586c41c9907d5395693c477434141690fd7eca9d32376af00b0aac"}, + {file = "django-redis-5.4.0.tar.gz", hash = "sha256:6a02abaa34b0fea8bf9b707d2c363ab6adc7409950b2db93602e6cb292818c42"}, + {file = "django_redis-5.4.0-py3-none-any.whl", hash = "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b"}, ] [package.dependencies] @@ -1098,13 +1096,13 @@ sqlparse = "*" [[package]] name = "django-tables2" -version = "2.6.0" +version = "2.7.0" description = "Table/data-grid framework for Django" optional = false python-versions = "*" files = [ - {file = "django-tables2-2.6.0.tar.gz", hash = "sha256:479eed04007cc04bcf764a6fb7a5e3955d94b878ba7f3a4bd4edbd2f7769e08d"}, - {file = "django_tables2-2.6.0-py2.py3-none-any.whl", hash = "sha256:04f23c1181d93716c67085a3c324b449180fd0c5162ef4619acb0b2d9a166133"}, + {file = "django-tables2-2.7.0.tar.gz", hash = "sha256:4113fcc575eb438a12e83a4d4ea01452e4800d970e8bdd0e4122ac171af1900d"}, + {file = "django_tables2-2.7.0-py2.py3-none-any.whl", hash = "sha256:99e06d966ca8ac69fd74092eb45c79a280dd5ca0ccb81395d96261f62128e1af"}, ] [package.dependencies] @@ -1145,13 +1143,13 @@ pytz = "*" [[package]] name = "django-tree-queries" -version = "0.16.1" +version = "0.17.0" description = "Tree queries with explicit opt-in, without configurability" optional = false python-versions = ">=3.8" files = [ - {file = "django_tree_queries-0.16.1-py3-none-any.whl", hash = "sha256:b57cebd85136897dc2d7d1da50f3944b13d4713009af655ae221c8202146c2f5"}, - {file = "django_tree_queries-0.16.1.tar.gz", hash = "sha256:5a7765bdbc78742ae7b206348aa674a7e39ef38069ac3854a51b330d25081c43"}, + {file = "django_tree_queries-0.17.0-py3-none-any.whl", hash = "sha256:df62cc7daa7a766483a8ae11618ff7649d74425b5d245e9644526f2dd2f51af0"}, + {file = "django_tree_queries-0.17.0.tar.gz", hash = "sha256:f115cf6756c55fde56bb876d5b5aa1b2bd33ae3d6e2949c3176ef0b4fb64c532"}, ] [package.extras] @@ -1180,18 +1178,18 @@ waitress = ["waitress"] [[package]] name = "djangorestframework" -version = "3.14.0" +version = "3.15.1" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.6" files = [ - {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, - {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, + {file = "djangorestframework-3.15.1-py3-none-any.whl", hash = "sha256:3ccc0475bce968608cf30d07fb17d8e52d1d7fc8bfe779c905463200750cbca6"}, + {file = "djangorestframework-3.15.1.tar.gz", hash = "sha256:f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1"}, ] [package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} django = ">=3.0" -pytz = "*" [[package]] name = "drf-react-template-framework" @@ -1209,13 +1207,13 @@ djangorestframework = ">=3.12.0,<4.0.0" [[package]] name = "drf-spectacular" -version = "0.26.3" +version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-0.26.3.tar.gz", hash = "sha256:b907a72a0244e5dcfeca625e9632cd8ebccdbe2cb528b7c1de1191708be6f31e"}, - {file = "drf_spectacular-0.26.3-py3-none-any.whl", hash = "sha256:1d84ac70522baaadd6d84a25ce5fe5ea50cfcba0387856689f98ac536f14aa32"}, + {file = "drf-spectacular-0.26.5.tar.gz", hash = "sha256:aee55330a774ba8a9cbdb125714d1c9ee05a8aafd3ce3be8bfd26527649aeb44"}, + {file = "drf_spectacular-0.26.5-py3-none-any.whl", hash = "sha256:c0002a820b11771fdbf37853deb371947caf0159d1afeeffe7598e964bc1db94"}, ] [package.dependencies] @@ -1233,13 +1231,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.2.1" +version = "2024.6.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-sidecar-2024.2.1.tar.gz", hash = "sha256:db95a38971c9be09986356f82041fac60183d28ebdf60c0c51eb8c1f86da3937"}, - {file = "drf_spectacular_sidecar-2024.2.1-py3-none-any.whl", hash = "sha256:dc819ef7a35448c18b2bf4273b38fe1468e14daea5fc8675afb5d0f9e6d9a0ba"}, + {file = "drf_spectacular_sidecar-2024.6.1-py3-none-any.whl", hash = "sha256:5ad678c788dcb36697a668884c6fdac2c511a4094cb010978bd01a6345197bbb"}, + {file = "drf_spectacular_sidecar-2024.6.1.tar.gz", hash = "sha256:eed744c26d2caff815fd67d89eca685f645479f07fb86c124d8ee26a13b1d960"}, ] [package.dependencies] @@ -1247,13 +1245,13 @@ Django = ">=2.2" [[package]] name = "emoji" -version = "2.8.0" +version = "2.11.1" description = "Emoji for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ - {file = "emoji-2.8.0-py2.py3-none-any.whl", hash = "sha256:a8468fd836b7ecb6d1eac054c9a591701ce0ccd6c6f7779ad71b66f76664df90"}, - {file = "emoji-2.8.0.tar.gz", hash = "sha256:8d8b5dec3c507444b58890e598fc895fcec022b3f5acb49497c6ccc5208b8b00"}, + {file = "emoji-2.11.1-py2.py3-none-any.whl", hash = "sha256:b7ba25299bbf520cc8727848ae66b986da32aee27dc2887eaea2bff07226ce49"}, + {file = "emoji-2.11.1.tar.gz", hash = "sha256:062ff0b3154b6219143f8b9f4b3e5c64c35bc2b146e6e2349ab5f29e218ce1ee"}, ] [package.extras] @@ -1322,30 +1320,31 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.42" +version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, - {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar"] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] name = "gprof2dot" -version = "2022.7.29" +version = "2024.6.6" description = "Generate a dot graph from the output of several profilers." optional = false -python-versions = ">=2.7" +python-versions = ">=3.8" files = [ - {file = "gprof2dot-2022.7.29-py2.py3-none-any.whl", hash = "sha256:f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6"}, - {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"}, + {file = "gprof2dot-2024.6.6-py2.py3-none-any.whl", hash = "sha256:45b14ad7ce64e299c8f526881007b9eb2c6b75505d5613e96e66ee4d5ab33696"}, + {file = "gprof2dot-2024.6.6.tar.gz", hash = "sha256:fa1420c60025a9eb7734f65225b4da02a10fc6dd741b37fa129bc6b41951e5ab"}, ] [[package]] @@ -1442,13 +1441,13 @@ six = ">=1.12" [[package]] name = "griffe" -version = "0.41.0" +version = "0.47.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.41.0-py3-none-any.whl", hash = "sha256:8aa7fc6eb00cb80af9c0198178c6b7110cb59fa2c5187bb13ea25eebbe4dd928"}, - {file = "griffe-0.41.0.tar.gz", hash = "sha256:850128c3198c18713eaf0a6cc8572e590a16b1965f72a4e871e66cf84740903f"}, + {file = "griffe-0.47.0-py3-none-any.whl", hash = "sha256:07a2fd6a8c3d21d0bbb0decf701d62042ccc8a576645c7f8799fe1f10de2b2de"}, + {file = "griffe-0.47.0.tar.gz", hash = "sha256:95119a440a3c932b13293538bdbc405bee4c36428547553dc6b327e7e7d35e5a"}, ] [package.dependencies] @@ -1472,51 +1471,51 @@ requests = ">=2.27.1,<3.0.0" [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.2.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, + {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, ] [package.dependencies] zipp = ">=0.5" [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"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 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"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "5.13.0" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.13.0-py3-none-any.whl", hash = "sha256:9f7bd0c97b79972a6cce36a366356d16d5e13b09679c11a58f1014bfdf8e64b2"}, - {file = "importlib_resources-5.13.0.tar.gz", hash = "sha256:82d5c6cca930697dbbd86c93333bb2c2e72861d4789a11c2662b933e5ad2b528"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] 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 (>=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"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "incremental" @@ -1643,13 +1642,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -1671,13 +1670,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.18.6" +version = "4.22.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.6-py3-none-any.whl", hash = "sha256:dc274409c36175aad949c68e5ead0853aaffbe8e88c830ae66bb3c7a1728ad2d"}, - {file = "jsonschema-4.18.6.tar.gz", hash = "sha256:ce71d2f8c7983ef75a756e568317bf54bc531dc3ad7e66a128eae0d51623d8a3"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] [package.dependencies] @@ -1709,13 +1708,13 @@ referencing = ">=0.31.0" [[package]] name = "kombu" -version = "5.3.5" +version = "5.3.7" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, - {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, + {file = "kombu-5.3.7-py3-none-any.whl", hash = "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9"}, + {file = "kombu-5.3.7.tar.gz", hash = "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf"}, ] [package.dependencies] @@ -1734,74 +1733,29 @@ mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack"] pyro = ["pyro4"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=2.8.0)"] -[[package]] -name = "lazy-object-proxy" -version = "1.10.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.8" -files = [ - {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, - {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, -] - [[package]] name = "markdown" -version = "3.3.7" -description = "Python implementation of Markdown." +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, - {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] @@ -1899,13 +1853,13 @@ files = [ [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -1977,13 +1931,13 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "1.0.0" +version = "1.0.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-1.0.0-py3-none-any.whl", hash = "sha256:2b6d288f0582589d1be7c99ce4470c8e7c5077892014051ff0d4ff574a73dbe8"}, - {file = "mkdocs_autorefs-1.0.0.tar.gz", hash = "sha256:1b20db41cade632b07b7a73dee818977b52e869c9deb438f6f20e2896ff01859"}, + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, ] [package.dependencies] @@ -2121,41 +2075,37 @@ xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] name = "msal" -version = "1.27.0" +version = "1.29.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = true -python-versions = ">=2.7" +python-versions = ">=3.7" files = [ - {file = "msal-1.27.0-py2.py3-none-any.whl", hash = "sha256:572d07149b83e7343a85a3bcef8e581167b4ac76befcbbb6eef0c0e19643cdc0"}, - {file = "msal-1.27.0.tar.gz", hash = "sha256:3109503c038ba6b307152b0e8d34f98113f2e7a78986e28d0baf5b5303afda52"}, + {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, + {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, ] [package.dependencies] -cryptography = ">=0.6,<45" +cryptography = ">=2.5,<45" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.15)"] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] [[package]] name = "msal-extensions" -version = "1.1.0" +version = "1.2.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." optional = true python-versions = ">=3.7" files = [ - {file = "msal-extensions-1.1.0.tar.gz", hash = "sha256:6ab357867062db7b253d0bd2df6d411c7891a0ee7308d54d1e4317c1d1c54252"}, - {file = "msal_extensions-1.1.0-py3-none-any.whl", hash = "sha256:01be9711b4c0b1a151450068eeb2c4f0997df3bba085ac299de3a66f585e382f"}, + {file = "msal_extensions-1.2.0-py3-none-any.whl", hash = "sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d"}, + {file = "msal_extensions-1.2.0.tar.gz", hash = "sha256:6f41b320bfd2933d631a215c91ca0dd3e67d84bd1a2f50ce917d5874ec646bef"}, ] [package.dependencies] -msal = ">=0.4.1,<2.0.0" -packaging = "*" -portalocker = [ - {version = ">=1.0,<3", markers = "platform_system != \"Windows\""}, - {version = ">=1.6,<3", markers = "platform_system == \"Windows\""}, -] +msal = ">=1.29,<2" +portalocker = ">=1.4,<3" [[package]] name = "mypy-extensions" @@ -2170,88 +2120,88 @@ files = [ [[package]] name = "nautobot" -version = "2.1.5" +version = "2.2.6" description = "Source of truth and network automation platform." optional = false -python-versions = ">=3.8,<3.12" +python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot-2.1.5-py3-none-any.whl", hash = "sha256:62ab0115349f7c75c675f93324644e519d5fde5dd0c7ed3baa40a1c20d45118a"}, - {file = "nautobot-2.1.5.tar.gz", hash = "sha256:4c36d03592210c17bc899dd9cfcb05c26ad720727e6869d928540611aefa2f55"}, + {file = "nautobot-2.2.6-py3-none-any.whl", hash = "sha256:58d9161a7f49d8874a87740903c5e3f9353fc5efc2e95e2f7bf0872ddcda3291"}, + {file = "nautobot-2.2.6.tar.gz", hash = "sha256:6c281e2ad37bfe7e35d40418cca5a73f0602f774ee32faf5bb22b11869fd4153"}, ] [package.dependencies] celery = ">=5.3.1,<5.4.0" -Django = ">=3.2.24,<3.3.0" +Django = ">=3.2.25,<3.3.0" django-ajax-tables = ">=1.1.1,<1.2.0" -django-celery-beat = ">=2.5.0,<2.6.0" -django-celery-results = ">=2.4.0,<2.5.0" +django-celery-beat = ">=2.6.0,<2.7.0" +django-celery-results = ">=2.5.1,<2.6.0" django-constance = {version = ">=2.9.1,<2.10.0", extras = ["database"]} -django-cors-headers = ">=4.2.0,<4.3.0" +django-cors-headers = ">=4.3.1,<4.4.0" django-db-file-storage = ">=0.5.5,<0.6.0" django-extensions = ">=3.2.3,<3.3.0" -django-filter = ">=23.1,<23.2" -django-health-check = ">=3.17.0,<3.18.0" -django-jinja = ">=2.10.2,<2.11.0" +django-filter = ">=23.5,<23.6" +django-health-check = ">=3.18.1,<3.19.0" +django-jinja = ">=2.11.0,<2.12.0" django-prometheus = ">=2.3.1,<2.4.0" -django-redis = ">=5.3.0,<5.4.0" +django-redis = ">=5.4.0,<5.5.0" django-silk = ">=5.1.0,<5.2.0" -django-tables2 = ">=2.6.0,<2.7.0" +django-tables2 = ">=2.7.0,<2.8.0" django-taggit = ">=4.0.0,<4.1.0" django-timezone-field = ">=5.1,<5.2" -django-tree-queries = ">=0.16.1,<0.17.0" +django-tree-queries = ">=0.17.0,<0.18.0" django-webserver = ">=1.2.0,<1.3.0" -djangorestframework = ">=3.14.0,<3.15.0" +djangorestframework = ">=3.15.1,<3.16.0" drf-react-template-framework = ">=0.0.17,<0.0.18" -drf-spectacular = {version = "0.26.3", extras = ["sidecar"]} -emoji = ">=2.8.0,<2.9.0" -GitPython = ">=3.1.41,<3.2.0" +drf-spectacular = {version = ">=0.26.5,<0.27.0", extras = ["sidecar"]} +emoji = ">=2.11.0,<2.12.0" +GitPython = ">=3.1.43,<3.2.0" graphene-django = ">=2.16.0,<2.17.0" graphene-django-optimizer = ">=0.8.0,<0.9.0" -Jinja2 = ">=3.1.3,<3.2.0" -jsonschema = ">=4.7.0,<4.19.0" -Markdown = ">=3.3.7,<3.4.0" +Jinja2 = ">=3.1.4,<3.2.0" +jsonschema = ">=4.7.0,<5.0.0" +Markdown = ">=3.5.2,<3.6.0" MarkupSafe = ">=2.1.5,<2.2.0" -netaddr = ">=0.8.0,<0.9.0" +netaddr = ">=0.10.1,<0.11.0" netutils = ">=1.6.0,<2.0.0" nh3 = ">=0.2.15,<0.3.0" packaging = ">=23.1" -Pillow = ">=10.2.0,<10.3.0" -prometheus-client = ">=0.17.1,<0.18.0" +Pillow = ">=10.3.0,<10.4.0" +prometheus-client = ">=0.20.0,<0.21.0" psycopg2-binary = ">=2.9.9,<2.10.0" python-slugify = ">=8.0.3,<8.1.0" pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" -social-auth-app-django = ">=5.2.0,<5.3.0" +social-auth-app-django = ">=5.4.1,<5.5.0" svgwrite = ">=1.4.2,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.3.0,<4.4.0)", "django-storages (>=1.13.2,<1.14.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] -ldap = ["django-auth-ldap (>=4.3.0,<4.4.0)"] +all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[saml] (>=4.5.3,<4.6.0)"] +ldap = ["django-auth-ldap (>=4.7.0,<4.8.0)"] mysql = ["mysqlclient (>=2.2.3,<2.3.0)"] napalm = ["napalm (>=4.1.0,<4.2.0)"] -remote-storage = ["django-storages (>=1.13.2,<1.14.0)"] -sso = ["social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] +remote-storage = ["django-storages (>=1.14.2,<1.15.0)"] +sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] [[package]] name = "netaddr" -version = "0.8.0" +version = "0.10.1" description = "A network address manipulation library for Python" optional = false python-versions = "*" files = [ - {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, - {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, + {file = "netaddr-0.10.1-py2.py3-none-any.whl", hash = "sha256:9822305b42ea1020d54fee322d43cee5622b044c07a1f0130b459bb467efcf88"}, + {file = "netaddr-0.10.1.tar.gz", hash = "sha256:f4da4222ca8c3f43c8e18a8263e5426c750a3a837fdfeccf74c68d0408eaa3bf"}, ] [[package]] name = "netutils" -version = "1.6.0" +version = "1.8.1" description = "Common helper functions useful in network automation." optional = false -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "netutils-1.6.0-py3-none-any.whl", hash = "sha256:e755e6141d0968f1deeb61693a4023f4f5fe1f0dde25d94ac1008f8191d8d237"}, - {file = "netutils-1.6.0.tar.gz", hash = "sha256:bd2fa691e172fe9d5c9e6fc5e2593316eb7fd2c36450454894ed13b274763d70"}, + {file = "netutils-1.8.1-py3-none-any.whl", hash = "sha256:b1d6864a7512c3def0e12a2a879f12ccca9b5077d482f591c56d0171542aa040"}, + {file = "netutils-1.8.1.tar.gz", hash = "sha256:20d0cd9bf3a11588e77266c4aca93b460c732e12c4449e48213f22ab32d78921"}, ] [package.extras] @@ -2259,27 +2209,27 @@ optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] [[package]] name = "nh3" -version = "0.2.15" +version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, - {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, - {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, - {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9"}, + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10"}, + {file = "nh3-0.2.17-cp37-abi3-win32.whl", hash = "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911"}, + {file = "nh3-0.2.17-cp37-abi3-win_amd64.whl", hash = "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb"}, + {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, ] [[package]] @@ -2300,29 +2250,29 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" @@ -2373,79 +2323,80 @@ files = [ [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -2469,28 +2420,29 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.0" description = "Wraps the portalocker recipe for easy usage" optional = true python-versions = ">=3.8" files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, ] [package.dependencies] @@ -2503,13 +2455,13 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "prometheus-client" -version = "0.17.1" +version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, ] [package.extras] @@ -2533,13 +2485,13 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -2664,13 +2616,13 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -2686,17 +2638,16 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -2732,23 +2683,23 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "2.17.7" +version = "3.2.3" description = "python code static checker" optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" files = [ - {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, - {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, + {file = "pylint-3.2.3-py3-none-any.whl", hash = "sha256:b3d7d2708a3e04b4679e02d99e72329a8b7ee8afb8d04110682278781f889fa8"}, + {file = "pylint-3.2.3.tar.gz", hash = "sha256:02f6c562b215582386068d52a30f520d84fdbcf2a95fc7e855b816060d048b60"}, ] [package.dependencies] -astroid = ">=2.15.8,<=2.17.0-dev0" +astroid = ">=3.2.2,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, ] -isort = ">=4.2.5,<6" +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -2779,20 +2730,20 @@ with-django = ["Django (>=2.2)"] [[package]] name = "pylint-nautobot" -version = "0.2.1" +version = "0.3.0" description = "Custom Pylint Rules for Nautobot" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<3.12" files = [ - {file = "pylint_nautobot-0.2.1-py3-none-any.whl", hash = "sha256:6656cd571d6e997e6d7e37631308f1de25949a596a8309ab6d47a2e387c892c6"}, - {file = "pylint_nautobot-0.2.1.tar.gz", hash = "sha256:2872106a29236b0e31293efe4a2d02a66527c67f33437f3e2345251c4cf71b4d"}, + {file = "pylint_nautobot-0.3.0-py3-none-any.whl", hash = "sha256:91fed48d9a9f565c6aa46c679b930d64b06d014061f6e7e802e6de8b6b8e3f87"}, + {file = "pylint_nautobot-0.3.0.tar.gz", hash = "sha256:387a1d73b49186a7b325b6c1a3634e2c57ec0f2350e93494304c47073400099b"}, ] [package.dependencies] -importlib-resources = ">=5.12.0,<6.0.0" -pylint = ">=2.13,<3.0" -pyyaml = ">=6.0,<7.0" -tomli = ">=2.0.1,<3.0.0" +importlib-resources = ">=5.12.0" +pylint = ">=2.17.5" +pyyaml = ">=6.0.1" +toml = ">=0.10.2" [[package]] name = "pylint-plugin-utils" @@ -2810,17 +2761,17 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.4" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.4-py3-none-any.whl", hash = "sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037"}, - {file = "pymdown_extensions-10.4.tar.gz", hash = "sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35"}, + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.5" pyyaml = "*" [package.extras] @@ -2846,13 +2797,12 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] name = "python-crontab" -version = "3.0.0" +version = "3.1.0" description = "Python Crontab API" optional = false python-versions = "*" files = [ - {file = "python-crontab-3.0.0.tar.gz", hash = "sha256:79fb7465039ddfd4fb93d072d6ee0d45c1ac8bf1597f0686ea14fd4361dba379"}, - {file = "python_crontab-3.0.0-py3-none-any.whl", hash = "sha256:6d5ba3c190ec76e4d252989a1644fcb233dbf53fbc8fceeb9febe1657b9fb1d4"}, + {file = "python-crontab-3.1.0.tar.gz", hash = "sha256:f4ea1605d24533b67fa7a634ef26cb59a5f2e7954f6e677d2d7a2229959a2fc8"}, ] [package.dependencies] @@ -2864,13 +2814,13 @@ cron-schedule = ["croniter"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -3076,17 +3026,17 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.1" +version = "5.0.6" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"}, - {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"}, + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -3094,13 +3044,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.33.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -3109,115 +3059,101 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -3251,13 +3187,13 @@ test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.1 [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -3269,13 +3205,13 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "responses" -version = "0.25.0" +version = "0.25.3" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, - {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, + {file = "responses-0.25.3-py3-none-any.whl", hash = "sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb"}, + {file = "responses-0.25.3.tar.gz", hash = "sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba"}, ] [package.dependencies] @@ -3288,13 +3224,13 @@ tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asy [[package]] name = "rich" -version = "13.7.0" +version = "13.7.1" 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"}, + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] @@ -3307,136 +3243,136 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] [[package]] name = "ruff" -version = "0.1.15" +version = "0.4.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, ] [[package]] @@ -3505,13 +3441,13 @@ files = [ [[package]] name = "social-auth-app-django" -version = "5.2.0" +version = "5.4.1" description = "Python Social Authentication, Django integration." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "social-auth-app-django-5.2.0.tar.gz", hash = "sha256:4a5dae406f3874b4003708ff120c02cb1a4c8eeead56cd163646347309fcd0f8"}, - {file = "social_auth_app_django-5.2.0-py3-none-any.whl", hash = "sha256:0347ca4cd23ea9d15a665da9d22950552fb66b95600e6c2ebae38ca883b3a4ed"}, + {file = "social-auth-app-django-5.4.1.tar.gz", hash = "sha256:2a43cde559dd34fdc7132417b6c52c780fa99ec2332dee9f405b4763f371c367"}, + {file = "social_auth_app_django-5.4.1-py3-none-any.whl", hash = "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477"}, ] [package.dependencies] @@ -3520,13 +3456,13 @@ social-auth-core = ">=4.4.1" [[package]] name = "social-auth-core" -version = "4.5.3" +version = "4.5.4" description = "Python social authentication made simple." optional = false python-versions = ">=3.8" files = [ - {file = "social-auth-core-4.5.3.tar.gz", hash = "sha256:9d9b51b7ce2ccd0b7139e6b7f52a32cb922726de819fb13babe35f12ae89852a"}, - {file = "social_auth_core-4.5.3-py3-none-any.whl", hash = "sha256:8d16e66eb97bb7be43a023d6efa16628cdc94cefd8d8053930c98a0f676867e7"}, + {file = "social-auth-core-4.5.4.tar.gz", hash = "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac"}, + {file = "social_auth_core-4.5.4-py3-none-any.whl", hash = "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db"}, ] [package.dependencies] @@ -3546,19 +3482,18 @@ saml = ["python3-saml (>=1.5.0)"] [[package]] name = "sqlparse" -version = "0.4.4" +version = "0.5.0" description = "A non-validating SQL parser." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, ] [package.extras] -dev = ["build", "flake8"] +dev = ["build", "hatch"] doc = ["sphinx"] -test = ["pytest", "pytest-cov"] [[package]] name = "stack-data" @@ -3653,13 +3588,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.4" +version = "0.12.5" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] @@ -3686,28 +3621,28 @@ dev = ["furo", "packaging", "sphinx (>=5)", "twisted"] [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -3734,13 +3669,13 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "1.26.19" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, + {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [package.extras] @@ -3761,40 +3696,43 @@ files = [ [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.1" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [package.extras] @@ -3813,13 +3751,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.1" +version = "3.0.3" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, + {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, ] [package.dependencies] @@ -3830,97 +3768,18 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.42.0" +version = "0.43.0" description = "A built-package format for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, - {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, ] [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] -[[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.6" -files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, -] - [[package]] name = "xmltodict" version = "0.13.0" @@ -3952,18 +3811,18 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] all = ["azure-identity", "azure-keyvault-secrets", "boto3", "hvac", "python-tss-sdk"] diff --git a/pyproject.toml b/pyproject.toml index 811f02f..a25af54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,6 @@ hvac = { version = ">=0.11.0, <1.1.0", optional = true } python-tss-sdk = {version = "~1.2.0", optional = true} [tool.poetry.group.dev.dependencies] -Markdown = "*" bandit = "*" black = "*" coverage = "*" @@ -51,6 +50,7 @@ pylint-nautobot = "*" ruff = "*" yamllint = "*" toml = "*" +Markdown = "*" # Rendering docs to HTML mkdocs = "1.5.2" # Material for MkDocs theme diff --git a/tasks.py b/tasks.py index 9680a6d..366f6fe 100644 --- a/tasks.py +++ b/tasks.py @@ -48,7 +48,7 @@ def is_truthy(arg): namespace.configure( { "nautobot_secrets_providers": { - "nautobot_ver": "2.0.0", + "nautobot_ver": "latest", "project_name": "nautobot-secrets-providers", "python_ver": "3.11", "local": False, From b2493fac22488563e26dc9151652cccde14244d3 Mon Sep 17 00:00:00 2001 From: Steven Weiblinger <111259311+DistantVoyager@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:03:46 -0400 Subject: [PATCH 10/11] Release v3.0.0 --- changes/124.changed | 1 - changes/130.changed | 1 - changes/131.added | 1 - changes/134.added | 3 --- changes/134.changed | 6 ----- changes/134.removed | 2 -- changes/64.added | 1 - changes/8.housekeeping | 1 - development/towncrier_template.j2 | 2 +- docs/admin/compatibility_matrix.md | 11 +++++---- docs/admin/release_notes/version_3.0.md | 31 +++++++++++++++++++++++++ pyproject.toml | 2 +- tasks.py | 2 +- 13 files changed, 40 insertions(+), 24 deletions(-) delete mode 100644 changes/124.changed delete mode 100644 changes/130.changed delete mode 100644 changes/131.added delete mode 100644 changes/134.added delete mode 100644 changes/134.changed delete mode 100644 changes/134.removed delete mode 100644 changes/64.added delete mode 100644 changes/8.housekeeping diff --git a/changes/124.changed b/changes/124.changed deleted file mode 100644 index 7a7cdde..0000000 --- a/changes/124.changed +++ /dev/null @@ -1 +0,0 @@ -Replaced pydocstyle with ruff. diff --git a/changes/130.changed b/changes/130.changed deleted file mode 100644 index 9303c67..0000000 --- a/changes/130.changed +++ /dev/null @@ -1 +0,0 @@ -Removed version from docker-compose files. \ No newline at end of file diff --git a/changes/131.added b/changes/131.added deleted file mode 100644 index 80bc485..0000000 --- a/changes/131.added +++ /dev/null @@ -1 +0,0 @@ -Added a secrets provider for Azure Key Vault. \ No newline at end of file diff --git a/changes/134.added b/changes/134.added deleted file mode 100644 index 9978834..0000000 --- a/changes/134.added +++ /dev/null @@ -1,3 +0,0 @@ -Added previous release notes to docs. -Added logos and missing doc sections. -Added `0001_update_thycotic_delinea_slug.py` migration to update any legacy Thycotic secrets. \ No newline at end of file diff --git a/changes/134.changed b/changes/134.changed deleted file mode 100644 index 07823a6..0000000 --- a/changes/134.changed +++ /dev/null @@ -1,6 +0,0 @@ -Updated `creds.example.env` file with clearer environment variables for providers. -Updated lock file dependencies. -Moved installation guides for specific secrets providers to separate pages. -Renamed any existing references of `Thycotic` to `Delinea`. -Updated app's verbose name to `Secrets Providers`. -Updated screenshots in Nautobot 2.0 UI. \ No newline at end of file diff --git a/changes/134.removed b/changes/134.removed deleted file mode 100644 index d4ac899..0000000 --- a/changes/134.removed +++ /dev/null @@ -1,2 +0,0 @@ -Removed unnecessary provider config from `nautobot_config.py`. -Removed old references to previous Nautobot versions. \ No newline at end of file diff --git a/changes/64.added b/changes/64.added deleted file mode 100644 index f972332..0000000 --- a/changes/64.added +++ /dev/null @@ -1 +0,0 @@ -Added fallthrough for boto3 error handling to catch errors not explicitly defined. diff --git a/changes/8.housekeeping b/changes/8.housekeeping deleted file mode 100644 index 653c54a..0000000 --- a/changes/8.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Re-baked from the latest template. diff --git a/development/towncrier_template.j2 b/development/towncrier_template.j2 index b0f6e12..7494bc1 100644 --- a/development/towncrier_template.j2 +++ b/development/towncrier_template.j2 @@ -1,6 +1,6 @@ {% if render_title %} -## [v{{ versiondata.version }} ({{ versiondata.date }})]({{ cookiecutter.repo_url }}/releases/tag/v{{ versiondata.version}}) +## [v{{ versiondata.version }} ({{ versiondata.date }})](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v{{ versiondata.version}}) {% endif %} {% for section, _ in sections.items() %} diff --git a/docs/admin/compatibility_matrix.md b/docs/admin/compatibility_matrix.md index c118ab1..74f5a5f 100644 --- a/docs/admin/compatibility_matrix.md +++ b/docs/admin/compatibility_matrix.md @@ -1,7 +1,8 @@ # Compatibility Matrix -| Nautobot's Secrets Providers App Version | Nautobot First Support Version | Nautobot Last Support Version | -| ---------------------------------------- | ------------------------------ | ----------------------------- | -| 1.0.0 - 1.3.0 | 1.2.1 | 1.2.99 | -| 1.4.X | 1.4.0 | 1.99.99 | -| 2.0.X | 2.0.0 | 2.99.99 | +| Nautobot Secrets Providers App Version | Nautobot First Support Version | Nautobot Last Support Version | +| -------------------------------------- | ------------------------------ | ----------------------------- | +| 1.0.0 - 1.3.0 | 1.2.1 | 1.2.99 | +| 1.4.X | 1.4.0 | 1.99.99 | +| 2.0.X | 2.0.0 | 2.99.99 | +| 3.0.X | 2.0.0 | 2.99.99 | diff --git a/docs/admin/release_notes/version_3.0.md b/docs/admin/release_notes/version_3.0.md index 6716fe8..1a3ce80 100644 --- a/docs/admin/release_notes/version_3.0.md +++ b/docs/admin/release_notes/version_3.0.md @@ -4,3 +4,34 @@ This document describes all new features and changes in the release `3.0`. The f ## Release Overview +This release includes support for the Azure Key Vault secrets provider along with significant refactoring and housekeeping. + +## [v3.0.0 (2024-06-27)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v3.0.0) + +### Added + +- [#64](https://github.com/nautobot/nautobot-app-secrets-providers/issues/64) - Added fallthrough for boto3 error handling to catch errors not explicitly defined. +- [#131](https://github.com/nautobot/nautobot-app-secrets-providers/issues/131) - Added a secrets provider for Azure Key Vault. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Added previous release notes to docs. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Added logos and missing doc sections. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Added `0001_update_thycotic_delinea_slug.py` migration to update any legacy Thycotic secrets. + +### Changed + +- [#124](https://github.com/nautobot/nautobot-app-secrets-providers/issues/124) - Replaced pydocstyle with ruff. +- [#130](https://github.com/nautobot/nautobot-app-secrets-providers/issues/130) - Removed version from docker-compose files. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Updated `creds.example.env` file with clearer environment variables for providers. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Updated lock file dependencies. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Moved installation guides for specific secrets providers to separate pages. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Renamed any existing references of `Thycotic` to `Delinea`. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Updated app's verbose name to `Secrets Providers`. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Updated screenshots in Nautobot 2.0 UI. + +### Removed + +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Removed unnecessary provider config from `nautobot_config.py`. +- [#134](https://github.com/nautobot/nautobot-app-secrets-providers/issues/134) - Removed old references to previous Nautobot versions. + +### Housekeeping + +- [#8](https://github.com/nautobot/nautobot-app-secrets-providers/issues/8) - Re-baked from the latest template. diff --git a/pyproject.toml b/pyproject.toml index a25af54..5cf63b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-secrets-providers" -version = "2.0.1" +version = "3.0.0" description = "Nautobot Secrets Providers App" authors = ["Network to Code, LLC "] license = "Apache-2.0" diff --git a/tasks.py b/tasks.py index 366f6fe..b0b0cd3 100644 --- a/tasks.py +++ b/tasks.py @@ -635,7 +635,7 @@ def help_task(context): @task( help={ - "version": "Version of Nautobot's Secrets Providers App to generate the release notes for.", + "version": "Version of Nautobot Secrets Providers App to generate the release notes for.", } ) def generate_release_notes(context, version=""): From c730b790004e68f1aae56d440d2636b467609c05 Mon Sep 17 00:00:00 2001 From: Steven Weiblinger <111259311+DistantVoyager@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:34:19 -0400 Subject: [PATCH 11/11] Updated release overview --- docs/admin/release_notes/version_3.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/release_notes/version_3.0.md b/docs/admin/release_notes/version_3.0.md index 1a3ce80..3100602 100644 --- a/docs/admin/release_notes/version_3.0.md +++ b/docs/admin/release_notes/version_3.0.md @@ -4,7 +4,7 @@ This document describes all new features and changes in the release `3.0`. The f ## Release Overview -This release includes support for the Azure Key Vault secrets provider along with significant refactoring and housekeeping. +This release includes support for the Azure Key Vault secrets provider along with significant refactoring and housekeeping. Notably, all existing references to `Thycotic` were changed to `Delinea`. Be sure to update your app accordingly, including within `PLUGINS_CONFIG` in `nautobot_config.py`. ## [v3.0.0 (2024-06-27)](https://github.com/nautobot/nautobot-app-secrets-providers/releases/tag/v3.0.0)