From 86e16429aab9baadafeb9682ea46a1951585f552 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:00:39 -0400 Subject: [PATCH 01/32] Init structure and basic tools --- .github/workflows/lint.yml | 36 + .github/workflows/precommit.yml | 36 + .gitignore | 173 ++ .pre-commit-config.yaml | 44 + CHANGES.md | 6 + Makefile | 159 ++ Makefile.private.example | 15 + README.md | 100 +- climateset/__init__.py | 7 + config/README.md | 8 + data/README.md | 15 + docs/README.md | 3 + environment.yml | 6 + notebooks/README.md | 3 + poetry.lock | 2789 +++++++++++++++++++++++++++++++ pyproject.toml | 106 ++ scripts/README.md | 0 scripts/config.sh.example | 34 + tests/__init__.py | 0 tox.ini | 54 + 20 files changed, 3593 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/precommit.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CHANGES.md create mode 100644 Makefile create mode 100644 Makefile.private.example create mode 100644 climateset/__init__.py create mode 100644 config/README.md create mode 100644 data/README.md create mode 100644 docs/README.md create mode 100644 environment.yml create mode 100644 notebooks/README.md create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 scripts/README.md create mode 100644 scripts/config.sh.example create mode 100644 tests/__init__.py create mode 100644 tox.ini diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..d7fcf03 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,36 @@ +name: Lint + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + lint: + if: github.event.pull_request.draft == false + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: 3.10 + + - name: Install Poetry + run: | + pip install poetry + + - name: Configure Poetry + run: | + poetry config virtualenvs.create false + + - name: Install dependencies + run: | + make install + + - name: Run linting checks + run: | + make check-pylint \ No newline at end of file diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml new file mode 100644 index 0000000..2de7067 --- /dev/null +++ b/.github/workflows/precommit.yml @@ -0,0 +1,36 @@ +name: Pre-commit + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + Pre-commit: + if: github.event.pull_request.draft == false + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: 3.10 + + - name: Install Poetry + run: | + pip install poetry + + - name: Configure Poetry + run: | + poetry config virtualenvs.create false + + - name: Install dependencies + run: | + make install + + - name: Run linting checks + run: | + make pre-commit \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8af546 --- /dev/null +++ b/.gitignore @@ -0,0 +1,173 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# VsCode +.vscode/ + +# Project data folder and data in general +data/* +!data/README.md +**/*.nc +**/*.tif + +# Makefile and configurations +Makefile.private +scripts/config.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..a02d625 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,44 @@ +exclude: "^docs/|/migrations/" +default_stages: [commit] + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-json + - id: check-toml + - id: check-xml + - id: check-yaml + - id: debug-statements + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: detect-private-key + + - repo: https://github.com/psf/black + rev: 23.12.1 + hooks: + - id: black + + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort + args: ["--profile", "black"] + + - repo: https://github.com/ikamensh/flynt + rev: 1.0.1 + hooks: + - id: flynt + args: ["--fail-on-change"] + + - repo: https://github.com/PyCQA/flake8 + rev: 7.0.0 + hooks: + - id: flake8 + +# sets up .pre-commit-ci.yaml to ensure pre-commit dependencies stay up to date +ci: + autoupdate_schedule: weekly + skip: [] + submodules: false diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..b148eb7 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,6 @@ +# CHANGES.md + +[Unreleased](https://github.com/RolnickLab/ClimateSetExtension) (latest) +------------------------------------------------------------------------------------- + +[//]: # (New changes here in list form) \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb72264 --- /dev/null +++ b/Makefile @@ -0,0 +1,159 @@ +## -- Basic variables +PROJECT_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) +SHELL := /usr/bin/env bash +BUMP_TOOL := bump-my-version +DOCKER_COMPOSE := docker compose + +## -- Conda variables +# CONDA_TOOL can be overridden in Makefile.private file +CONDA_TOOL ?= conda +CONDA_ENVIRONMENT := climateset + + +## -- Private variables import to override variables for local +-include Makefile.private + +#### Install #### + +.PHONY: install-conda +install-conda: ## Install conda on your local machine + @$(CONDA_TOOL) --version; \ + if [ $$? != "0" ]; then \ + echo " "; \ + echo "Your defined Conda tool [$(CONDA_TOOL)] has not been found."; \ + echo " "; \ + echo "If you know you already have [$(CONDA_TOOL)] or some other Conda tool installed,"; \ + echo "Check your [CONDA_TOOL] variable in the Makefile.private for typos."; \ + echo " "; \ + echo "If your conda tool has not been initiated through your .bashrc file,"; \ + echo "consider using the full path to its executable instead when"; \ + echo "defining your [CONDA_TOOL] variable"; \ + echo " "; \ + echo "If in doubt, don't install Conda and manually create and activate"; \ + echo "your own Python environment."; \ + echo " "; \ + echo -n "Would you like to install Miniconda ? [y/N]: "; \ + read ans; \ + case $$ans in \ + [Yy]*) \ + echo "Fetching and installing miniconda"; \ + echo " "; \ + wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh; \ + bash ~/miniconda.sh -b -p $HOME/.conda; \ + export PATH=$HOME/.conda/bin:$PATH; \ + conda init; \ + /usr/bin/rm ~/miniconda.sh; \ + ;; \ + *) \ + echo "Skipping installation."; \ + echo " "; \ + ;; \ + esac; \ + else \ + echo "Conda tool [$(CONDA_TOOL)] has been found, skipping installation"; \ + fi; + + +.PHONY: create-env +create-env: install-conda ## Create a local conda environment + $(CONDA_TOOL) env create -f environment.yml + @echo "" + @echo "#####################################################################" + @echo "# #" + @echo "# Please activate your new environment using the following command: #" + @echo "# #" + @echo "#####################################################################" + @echo "" + @echo "$(CONDA_TOOL) activate $(CONDA_ENVIRONMENT)" + @echo "" + @echo "" + +.PHONY: install +install: install-precommit ## Install the application and it's dependencies + +.PHONY: install-poetry +install-poetry: ## Install the application and it's dependencies + @poetry --version; \ + if [ $$? != "0" ]; then \ + echo "Poetry not found, proceeding to install Poetry..."; \ + pip install poetry==1.8.2; \ + fi; + +.PHONY: install-precommit +install-precommit: install-dev## Install the application and it's dependencies + @if [ -f .git/hooks/pre-commit ]; then \ + echo "Pre-commit hook found"; \ + else \ + echo "Pre-commit hook not found, proceeding to configure it"; \ + poetry run pre-commit install; \ + fi; + +.PHONY: install-package +install-package: install-poetry ## Install the application and it's dependencies + @poetry install + +.PHONY: install-dev +install-dev: install-poetry ## Install the application and it's dependencies + @poetry install --with dev + +.PHONY: install-with-lab +install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter + poetry install --with lab + +#### Versionning #### + +# Use the "dry" target for a dry-run version bump, ex. +# make bump-major dry +BUMP_ARGS ?= --verbose +ifeq ($(filter dry, $(MAKECMDGOALS)), dry) + BUMP_ARGS := $(BUMP_ARGS) --dry-run --allow-dirty +endif + +.PHONY: bump-major +bump-major: ## Bump application major version + $(BUMP_TOOL) $(BUMP_ARGS) major + +.PHONY: bump-minor +bump-minor: ## Bump application major version <0.X.0> + $(BUMP_TOOL) $(BUMP_ARGS) minor + +.PHONY: bump-patch +bump-patch: ## Bump application major version <0.0.X> + $(BUMP_TOOL) $(BUMP_ARGS) patch + +#### Docker #### + +#### Linting #### + +.PHONY: check-lint +check-lint: ## Check code linting + poetry run tox -e black,isort,flake8,pylint + +.PHONY: check-flake8 +check-flake8: ## Check code linting with only flake8 + poetry run tox -e flake8 + +.PHONY: check-pylint +check-pylint: ## Check code linting with only flake8 + poetry run tox -e pylint + +.PHONY: pre-commit +pre-commit: ## Fix code linting + poetry run tox -e precommit + +.PHONY: fix-lint +fix-lint: ## Fix code linting + poetry run tox -e fix + +#### Tests #### + +.PHONY: test +test: ## Run tests + poetry run tox -e test + +.PHONY: test-all +test-all: ## Run tests + poetry run tox -e test-all + +#### Application #### + diff --git a/Makefile.private.example b/Makefile.private.example new file mode 100644 index 0000000..d3615d2 --- /dev/null +++ b/Makefile.private.example @@ -0,0 +1,15 @@ +# This file is meant for private variables that apply only to local developments +# variables (ie. configurations specific to your own local development environment) +# as well as sensitive information, like access keys, passwords and such. +# +# Make a copy of this file and name it `Makefile.private`, then define your own +# variables in it. +# +# `Makefile.private` is already ignored by the `.gitignore` file. +# +# DO NOT COMMIT YOUR `Makefile.private`!!! + +# If you use a different Conda tool, say `micromamba`, or if you use a different alias +# CONDA_TOOL := + +DOCKER_COMPOSE := docker compose diff --git a/README.md b/README.md index 3ceea5c..4127049 100644 --- a/README.md +++ b/README.md @@ -1 +1,99 @@ -# ClimateSetExtension \ No newline at end of file +# ClimatesetExtension + +## Requirements + +This project has only been tested in a Linux (Debian based) environment and assumes +some basic tools for development are already installed. + +The project uses a Makefile to automate most operations. If you can run make on your +machine there's a good chance this will work on your machine. + +Please consult the [Makefile](Makefile) before trying to use it. + +## Installation + +This project assumes environment management will be done with Conda. It would, however, +be possible to create you own environment with, for example, poetry, pyenv or virtualenv. + +**Do note that this project is configured to use [Poetry](https://python-poetry.org/) +and as such, this tool is required to install it.** + +Poetry is included in the [environment.yml](environment.yml) used by the commands below to +create a conda environment. + +If you need or want to install Conda: +``` +make install-conda +``` + +To create the conda environment: +``` +make create-env +``` + +After you have created your Conda environment, or you want to manage your environment +yourself, make sure to activate it properly before installing this package. + +To install the package and its CLI tools: +``` +make install +``` + +## Basic automations + +To run linting checks with `flake8`, `pylint`, `black` and `isort`: +``` +make check-lint +``` + +To fix linting with `black`, `flynt` and `isort`: +``` +make fix-lint +``` + +To run a `pre-commit` check before actually commiting: +``` +make pre-commit +``` + +To run tests: +``` +make test +``` + +To run all tests, including the integration test: +``` +make test-all +``` + + +## Data + +## Experiment tracking + +Nothing is set up for now, but since Weights and Bias is accessible to MILA and DRAC, it +will probably be the way to go. + + +## Training + +## Contributing to this repository + +### Design patterns +Two main considerations have been made in the structure of this package. + +First, a polymorphic approach, using abstract classes and their concrete implementation, +has been but forward in order to increase maintainability and extensibility. + +Therefore, new additions should try to follow this design pattern and either implement +new concrete classes or create new abstract classes and their implementations for +completely new behavior or needs. + +Secondly, a dependency-injection approach is to be favored, as well as a composition +approach when creating new modules or extending existing ones. + +### Configurations +Configurations are in the [config/](config) folder. + + +### Tests diff --git a/climateset/__init__.py b/climateset/__init__.py new file mode 100644 index 0000000..8573550 --- /dev/null +++ b/climateset/__init__.py @@ -0,0 +1,7 @@ +from pathlib import Path + +APP_ROOT = Path(__file__).resolve().parent +PROJECT_ROOT = APP_ROOT.parent +CONFIG = PROJECT_ROOT / "config" +DATA_DIR = PROJECT_ROOT / "data" +SCRIPT_DIR = PROJECT_ROOT / "scripts" diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..caf7a29 --- /dev/null +++ b/config/README.md @@ -0,0 +1,8 @@ +# Configuration + +This folder is for configurations, like: + +- Application configurations +- Training parameters +- Script parameters +- etc. diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000..4e3e520 --- /dev/null +++ b/data/README.md @@ -0,0 +1,15 @@ +# Data + +This folder can either contain the data directly, or contain symlinks to +other folders, depending on your environment (Local machine, distributed cluster, etc.) + +## Licence Disclaimer + +In case some datasets have different license agreements + +## Structure + +Each dataset have their own READMEs, so make sure to read them! + +Current datasets: +- \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..7d55fc4 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,3 @@ +# Documentation + +This folder is for the eventual ReadTheDocs documentation files. \ No newline at end of file diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..4ab4632 --- /dev/null +++ b/environment.yml @@ -0,0 +1,6 @@ +name: climateset +channels: + - conda-forge +dependencies: + - python=3.10 + diff --git a/notebooks/README.md b/notebooks/README.md new file mode 100644 index 0000000..260fe6c --- /dev/null +++ b/notebooks/README.md @@ -0,0 +1,3 @@ +# Notebooks + +Place to store all the project's notebooks \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d944167 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2789 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {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 = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "astor" +version = "0.8.1" +description = "Read/rewrite/write Python ASTs" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, + {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, +] + +[[package]] +name = "astroid" +version = "3.1.0" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {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[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +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 = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "23.12.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +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)"] + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "bump-my-version" +version = "0.16.2" +description = "Version bump your Python project" +optional = false +python-versions = ">=3.8" +files = [ + {file = "bump-my-version-0.16.2.tar.gz", hash = "sha256:966dfc6cf9765a1d4a48fbaeb587a2e3a70ed5c13b04b5ee10c6e0134d4b8342"}, + {file = "bump_my_version-0.16.2-py3-none-any.whl", hash = "sha256:83820caf4f64465c674f41346a2135999d7c3359c35e42a67708cb957c5135be"}, +] + +[package.dependencies] +click = "*" +pydantic = ">=2.0.0" +pydantic-settings = "*" +rich = "*" +rich-click = "*" +tomlkit = "*" + +[package.extras] +dev = ["generate-changelog (>=0.7.6)", "git-fame (>=1.12.2)", "pip-tools", "pre-commit"] +docs = ["Sphinx (>=4.3.0)", "furo", "ghp-import", "linkify-it-py", "myst-parser", "sphinx-autodoc-typehints", "sphinx-autodoc2", "sphinx-click", "sphinx-copybutton"] +test = ["coverage", "pre-commit", "pytest", "pytest-cov", "pytest-mock"] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "debugpy" +version = "1.8.1" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {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 = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.19.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.13.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "flake8" +version = "7.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, + {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "flynt" +version = "1.0.1" +description = "CLI tool to convert a python project's %-formatted strings to f-strings." +optional = false +python-versions = ">=3.7" +files = [ + {file = "flynt-1.0.1-py3-none-any.whl", hash = "sha256:65d1c546434827275123222a98408e9561bcd67db832dd58f530ff17b8329ec1"}, + {file = "flynt-1.0.1.tar.gz", hash = "sha256:988aac00672a5469726cc0a17cef7d1178c284a9fe8563458db2475d0aaed965"}, +] + +[package.dependencies] +astor = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["build", "pre-commit", "pytest", "pytest-cov", "twine"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "identify" +version = "2.5.36" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.4" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.24.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, + {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {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.6)"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +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"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.9.25" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8" +files = [ + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, +] + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +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.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.1" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, + {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.1.8" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.1.8-py3-none-any.whl", hash = "sha256:c3baf3a2f91f89d110ed5786cd18672b9a357129d4e389d2a0dead15e11a4d2c"}, + {file = "jupyterlab-4.1.8.tar.gz", hash = "sha256:3384aded8680e7ce504fd63b8bb89a39df21c9c7694d9e7dc4a68742cdb30f9b"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=8.0,<9.0)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-lsp" +version = "5.1.0" +description = "Coding assistance for JupyterLab with Language Server Protocol" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-lsp-5.1.0.tar.gz", hash = "sha256:aeac84093ada6d20ef57ae0e97811cc5796a0cab7237b32f8eddf993c0bb0356"}, + {file = "jupyterlab_lsp-5.1.0-py3-none-any.whl", hash = "sha256:290f473b001c7ebe1edfe391a545f50bc4aefe89d4a64db4f17e8de301db3a37"}, +] + +[package.dependencies] +jupyter-lsp = ">=2.0.0" +jupyterlab = ">=4.1.0,<5.0.0a0" + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.1" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.27.1-py3-none-any.whl", hash = "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75"}, + {file = "jupyterlab_server-2.27.1.tar.gz", hash = "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {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] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nbclient" +version = "0.10.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "notebook" +version = "7.1.3" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "notebook-7.1.3-py3-none-any.whl", hash = "sha256:919b911e59f41f6e3857ce93c9d93535ba66bb090059712770e5968c07e1004d"}, + {file = "notebook-7.1.3.tar.gz", hash = "sha256:41fcebff44cf7bb9377180808bcbae066629b55d8c7722f1ebbe75ca44f9cfc1"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.1.1,<4.2" +jupyterlab-server = ">=2.22.1,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" + +[package.extras] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {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 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "platformdirs" +version = "4.2.1" +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.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, +] + +[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 = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.7.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prometheus-client" +version = "0.20.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {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] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +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.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.7.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, + {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, + {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, + {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, + {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, + {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, + {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, + {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, + {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, + {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, + {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, + {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, + {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, + {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, + {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.2.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.2.1-py3-none-any.whl", hash = "sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091"}, + {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {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 = "pylint" +version = "3.1.0" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, +] + +[package.dependencies] +astroid = ">=3.1.0,<=3.2.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,<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\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyproject-api" +version = "1.6.1" +description = "API to interact with the python pyproject.toml based projects" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, + {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, +] + +[package.dependencies] +packaging = ">=23.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +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.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] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +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]] +name = "pywinpty" +version = "2.0.13" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "26.0.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a60a03b01e8c9c58932ec0cca15b1712d911c2800eb82d4281bc1ae5b6dad50"}, + {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:949067079e14ea1973bd740255e0840118c163d4bce8837f539d749f145cf5c3"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e7edfa6cf96d036a403775c96afa25058d1bb940a79786a9a2fc94a783abe3"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:903cc7a84a7d4326b43755c368780800e035aa3d711deae84a533fdffa8755b0"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cb2e41af165e5f327d06fbdd79a42a4e930267fade4e9f92d17f3ccce03f3a7"}, + {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:55353b8189adcfc4c125fc4ce59d477744118e9c0ec379dd0999c5fa120ac4f5"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f961423ff6236a752ced80057a20e623044df95924ed1009f844cde8b3a595f9"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ba77fe84fe4f5f3dc0ef681a6d366685c8ffe1c8439c1d7530997b05ac06a04b"}, + {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:52589f0a745ef61b9c75c872cf91f8c1f7c0668eb3dd99d7abd639d8c0fb9ca7"}, + {file = "pyzmq-26.0.2-cp310-cp310-win32.whl", hash = "sha256:b7b6d2a46c7afe2ad03ec8faf9967090c8ceae85c4d8934d17d7cae6f9062b64"}, + {file = "pyzmq-26.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:86531e20de249d9204cc6d8b13d5a30537748c78820215161d8a3b9ea58ca111"}, + {file = "pyzmq-26.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:f26a05029ecd2bd306b941ff8cb80f7620b7901421052bc429d238305b1cbf2f"}, + {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:70770e296a9cb03d955540c99360aab861cbb3cba29516abbd106a15dbd91268"}, + {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2740fd7161b39e178554ebf21aa5667a1c9ef0cd2cb74298fd4ef017dae7aec4"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3706c32dea077faa42b1c92d825b7f86c866f72532d342e0be5e64d14d858"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa1416876194927f7723d6b7171b95e1115602967fc6bfccbc0d2d51d8ebae1"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ef9a79a48794099c57dc2df00340b5d47c5caa1792f9ddb8c7a26b1280bd575"}, + {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1c60fcdfa3229aeee4291c5d60faed3a813b18bdadb86299c4bf49e8e51e8605"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e943c39c206b04df2eb5d71305761d7c3ca75fd49452115ea92db1b5b98dbdef"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8da0ed8a598693731c76659880a668f4748b59158f26ed283a93f7f04d47447e"}, + {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bf51970b11d67096bede97cdbad0f4333f7664f4708b9b2acb352bf4faa3140"}, + {file = "pyzmq-26.0.2-cp311-cp311-win32.whl", hash = "sha256:6f8e6bd5d066be605faa9fe5ec10aa1a46ad9f18fc8646f2b9aaefc8fb575742"}, + {file = "pyzmq-26.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d03da3a0ae691b361edcb39530075461202f699ce05adbb15055a0e1c9bcaa4"}, + {file = "pyzmq-26.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f84e33321b68ff00b60e9dbd1a483e31ab6022c577c8de525b8e771bd274ce68"}, + {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:44c33ebd1c62a01db7fbc24e18bdda569d6639217d13d5929e986a2b0f69070d"}, + {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ac04f904b4fce4afea9cdccbb78e24d468cb610a839d5a698853e14e2a3f9ecf"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2133de5ba9adc5f481884ccb699eac9ce789708292945c05746880f95b241c0"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7753c67c570d7fc80c2dc59b90ca1196f1224e0e2e29a548980c95fe0fe27fc1"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4e51632e6b12e65e8d9d7612446ecda2eda637a868afa7bce16270194650dd"}, + {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d6c38806f6ecd0acf3104b8d7e76a206bcf56dadd6ce03720d2fa9d9157d5718"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:48f496bbe14686b51cec15406323ae6942851e14022efd7fc0e2ecd092c5982c"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e84a3161149c75bb7a7dc8646384186c34033e286a67fec1ad1bdedea165e7f4"}, + {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dabf796c67aa9f5a4fcc956d47f0d48b5c1ed288d628cf53aa1cf08e88654343"}, + {file = "pyzmq-26.0.2-cp312-cp312-win32.whl", hash = "sha256:3eee4c676af1b109f708d80ef0cf57ecb8aaa5900d1edaf90406aea7e0e20e37"}, + {file = "pyzmq-26.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:26721fec65846b3e4450dad050d67d31b017f97e67f7e0647b5f98aa47f828cf"}, + {file = "pyzmq-26.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:653955c6c233e90de128a1b8e882abc7216f41f44218056bd519969c8c413a15"}, + {file = "pyzmq-26.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:becd8d8fb068fbb5a52096efd83a2d8e54354383f691781f53a4c26aee944542"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a15e5465e7083c12517209c9dd24722b25e9b63c49a563922922fc03554eb35"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8158ac8616941f874841f9fa0f6d2f1466178c2ff91ea08353fdc19de0d40c2"}, + {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c6a53e28c7066ea7db86fcc0b71d78d01b818bb11d4a4341ec35059885295"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bdbc7dab0b0e9c62c97b732899c4242e3282ba803bad668e03650b59b165466e"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e74b6d5ef57bb65bf1b4a37453d8d86d88550dde3fb0f23b1f1a24e60c70af5b"}, + {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ed4c6ee624ecbc77b18aeeb07bf0700d26571ab95b8f723f0d02e056b5bce438"}, + {file = "pyzmq-26.0.2-cp37-cp37m-win32.whl", hash = "sha256:8a98b3cb0484b83c19d8fb5524c8a469cd9f10e743f5904ac285d92678ee761f"}, + {file = "pyzmq-26.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aa5f95d71b6eca9cec28aa0a2f8310ea53dea313b63db74932879ff860c1fb8d"}, + {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:5ff56c76ce77b9805378a7a73032c17cbdb1a5b84faa1df03c5d3e306e5616df"}, + {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bab697fc1574fee4b81da955678708567c43c813c84c91074e452bda5346c921"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c0fed8aa9ba0488ee1cbdaa304deea92d52fab43d373297002cfcc69c0a20c5"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:606b922699fcec472ed814dda4dc3ff7c748254e0b26762a0ba21a726eb1c107"}, + {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f0fd82bad4d199fa993fbf0ac586a7ac5879addbe436a35a389df7e0eb4c91"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:166c5e41045939a52c01e6f374e493d9a6a45dfe677360d3e7026e38c42e8906"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d566e859e8b8d5bca08467c093061774924b3d78a5ba290e82735b2569edc84b"}, + {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:264ee0e72b72ca59279dc320deab5ae0fac0d97881aed1875ce4bde2e56ffde0"}, + {file = "pyzmq-26.0.2-cp38-cp38-win32.whl", hash = "sha256:3152bbd3a4744cbdd83dfb210ed701838b8b0c9065cef14671d6d91df12197d0"}, + {file = "pyzmq-26.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf77601d75ca692c179154b7e5943c286a4aaffec02c491afe05e60493ce95f2"}, + {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c770a7545b3deca2db185b59175e710a820dd4ed43619f4c02e90b0e227c6252"}, + {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47175f0a380bfd051726bc5c0054036ae4a5d8caf922c62c8a172ccd95c1a2a"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bce298c1ce077837e110367c321285dc4246b531cde1abfc27e4a5bbe2bed4d"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c40b09b7e184d6e3e1be1c8af2cc320c0f9f610d8a5df3dd866e6e6e4e32b235"}, + {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d420d856bf728713874cefb911398efe69e1577835851dd297a308a78c14c249"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d792d3cab987058451e55c70c5926e93e2ceb68ca5a2334863bb903eb860c9cb"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:83ec17729cf6d3464dab98a11e98294fcd50e6b17eaabd3d841515c23f6dbd3a"}, + {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47c17d5ebfa88ae90f08960c97b49917098665b8cd8be31f2c24e177bcf37a0f"}, + {file = "pyzmq-26.0.2-cp39-cp39-win32.whl", hash = "sha256:d509685d1cd1d018705a811c5f9d5bc237790936ead6d06f6558b77e16cc7235"}, + {file = "pyzmq-26.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7cc8cc009e8f6989a6d86c96f87dae5f5fb07d6c96916cdc7719d546152c7db"}, + {file = "pyzmq-26.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:3ada31cb879cd7532f4a85b501f4255c747d4813ab76b35c49ed510ce4865b45"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0a6ceaddc830dd3ca86cb8451cf373d1f05215368e11834538c2902ed5205139"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a967681463aa7a99eb9a62bb18229b653b45c10ff0947b31cc0837a83dfb86f"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6472a73bc115bc40a2076609a90894775abe6faf19a78375675a2f889a613071"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6aea92bcccfe5e5524d3c70a6f16ffdae548390ddad26f4207d55c55a40593"}, + {file = "pyzmq-26.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e025f6351e49d48a5aa2f5a09293aa769b0ee7369c25bed551647234b7fa0c75"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40bd7ebe4dbb37d27f0c56e2a844f360239343a99be422085e13e97da13f73f9"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dd40d586ad6f53764104df6e01810fe1b4e88fd353774629a5e6fe253813f79"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2aca15e9ad8c8657b5b3d7ae3d1724dc8c1c1059c06b4b674c3aa36305f4930"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450ec234736732eb0ebeffdb95a352450d4592f12c3e087e2a9183386d22c8bf"}, + {file = "pyzmq-26.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f43be2bebbd09360a2f23af83b243dc25ffe7b583ea8c722e6df03e03a55f02f"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:867f55e54aff254940bcec5eec068e7c0ac1e6bf360ab91479394a8bf356b0e6"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4dbc033c5ad46f8c429bf238c25a889b8c1d86bfe23a74e1031a991cb3f0000"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6e8dd2961462e337e21092ec2da0c69d814dcb1b6e892955a37444a425e9cfb8"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35391e72df6c14a09b697c7b94384947c1dd326aca883ff98ff137acdf586c33"}, + {file = "pyzmq-26.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1c3d3c92fa54eda94ab369ca5b8d35059987c326ba5e55326eb068862f64b1fc"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7aa61a9cc4f0523373e31fc9255bf4567185a099f85ca3598e64de484da3ab2"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee53a8191271f144cc20b12c19daa9f1546adc84a2f33839e3338039b55c373c"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac60a980f07fa988983f7bfe6404ef3f1e4303f5288a01713bc1266df6d18783"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88896b1b4817d7b2fe1ec7205c4bbe07bf5d92fb249bf2d226ddea8761996068"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:18dfffe23751edee917764ffa133d5d3fef28dfd1cf3adebef8c90bc854c74c4"}, + {file = "pyzmq-26.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6926dd14cfe6967d3322640b6d5c3c3039db71716a5e43cca6e3b474e73e0b36"}, + {file = "pyzmq-26.0.2.tar.gz", hash = "sha256:f0f9bb370449158359bb72a3e12c658327670c0ffe6fbcd1af083152b64f9df0"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.35.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.0-py3-none-any.whl", hash = "sha256:8080727b30e364e5783152903672df9b6b091c926a146a759080b62ca3126cd6"}, + {file = "referencing-0.35.0.tar.gz", hash = "sha256:191e936b0c696d0af17ad7430a3dc68e88bc11be6514f4757dc890f04ab05889"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rich" +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.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rich-click" +version = "1.7.4" +description = "Format click help output nicely with rich" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rich-click-1.7.4.tar.gz", hash = "sha256:7ce5de8e4dc0333aec946113529b3eeb349f2e5d2fafee96b9edf8ee36a01395"}, + {file = "rich_click-1.7.4-py3-none-any.whl", hash = "sha256:e363655475c60fec5a3e16a1eb618118ed79e666c365a36006b107c17c93ac4e"}, +] + +[package.dependencies] +click = ">=7" +rich = ">=10.7.0" +typing-extensions = "*" + +[package.extras] +dev = ["flake8", "flake8-docstrings", "mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "types-setuptools"] + +[[package]] +name = "rpds-py" +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.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]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "69.5.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.3.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, + {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.4" +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"}, +] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "tox" +version = "4.15.0" +description = "tox is a generic virtualenv management and test command line tool" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tox-4.15.0-py3-none-any.whl", hash = "sha256:300055f335d855b2ab1b12c5802de7f62a36d4fd53f30bd2835f6a201dda46ea"}, + {file = "tox-4.15.0.tar.gz", hash = "sha256:7a0beeef166fbe566f54f795b4906c31b428eddafc0102ac00d20998dd1933f6"}, +] + +[package.dependencies] +cachetools = ">=5.3.2" +chardet = ">=5.2" +colorama = ">=0.4.6" +filelock = ">=3.13.1" +packaging = ">=23.2" +platformdirs = ">=4.1" +pluggy = ">=1.3" +pyproject-api = ">=1.6.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +virtualenv = ">=20.25" + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] +testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=8.0.2)", "distlib (>=0.3.8)", "flaky (>=3.7)", "hatch-vcs (>=0.4)", "hatchling (>=1.21)", "psutil (>=5.9.7)", "pytest (>=7.4.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-xdist (>=3.5)", "re-assert (>=1.1)", "time-machine (>=2.13)", "wheel (>=0.42)"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {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,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.26.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.0-py3-none-any.whl", hash = "sha256:0846377ea76e818daaa3e00a4365c018bc3ac9760cbb3544de542885aad61fb3"}, + {file = "virtualenv-20.26.0.tar.gz", hash = "sha256:ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "1.13" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, + {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "0443fac87f85e0d23cab7d3e9a85b1c4eccf4aaf1cf67d30546933d1dd9e4ae6" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..3803b6f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,106 @@ +[tool.poetry] +name = "climateset" +version = "0.0.0" +description = "" +authors = ["f-PLT "] +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" + + +[tool.poetry.group.dev] +optional = true + +[tool.poetry.group.dev.dependencies] +pytest = "^7.4.4" +pylint = "^3.0.3" +black = "^23.12.1" +isort = "^5.13.2" +bump-my-version = "^0.16.2" +tox = "^4.12.0" +flynt = "^1.0.1" +flake8 = "^7.0.0" +pre-commit = "^3.7.0" + +[tool.poetry.group.lab] +optional = true + +[tool.poetry.group.lab.dependencies] +jupyterlab = "^4.0.10" +notebook = "^7.0.6" +jupyterlab-lsp = "^5.0.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +# +# Scripts +# +[tool.poetry.scripts] + +# +# Tools +# + +[tool.bumpversion] +current_version = "0.0.0" +commit = true +message = "Version {new_version} released." +tag = true +tag_name = "{new_version}" +parse = '(?P\d+)\.(?P\d+)\.(?P\d+) (?P.*)?' +serialize = [ + "{major}.{minor}.{patch}", + "{utcnow:%Y-%m-%dT%H:%M:%SZ}" +] + +[[tool.bumpversion.files]] +filename = "pyproject.toml" +search = 'version = "{current_version}"' +replace = 'version = "{new_version}"' + +[[tool.bumpversion.files]] +filename = "CHANGES.md" +search = ''' +[Unreleased](https://github.com/RolnickLab/ClimateSetExtension/tree/main) (latest) +------------------------------------------------------------------------------------- +''' +replace = ''' +[Unreleased](https://github.com/RolnickLab/ClimateSetExtension/tree/main) (latest) +------------------------------------------------------------------------------------- + +[//]: # (New changes here in list form) + +[{new_version}](https://github.com/RolnickLab/ClimateSetExtension/tree/{new_version}) ({utcnow:%Y-%m-%d}) +------------------------------------------------------------------------------------- +''' + +[tool.pylint] +disable = "C0114,C0115,C0116,R0903,R1710" +max-line-length = 120 + +[tool.flake8] +max-line-length = 120 +ignore = ["E203", "E266", "E501", "W503"] +docstring-convention = "numpy" +max-complexity = 18 +per-file-ignores = [] +exclude = [ + ".git", + "migrations", + "__pycache__" +] + +[tool.black] +line-length = 120 +target-version = ["py310"] + +[tool.isort] +profile = "black" + +[tool.flynt] +line-length = 120 +transform-concats = true +verbose = true \ No newline at end of file diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..e69de29 diff --git a/scripts/config.sh.example b/scripts/config.sh.example new file mode 100644 index 0000000..a6c2adf --- /dev/null +++ b/scripts/config.sh.example @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# This script can be configured with paths exclusive to your own development environment +# and then sourced in other scripts, so that many people can use the same scripts +# in different environments. +# +# With this, we want to avoid relative paths (as they can change/break easily) +# and hard-coded paths in the code itself. A repository is installed in a +# different path for each person in a given project. We want people to be able +# to use the same scripts instead of replicating them with personalized hard-coded paths +# +# For example: +# +# - config.sh +# #!/usr/bin/env bash +# +# export PROJECT_DIR="" +# +# - some-script.sh +# #!/usr/bin/env bash +# +# module load miniconda/3 +# conda activate +# +# source config.sh +# +# cd "$PROJECT_DIR" || exit +# +# params_file="${PROJECT_DIR}/RELEVANT/PATH/TO/SOMEWHERE/FILE.yml" +# +# python3 some_script.py params_file + + +export PROJECT_DIR="" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..9f5afd4 --- /dev/null +++ b/tox.ini @@ -0,0 +1,54 @@ +[tox] +isolated_build = true +basepython = py310 +envlist = precommit +skipsdist = true + +[isort] +profile = black + +[testenv] +allowlist_externals = poetry +commands_pre = + poetry install + +file_and_folder_module_tests = climateset/ tests/ scripts/ +file_and_folder_list_module = climateset/ scripts/ + +[testenv:pylint] +commands = + poetry run pylint {[testenv]file_and_folder_list_module} + +[testenv:flake8] +commands = + poetry run flake8 {[testenv]file_and_folder_list_module} + +[testenv:fix] +commands = + poetry run black {[testenv]file_and_folder_module_tests} + poetry run isort {[testenv]file_and_folder_module_tests} + poetry run flynt {[testenv]file_and_folder_module_tests} + +[testenv:precommit] +commands = + poetry run pre-commit run --all-files + +[testenv:black] +commands = + poetry run black --check {[testenv]file_and_folder_module_tests} + +[testenv:isort] +commands = + poetry run isort {[testenv]file_and_folder_module_tests} --check + +[testenv:flynt] +commands = + poetry run flynt {[testenv]file_and_folder_module_tests} + +[testenv:test] +commands = + pytest -m "not offline" + +[testenv:test-all] +commands = + pytest \ No newline at end of file From ce03a5acd2ee9a9f4937a4cb63a38f360da7559b Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:02:34 -0400 Subject: [PATCH 02/32] Set CI to push and pull requests --- .github/workflows/lint.yml | 2 +- .github/workflows/precommit.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d7fcf03..7144366 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,6 @@ name: Lint -on: [pull_request] +on: [pull_request, push] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml index 2de7067..085d707 100644 --- a/.github/workflows/precommit.yml +++ b/.github/workflows/precommit.yml @@ -1,6 +1,6 @@ name: Pre-commit -on: [pull_request] +on: [pull_request, push] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} From 7dc62025709015268baf5b8142f5f00183be14a0 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:05:13 -0400 Subject: [PATCH 03/32] Add quotes to python version in CI --- .github/workflows/lint.yml | 2 +- .github/workflows/precommit.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7144366..814dd04 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: 3.10 + python-version: '3.10' - name: Install Poetry run: | diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml index 085d707..f24035e 100644 --- a/.github/workflows/precommit.yml +++ b/.github/workflows/precommit.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: 3.10 + python-version: '3.10' - name: Install Poetry run: | From 525ea08d21441f8cefff1191cf22f8bda28b14ce Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:06:32 -0400 Subject: [PATCH 04/32] Rename job to Pylint --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 814dd04..3ead8d3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,7 +7,7 @@ concurrency: cancel-in-progress: true jobs: - lint: + Pylint: if: github.event.pull_request.draft == false runs-on: ubuntu-latest From 2802e759589f7bc7a9168358b3c9e94f99123bce Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:17:22 -0400 Subject: [PATCH 05/32] Rename step in precommit CI --- .github/workflows/precommit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml index f24035e..9473e24 100644 --- a/.github/workflows/precommit.yml +++ b/.github/workflows/precommit.yml @@ -31,6 +31,6 @@ jobs: run: | make install - - name: Run linting checks + - name: Run Pre-commit checks run: | make pre-commit \ No newline at end of file From 8a509e8a6a6b234cee4401e70a4c55dc9ff47e70 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 26 Apr 2024 18:33:54 -0400 Subject: [PATCH 06/32] Update README.md --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4127049..55f56b0 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,9 @@ be possible to create you own environment with, for example, poetry, pyenv or vi **Do note that this project is configured to use [Poetry](https://python-poetry.org/) and as such, this tool is required to install it.** -Poetry is included in the [environment.yml](environment.yml) used by the commands below to -create a conda environment. +Poetry is not included in the [environment.yml](environment.yml), due to some problems +in compute cluster environments, but will be installed automatically if needed +by most `install` targets. If you need or want to install Conda: ``` @@ -34,11 +35,18 @@ make create-env After you have created your Conda environment, or you want to manage your environment yourself, make sure to activate it properly before installing this package. -To install the package and its CLI tools: +To install the package, development dependencies and CLI tools (if available): ``` make install ``` +To install only the package, without development tools: +``` +make install-package +``` + + + ## Basic automations To run linting checks with `flake8`, `pylint`, `black` and `isort`: @@ -66,7 +74,6 @@ To run all tests, including the integration test: make test-all ``` - ## Data ## Experiment tracking From 27bba3ccefdb0d123323cf81b26945bbc6bbbda4 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 1 May 2024 16:25:03 -0400 Subject: [PATCH 07/32] Add some more utilities to Makefile --- .pre-commit-config.yaml | 1 + CONTRIBUTING.md | 1 + Makefile | 115 +++++++++++++++++++++++++++------------- pyproject.toml | 5 ++ 4 files changed, 85 insertions(+), 37 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a02d625..07d98ce 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,6 +14,7 @@ repos: - id: check-case-conflict - id: check-docstring-first - id: detect-private-key + - id: check-added-large-files - repo: https://github.com/psf/black rev: 23.12.1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..beccb33 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1 @@ +# Contributing to this repository \ No newline at end of file diff --git a/Makefile b/Makefile index eb72264..9065328 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,65 @@ -## -- Basic variables +## Basic variables PROJECT_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) +MAKEFILE_NAME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) SHELL := /usr/bin/env bash BUMP_TOOL := bump-my-version DOCKER_COMPOSE := docker compose +APP_VERSION := 0.0.0 -## -- Conda variables +## Conda variables # CONDA_TOOL can be overridden in Makefile.private file CONDA_TOOL ?= conda CONDA_ENVIRONMENT := climateset - -## -- Private variables import to override variables for local +# Private variables import to override variables for local +# All overridable variables must be above this -include Makefile.private -#### Install #### +# Colors +_SECTION := \033[1m\033[34m +_TARGET := \033[36m +_NORMAL := \033[0m + +.DEFAULT_GOAL := help +## -- Informative targets ------------------------------------------------------------------------------------------- ## + +.PHONY: all +all: help + +# Auto documented help targets & sections from comments +# - detects lines marked by double #, then applies the corresponding target/section markup +# - target comments must be defined after their dependencies (if any) +# - section comments must have at least a double dash (-) +# +# Original Reference: +# https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +# Formats: +# https://misc.flogisoft.com/bash/tip_colors_and_formatting +# +# As well as influenced by it's implementation in the Weaver Project +# https://github.com/crim-ca/weaver/tree/master + +.PHONY: help +# note: use "\#\#" to escape results that would self-match in this target's search definition +help: ## print this help message (default) + @echo "" + @echo "Please use 'make ' where is one of below options." + @echo "" + @grep -E '\#\#.*$$' "$(PROJECT_PATH)/$(MAKEFILE_NAME)" \ + | awk ' BEGIN {FS = "(:|\-\-\-)+.*?\#\# "}; \ + /\--/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \ + /:/ {printf " $(_TARGET)%-24s$(_NORMAL) %s\n", $$1, $$2} \ + ' + +.PHONY: targets +targets: help + +.PHONY: version +version: ## display current version + @-echo "version: $(APP_VERSION)" + + +## -- Conda targets ------------------------------------------------------------------------------------------------- ## .PHONY: install-conda install-conda: ## Install conda on your local machine @@ -53,9 +99,8 @@ install-conda: ## Install conda on your local machine echo "Conda tool [$(CONDA_TOOL)] has been found, skipping installation"; \ fi; - -.PHONY: create-env -create-env: install-conda ## Create a local conda environment +.PHONY: create-conda-env +create-env: install-conda ## Create a local conda environment based on `environment.yml` $(CONDA_TOOL) env create -f environment.yml @echo "" @echo "#####################################################################" @@ -68,19 +113,21 @@ create-env: install-conda ## Create a local conda environment @echo "" @echo "" -.PHONY: install -install: install-precommit ## Install the application and it's dependencies +## -- Install targets ----------------------------------------------------------------------------------------------- ## .PHONY: install-poetry -install-poetry: ## Install the application and it's dependencies +install-poetry: ## Install Poetry in the active environment (Also gets installed with other install targets) @poetry --version; \ if [ $$? != "0" ]; then \ echo "Poetry not found, proceeding to install Poetry..."; \ pip install poetry==1.8.2; \ fi; + +.PHONY: install +install: install-precommit ## Install the application package, developer dependencies and pre-commit hook .PHONY: install-precommit -install-precommit: install-dev## Install the application and it's dependencies +install-precommit: install-dev## Install the pre-commit hooks (also installs developer dependencies) @if [ -f .git/hooks/pre-commit ]; then \ echo "Pre-commit hook found"; \ else \ @@ -88,19 +135,20 @@ install-precommit: install-dev## Install the application and it's dependencies poetry run pre-commit install; \ fi; -.PHONY: install-package -install-package: install-poetry ## Install the application and it's dependencies - @poetry install - .PHONY: install-dev -install-dev: install-poetry ## Install the application and it's dependencies +install-dev: install-poetry ## Install the application along with developer dependencies @poetry install --with dev .PHONY: install-with-lab -install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter +install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter Lab poetry install --with lab -#### Versionning #### + +.PHONY: install-package +install-package: install-poetry ## Install the application package only + @poetry install + +## -- Versionning targets ------------------------------------------------------------------------------------------- ## # Use the "dry" target for a dry-run version bump, ex. # make bump-major dry @@ -121,39 +169,32 @@ bump-minor: ## Bump application major version <0.X.0> bump-patch: ## Bump application major version <0.0.X> $(BUMP_TOOL) $(BUMP_ARGS) patch -#### Docker #### +## -- Docker targets ------------------------------------------------------------------------------------------------ ## -#### Linting #### +## -- Linting targets ----------------------------------------------------------------------------------------------- ## .PHONY: check-lint check-lint: ## Check code linting poetry run tox -e black,isort,flake8,pylint -.PHONY: check-flake8 -check-flake8: ## Check code linting with only flake8 - poetry run tox -e flake8 - -.PHONY: check-pylint -check-pylint: ## Check code linting with only flake8 - poetry run tox -e pylint - -.PHONY: pre-commit -pre-commit: ## Fix code linting - poetry run tox -e precommit - .PHONY: fix-lint fix-lint: ## Fix code linting poetry run tox -e fix -#### Tests #### +.PHONY: precommit +precommit: ## Run Pre-commit on all files manually + poetry run tox -e precommit + +## -- Tests targets ------------------------------------------------------------------------------------------------- ## .PHONY: test -test: ## Run tests +test: ## Run tests except offline tests poetry run tox -e test .PHONY: test-all -test-all: ## Run tests +test-all: ## Run all tests poetry run tox -e test-all -#### Application #### +## -- Application targets ------------------------------------------------------------------------------------------- ## +# For custom targets that have to do with this application \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3803b6f..df877d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,11 @@ filename = "pyproject.toml" search = 'version = "{current_version}"' replace = 'version = "{new_version}"' +[[tool.bumpversion.files]] +filename = "Makefile" +search = 'APP_VERSION := "{current_version}"' +replace = 'APP_VERSION := "{new_version}"' + [[tool.bumpversion.files]] filename = "CHANGES.md" search = ''' From ac52a5cf2bfccf0de68bf5ee2fa1183f67d0f568 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 1 May 2024 16:51:35 -0400 Subject: [PATCH 08/32] Update README.md and CONTRIBUTING.md --- CONTRIBUTING.md | 24 +++++++++++++++++++++++- README.md | 27 ++++++++++++--------------- images/make_targets.png | Bin 0 -> 80787 bytes 3 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 images/make_targets.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index beccb33..bfc6b08 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1,23 @@ -# Contributing to this repository \ No newline at end of file +# Contributing to this repository + +## Design patterns +Two main considerations should be made when contributing to this package. + +First, a polymorphic approach, using abstract classes and their concrete implementation, +should be prioritized in order to increase maintainability and extensibility. + +Therefore, new additions should try to follow this design pattern and either implement +new concrete classes or create new abstract classes and their implementations for +completely new behavior or needs. + +Secondly, a dependency-injection approach is to be preferred, as well as a composition +approach when creating new modules or extending existing ones. + +## Tests + +New contributions should include appropriate tests. + +## Docstring and type hinting + +Docstring format should follow the Numpy standard and type hinting should be used +as per the PEP8 standard : https://docs.python.org/3/library/typing.html \ No newline at end of file diff --git a/README.md b/README.md index 55f56b0..733d2e9 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,15 @@ machine there's a good chance this will work on your machine. Please consult the [Makefile](Makefile) before trying to use it. +## Basic Information + +Much of this repository is organized through the Makefile. + +The different targets and their description can be examined by executing the command +`make targets` + +![](images/make_targets.png) + ## Installation This project assumes environment management will be done with Conda. It would, however, @@ -45,8 +54,6 @@ To install only the package, without development tools: make install-package ``` - - ## Basic automations To run linting checks with `flake8`, `pylint`, `black` and `isort`: @@ -59,9 +66,9 @@ To fix linting with `black`, `flynt` and `isort`: make fix-lint ``` -To run a `pre-commit` check before actually commiting: +To run a `pre-commit` check before actually committing: ``` -make pre-commit +make precommit ``` To run tests: @@ -86,18 +93,8 @@ will probably be the way to go. ## Contributing to this repository -### Design patterns -Two main considerations have been made in the structure of this package. - -First, a polymorphic approach, using abstract classes and their concrete implementation, -has been but forward in order to increase maintainability and extensibility. - -Therefore, new additions should try to follow this design pattern and either implement -new concrete classes or create new abstract classes and their implementations for -completely new behavior or needs. +See [Contributing guide lines](CONTRIBUTING.md) -Secondly, a dependency-injection approach is to be favored, as well as a composition -approach when creating new modules or extending existing ones. ### Configurations Configurations are in the [config/](config) folder. diff --git a/images/make_targets.png b/images/make_targets.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdbbcfe03ed3992e808c8e7975ca8191381d9b5 GIT binary patch literal 80787 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 Date: Wed, 1 May 2024 16:55:30 -0400 Subject: [PATCH 09/32] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 733d2e9..196ab0b 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ will probably be the way to go. ## Contributing to this repository -See [Contributing guide lines](CONTRIBUTING.md) +See [Contributing guidelines](CONTRIBUTING.md) ### Configurations From a0eb2b1e099ecc75a5be6d505773bece5a35fb2c Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 1 May 2024 17:08:50 -0400 Subject: [PATCH 10/32] Update CI --- .github/workflows/precommit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml index 9473e24..92c9138 100644 --- a/.github/workflows/precommit.yml +++ b/.github/workflows/precommit.yml @@ -33,4 +33,4 @@ jobs: - name: Run Pre-commit checks run: | - make pre-commit \ No newline at end of file + make precommit \ No newline at end of file From af0ec507f76f17a7b75369c89146354b16e427e4 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 1 May 2024 17:37:16 -0400 Subject: [PATCH 11/32] Update Makefile linting targets --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9065328..d19bba7 100644 --- a/Makefile +++ b/Makefile @@ -174,11 +174,15 @@ bump-patch: ## Bump application major version <0.0.X> ## -- Linting targets ----------------------------------------------------------------------------------------------- ## .PHONY: check-lint -check-lint: ## Check code linting +check-lint: ## Check code linting (black, isort, flake8 and pylint) poetry run tox -e black,isort,flake8,pylint +.PHONY: check-pylint +check-pylint: ## Check code with pylint + poetry run tox -e pylint + .PHONY: fix-lint -fix-lint: ## Fix code linting +fix-lint: ## Fix code linting (black, isort, flynt) poetry run tox -e fix .PHONY: precommit From d392e819d3186196876696acbfb7af81fb9b6c87 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 1 May 2024 19:11:43 -0400 Subject: [PATCH 12/32] Add `flake8-pyproject` --- .pre-commit-config.yaml | 1 + poetry.lock | 19 ++++++++++++++++++- pyproject.toml | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 07d98ce..d0ae46e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,6 +37,7 @@ repos: rev: 7.0.0 hooks: - id: flake8 + additional_dependencies: [flake8-pyproject] # sets up .pre-commit-ci.yaml to ensure pre-commit dependencies stay up to date ci: diff --git a/poetry.lock b/poetry.lock index d944167..997a335 100644 --- a/poetry.lock +++ b/poetry.lock @@ -721,6 +721,23 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.11.0,<2.12.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" +TOMLi = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + [[package]] name = "flynt" version = "1.0.1" @@ -2786,4 +2803,4 @@ test = ["websockets"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "0443fac87f85e0d23cab7d3e9a85b1c4eccf4aaf1cf67d30546933d1dd9e4ae6" +content-hash = "735d50e364ae97432e6f9f7e3dff976372b14a245a7673df9479680c37d494cc" diff --git a/pyproject.toml b/pyproject.toml index df877d4..2521512 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ tox = "^4.12.0" flynt = "^1.0.1" flake8 = "^7.0.0" pre-commit = "^3.7.0" +flake8-pyproject = "^1.2.3" [tool.poetry.group.lab] optional = true From 1ed0a847648265819873092f3689e27185139d62 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 8 May 2024 17:48:29 -0400 Subject: [PATCH 13/32] Isolate base makefile functions --- .make/base.make | 247 +++++++++++++++++++++++++++++++++++++++ Makefile | 219 +++------------------------------- Makefile.private.example | 23 ++-- Makefile.targets | 5 + Makefile.variables | 2 + 5 files changed, 287 insertions(+), 209 deletions(-) create mode 100644 .make/base.make create mode 100644 Makefile.targets create mode 100644 Makefile.variables diff --git a/.make/base.make b/.make/base.make new file mode 100644 index 0000000..8c9dd1c --- /dev/null +++ b/.make/base.make @@ -0,0 +1,247 @@ +######################################################################################## +# +# DO NOT MODIFY!!! +# If necessary, override the corresponding variable and/or target, or create new ones +# in one of the following files, depending on the nature of the override : +# +# `Makefile.variables`, `Makefile.targets` or `Makefile.private`, +# +# The only valid reason to modify this file is to fix a bug or to add new +# files to include. +######################################################################################## + +## Basic variables +PROJECT_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) +MAKEFILE_NAME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +SHELL := /usr/bin/env bash +BUMP_TOOL := bump-my-version +APP_VERSION := 0.0.0 +DOCKER_COMPOSE ?= docker compose + +## Conda variables +# CONDA_TOOL can be overridden in Makefile.private file +CONDA_TOOL ?= conda +CONDA_ENVIRONMENT ?= + +# Colors +_SECTION := \033[1m\033[34m +_TARGET := \033[36m +_NORMAL := \033[0m + +.DEFAULT_GOAL := help +## -- Informative targets ------------------------------------------------------------------------------------------- ## + +.PHONY: all +all: help + +# Auto documented help targets & sections from comments +# - detects lines marked by double #, then applies the corresponding target/section markup +# - target comments must be defined after their dependencies (if any) +# - section comments must have at least a double dash (-) +# +# Original Reference: +# https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +# Formats: +# https://misc.flogisoft.com/bash/tip_colors_and_formatting +# +# As well as influenced by it's implementation in the Weaver Project +# https://github.com/crim-ca/weaver/tree/master + +.PHONY: help +# note: use "\#\#" to escape results that would self-match in this target's search definition +help: ## print this help message (default) + @echo "" + @echo "Please use 'make ' where is one of below options." + @echo "" + @for makefile in $(MAKEFILE_LIST); do \ + grep -E '\#\#.*$$' "$(PROJECT_PATH)/$${makefile}" \ + | awk ' BEGIN {FS = "(:|\-\-\-)+.*?\#\# "}; \ + /\--/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \ + /:/ {printf " $(_TARGET)%-24s$(_NORMAL) %s\n", $$1, $$2} \ + ' ; \ + done +.PHONY: targets +targets: help + +.PHONY: version +version: ## display current version + @-echo "version: $(APP_VERSION)" + + +## -- Conda targets ------------------------------------------------------------------------------------------------- ## + +.PHONY: install-conda +install-conda: ## Install conda on your local machine + @$(CONDA_TOOL) --version; \ + if [ $$? != "0" ]; then \ + echo " "; \ + echo "Your defined Conda tool [$(CONDA_TOOL)] has not been found."; \ + echo " "; \ + echo "If you know you already have [$(CONDA_TOOL)] or some other Conda tool installed,"; \ + echo "Check your [CONDA_TOOL] variable in the Makefile.private for typos."; \ + echo " "; \ + echo "If your conda tool has not been initiated through your .bashrc file,"; \ + echo "consider using the full path to its executable instead when"; \ + echo "defining your [CONDA_TOOL] variable"; \ + echo " "; \ + echo "If in doubt, don't install Conda and manually create and activate"; \ + echo "your own Python environment."; \ + echo " "; \ + echo -n "Would you like to install Miniconda ? [y/N]: "; \ + read ans; \ + case $$ans in \ + [Yy]*) \ + echo "Fetching and installing miniconda"; \ + echo " "; \ + wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh; \ + bash ~/miniconda.sh -b -p $HOME/.conda; \ + export PATH=$HOME/.conda/bin:$PATH; \ + conda init; \ + /usr/bin/rm ~/miniconda.sh; \ + ;; \ + *) \ + echo "Skipping installation."; \ + echo " "; \ + ;; \ + esac; \ + else \ + echo "Conda tool [$(CONDA_TOOL)] has been found, skipping installation"; \ + fi; + +.PHONY: create-conda-env +create-env: install-conda ## Create a local conda environment based on `environment.yml` + $(CONDA_TOOL) env create -f environment.yml + @echo "" + @echo "#####################################################################" + @echo "# #" + @echo "# Please activate your new environment using the following command: #" + @echo "# #" + @echo "#####################################################################" + @echo "" + @echo "$(CONDA_TOOL) activate $(CONDA_ENVIRONMENT)" + @echo "" + @echo "" + +## -- Install targets ----------------------------------------------------------------------------------------------- ## + +.PHONY: install-poetry +install-poetry: ## Install Poetry in the active environment (Also gets installed with other install targets) + @poetry --version; \ + if [ $$? != "0" ]; then \ + echo "Poetry not found, proceeding to install Poetry..."; \ + pip install poetry==1.8.2; \ + fi; + +.PHONY: install +install: install-precommit ## Install the application package, developer dependencies and pre-commit hook + +.PHONY: install-precommit +install-precommit: install-dev## Install the pre-commit hooks (also installs developer dependencies) + @if [ -f .git/hooks/pre-commit ]; then \ + echo "Pre-commit hook found"; \ + else \ + echo "Pre-commit hook not found, proceeding to configure it"; \ + poetry run pre-commit install; \ + fi; + +.PHONY: install-dev +install-dev: install-poetry ## Install the application along with developer dependencies + @poetry install --with dev + +.PHONY: install-with-lab +install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter Lab + @poetry install --with lab + + +.PHONY: install-package +install-package: install-poetry ## Install the application package only + @poetry install + +## -- Versionning targets ------------------------------------------------------------------------------------------- ## + +# Use the "dry" target for a dry-run version bump, ex. +# make bump-major dry +BUMP_ARGS ?= --verbose +ifeq ($(filter dry, $(MAKECMDGOALS)), dry) + BUMP_ARGS := $(BUMP_ARGS) --dry-run --allow-dirty +endif + +.PHONY: bump-major +bump-major: ## Bump application major version + $(BUMP_TOOL) $(BUMP_ARGS) bump major + +.PHONY: bump-minor +bump-minor: ## Bump application major version <0.X.0> + $(BUMP_TOOL) $(BUMP_ARGS) bump minor + +.PHONY: bump-patch +bump-patch: ## Bump application major version <0.0.X> + $(BUMP_TOOL) $(BUMP_ARGS) bump patch + +## -- Docker targets ------------------------------------------------------------------------------------------------ ## + +## -- Apptainer/Singularity targets --------------------------------------------------------------------------------- ## + +## -- Linting targets ----------------------------------------------------------------------------------------------- ## + +.PHONY: check-lint +check-lint: ## Check code linting (black, isort, flake8 and pylint) + poetry run tox -e black,isort,flake8,pylint + +.PHONY: check-pylint +check-pylint: ## Check code with pylint + poetry run tox -e pylint + +.PHONY: fix-lint +fix-lint: ## Fix code linting (black, isort, flynt) + poetry run tox -e fix + +.PHONY: precommit +precommit: ## Run Pre-commit on all files manually + poetry run tox -e precommit + +## -- Tests targets ------------------------------------------------------------------------------------------------- ## + +.PHONY: test +test: ## Run all tests + poetry run tox -e test + +TEST_ARGS ?= +MARKER_TEST_ARGS = -m "$(TEST_ARGS)" +SPECIFIC_TEST_ARGS = -k "$(TEST_ARGS)" +CUSTOM_TEST_ARGS = "$(TEST_ARGS)" + +.PHONY: test-marker +test-marker: ## Run tests using pytest markers. Ex. make test-tag TEST_ARGS="" + @if [ -n "$(TEST_ARGS)" ]; then \ + poetry run tox -e test-custom -- -- $(MARKER_TEST_ARGS); \ + else \ + echo "" ; \ + echo 'ERROR : Variable TEST_ARGS has not been set, please rerun the command like so :' ; \ + echo "" ; \ + echo ' make test-marker TEST_ARGS=""' ; \ + echo "" ; \ + fi +.PHONY: test-specific +test-specific: ## Run specific tests using the -k option. Ex. make test-specific TEST_ARGS="" + @if [ -n "$(TEST_ARGS)" ]; then \ + poetry run tox -e test-custom -- -- $(SPECIFIC_TEST_ARGS); \ + else \ + echo "" ; \ + echo 'ERROR : Variable TEST_ARGS has not been set, please rerun the command like so :' ; \ + echo "" ; \ + echo ' make test-specific TEST_ARGS=""' ; \ + echo "" ; \ + fi + +.PHONY: test-custom +test-custom: ## Run tests with custom args. Ex. make test-custom TEST_ARGS="-m 'not offline'" + @if [ -n "$(TEST_ARGS)" ]; then \ + poetry run tox -e test-custom -- -- $(CUSTOM_TEST_ARGS); \ + else \ + echo "" ; \ + echo 'ERROR : Variable TEST_ARGS has not been set, please rerun the command like so :' ; \ + echo "" ; \ + echo ' make test-custom TEST_ARGS=""' ; \ + echo "" ; \ + fi \ No newline at end of file diff --git a/Makefile b/Makefile index d19bba7..1bc3994 100644 --- a/Makefile +++ b/Makefile @@ -1,204 +1,19 @@ -## Basic variables -PROJECT_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) -MAKEFILE_NAME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -SHELL := /usr/bin/env bash -BUMP_TOOL := bump-my-version -DOCKER_COMPOSE := docker compose -APP_VERSION := 0.0.0 - -## Conda variables -# CONDA_TOOL can be overridden in Makefile.private file -CONDA_TOOL ?= conda -CONDA_ENVIRONMENT := climateset - -# Private variables import to override variables for local -# All overridable variables must be above this --include Makefile.private - -# Colors -_SECTION := \033[1m\033[34m -_TARGET := \033[36m -_NORMAL := \033[0m - -.DEFAULT_GOAL := help -## -- Informative targets ------------------------------------------------------------------------------------------- ## - -.PHONY: all -all: help - -# Auto documented help targets & sections from comments -# - detects lines marked by double #, then applies the corresponding target/section markup -# - target comments must be defined after their dependencies (if any) -# - section comments must have at least a double dash (-) +######################################################################################## # -# Original Reference: -# https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html -# Formats: -# https://misc.flogisoft.com/bash/tip_colors_and_formatting +# DO NOT MODIFY!!! +# If necessary, override the corresponding variable and/or target, or create new ones +# in one of the following files, depending on the nature of the override : # -# As well as influenced by it's implementation in the Weaver Project -# https://github.com/crim-ca/weaver/tree/master - -.PHONY: help -# note: use "\#\#" to escape results that would self-match in this target's search definition -help: ## print this help message (default) - @echo "" - @echo "Please use 'make ' where is one of below options." - @echo "" - @grep -E '\#\#.*$$' "$(PROJECT_PATH)/$(MAKEFILE_NAME)" \ - | awk ' BEGIN {FS = "(:|\-\-\-)+.*?\#\# "}; \ - /\--/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \ - /:/ {printf " $(_TARGET)%-24s$(_NORMAL) %s\n", $$1, $$2} \ - ' - -.PHONY: targets -targets: help - -.PHONY: version -version: ## display current version - @-echo "version: $(APP_VERSION)" - - -## -- Conda targets ------------------------------------------------------------------------------------------------- ## - -.PHONY: install-conda -install-conda: ## Install conda on your local machine - @$(CONDA_TOOL) --version; \ - if [ $$? != "0" ]; then \ - echo " "; \ - echo "Your defined Conda tool [$(CONDA_TOOL)] has not been found."; \ - echo " "; \ - echo "If you know you already have [$(CONDA_TOOL)] or some other Conda tool installed,"; \ - echo "Check your [CONDA_TOOL] variable in the Makefile.private for typos."; \ - echo " "; \ - echo "If your conda tool has not been initiated through your .bashrc file,"; \ - echo "consider using the full path to its executable instead when"; \ - echo "defining your [CONDA_TOOL] variable"; \ - echo " "; \ - echo "If in doubt, don't install Conda and manually create and activate"; \ - echo "your own Python environment."; \ - echo " "; \ - echo -n "Would you like to install Miniconda ? [y/N]: "; \ - read ans; \ - case $$ans in \ - [Yy]*) \ - echo "Fetching and installing miniconda"; \ - echo " "; \ - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh; \ - bash ~/miniconda.sh -b -p $HOME/.conda; \ - export PATH=$HOME/.conda/bin:$PATH; \ - conda init; \ - /usr/bin/rm ~/miniconda.sh; \ - ;; \ - *) \ - echo "Skipping installation."; \ - echo " "; \ - ;; \ - esac; \ - else \ - echo "Conda tool [$(CONDA_TOOL)] has been found, skipping installation"; \ - fi; - -.PHONY: create-conda-env -create-env: install-conda ## Create a local conda environment based on `environment.yml` - $(CONDA_TOOL) env create -f environment.yml - @echo "" - @echo "#####################################################################" - @echo "# #" - @echo "# Please activate your new environment using the following command: #" - @echo "# #" - @echo "#####################################################################" - @echo "" - @echo "$(CONDA_TOOL) activate $(CONDA_ENVIRONMENT)" - @echo "" - @echo "" - -## -- Install targets ----------------------------------------------------------------------------------------------- ## - -.PHONY: install-poetry -install-poetry: ## Install Poetry in the active environment (Also gets installed with other install targets) - @poetry --version; \ - if [ $$? != "0" ]; then \ - echo "Poetry not found, proceeding to install Poetry..."; \ - pip install poetry==1.8.2; \ - fi; - -.PHONY: install -install: install-precommit ## Install the application package, developer dependencies and pre-commit hook - -.PHONY: install-precommit -install-precommit: install-dev## Install the pre-commit hooks (also installs developer dependencies) - @if [ -f .git/hooks/pre-commit ]; then \ - echo "Pre-commit hook found"; \ - else \ - echo "Pre-commit hook not found, proceeding to configure it"; \ - poetry run pre-commit install; \ - fi; - -.PHONY: install-dev -install-dev: install-poetry ## Install the application along with developer dependencies - @poetry install --with dev - -.PHONY: install-with-lab -install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter Lab - poetry install --with lab - - -.PHONY: install-package -install-package: install-poetry ## Install the application package only - @poetry install - -## -- Versionning targets ------------------------------------------------------------------------------------------- ## - -# Use the "dry" target for a dry-run version bump, ex. -# make bump-major dry -BUMP_ARGS ?= --verbose -ifeq ($(filter dry, $(MAKECMDGOALS)), dry) - BUMP_ARGS := $(BUMP_ARGS) --dry-run --allow-dirty -endif - -.PHONY: bump-major -bump-major: ## Bump application major version - $(BUMP_TOOL) $(BUMP_ARGS) major - -.PHONY: bump-minor -bump-minor: ## Bump application major version <0.X.0> - $(BUMP_TOOL) $(BUMP_ARGS) minor - -.PHONY: bump-patch -bump-patch: ## Bump application major version <0.0.X> - $(BUMP_TOOL) $(BUMP_ARGS) patch - -## -- Docker targets ------------------------------------------------------------------------------------------------ ## - -## -- Linting targets ----------------------------------------------------------------------------------------------- ## - -.PHONY: check-lint -check-lint: ## Check code linting (black, isort, flake8 and pylint) - poetry run tox -e black,isort,flake8,pylint - -.PHONY: check-pylint -check-pylint: ## Check code with pylint - poetry run tox -e pylint - -.PHONY: fix-lint -fix-lint: ## Fix code linting (black, isort, flynt) - poetry run tox -e fix - -.PHONY: precommit -precommit: ## Run Pre-commit on all files manually - poetry run tox -e precommit - -## -- Tests targets ------------------------------------------------------------------------------------------------- ## - -.PHONY: test -test: ## Run tests except offline tests - poetry run tox -e test - -.PHONY: test-all -test-all: ## Run all tests - poetry run tox -e test-all - -## -- Application targets ------------------------------------------------------------------------------------------- ## - -# For custom targets that have to do with this application \ No newline at end of file +# `Makefile.variables`, `Makefile.targets` or `Makefile.private`, +# +# The only valid reason to modify this file is to fix a bug or to add new +# files to include. +######################################################################################## + +#Include base makefile +include .make/base.make +# Include custom targets and variables +-include Makefile.targets +-include Makefile.variables +# Private variables and targets import to override variables for local +-include Makefile.private diff --git a/Makefile.private.example b/Makefile.private.example index d3615d2..ec5d05b 100644 --- a/Makefile.private.example +++ b/Makefile.private.example @@ -1,15 +1,24 @@ -# This file is meant for private variables that apply only to local developments -# variables (ie. configurations specific to your own local development environment) -# as well as sensitive information, like access keys, passwords and such. -# -# Make a copy of this file and name it `Makefile.private`, then define your own -# variables in it. +# This file is meant for private variables and targets that apply only to each person's +# local developments variables (ie. configurations specific to your own local +# development environment) as well as sensitive information, like access keys, +# passwords and such. +# +# Ex. personal targets while exploring new parameters or configurations that should not +# be share with other project members +# +# Make a copy of this file and name it `Makefile.private`, then define your own +# variables in it. # # `Makefile.private` is already ignored by the `.gitignore` file. # # DO NOT COMMIT YOUR `Makefile.private`!!! + +## Private variables + # If you use a different Conda tool, say `micromamba`, or if you use a different alias # CONDA_TOOL := - DOCKER_COMPOSE := docker compose + +## -- Private targets -------------------------------------------------------------------------------------------------## + diff --git a/Makefile.targets b/Makefile.targets new file mode 100644 index 0000000..0e8f752 --- /dev/null +++ b/Makefile.targets @@ -0,0 +1,5 @@ +## -- Project targets ------------------------------------------------------------------------------------------------ ## + +.PHONY: custom-target-example +custom-target-example: ## Example custom target + @echo The name of the package contained in this repository is [$(APPLICATION_NAME)] \ No newline at end of file diff --git a/Makefile.variables b/Makefile.variables new file mode 100644 index 0000000..401ff44 --- /dev/null +++ b/Makefile.variables @@ -0,0 +1,2 @@ +APPLICATION_NAME := climateset +CONDA_ENVIRONMENT := climateset \ No newline at end of file From 8fcb6678f1bc55a4e18bfdb9055466345a7159f5 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 8 May 2024 17:48:44 -0400 Subject: [PATCH 14/32] Update CHANGES.md --- CHANGES.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b148eb7..0601bc4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,9 @@ # CHANGES.md -[Unreleased](https://github.com/RolnickLab/ClimateSetExtension) (latest) +[Unreleased](https://github.com/RolnickLab/ClimateSetExtension/tree/main) (latest) ------------------------------------------------------------------------------------- - -[//]: # (New changes here in list form) \ No newline at end of file + +- Project initialization +- Add linting tools +- Add CI +- Add basic structure of package From 974a2e7be66c802c0fa37ca1322d1660d06b5cd5 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 8 May 2024 17:49:33 -0400 Subject: [PATCH 15/32] Update tox configs --- pyproject.toml | 13 +++++++++---- tox.ini | 26 +++++++++++++------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2521512..f278f25 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,6 @@ build-backend = "poetry.core.masonry.api" # # Tools # - [tool.bumpversion] current_version = "0.0.0" commit = true @@ -64,8 +63,8 @@ replace = 'version = "{new_version}"' [[tool.bumpversion.files]] filename = "Makefile" -search = 'APP_VERSION := "{current_version}"' -replace = 'APP_VERSION := "{new_version}"' +search = "APP_VERSION := {current_version}" +replace = "APP_VERSION := {new_version}" [[tool.bumpversion.files]] filename = "CHANGES.md" @@ -109,4 +108,10 @@ profile = "black" [tool.flynt] line-length = 120 transform-concats = true -verbose = true \ No newline at end of file +verbose = true + +[tool.pytest.ini_options] +testpaths = [ + "tests", +] +markers = ["offline: mark a test as needing to be run offline.", ] \ No newline at end of file diff --git a/tox.ini b/tox.ini index 9f5afd4..f63637c 100644 --- a/tox.ini +++ b/tox.ini @@ -12,22 +12,22 @@ allowlist_externals = poetry commands_pre = poetry install -file_and_folder_module_tests = climateset/ tests/ scripts/ -file_and_folder_list_module = climateset/ scripts/ +file_and_folder_all = climateset/ tests/ scripts/ +file_and_folder_scripts_modules = climateset/ scripts/ [testenv:pylint] commands = - poetry run pylint {[testenv]file_and_folder_list_module} + poetry run pylint {[testenv]file_and_folder_scripts_modules} [testenv:flake8] commands = - poetry run flake8 {[testenv]file_and_folder_list_module} + poetry run flake8 {[testenv]file_and_folder_scripts_modules} [testenv:fix] commands = - poetry run black {[testenv]file_and_folder_module_tests} - poetry run isort {[testenv]file_and_folder_module_tests} - poetry run flynt {[testenv]file_and_folder_module_tests} + poetry run black {[testenv]file_and_folder_all} + poetry run isort {[testenv]file_and_folder_all} + poetry run flynt {[testenv]file_and_folder_all} [testenv:precommit] commands = @@ -35,20 +35,20 @@ commands = [testenv:black] commands = - poetry run black --check {[testenv]file_and_folder_module_tests} + poetry run black --check {[testenv]file_and_folder_all} [testenv:isort] commands = - poetry run isort {[testenv]file_and_folder_module_tests} --check + poetry run isort {[testenv]file_and_folder_all} --check [testenv:flynt] commands = - poetry run flynt {[testenv]file_and_folder_module_tests} + poetry run flynt {[testenv]file_and_folder_all} [testenv:test] commands = - pytest -m "not offline" + poetry run pytest -[testenv:test-all] +[testenv:test-custom] commands = - pytest \ No newline at end of file + poetry run pytest {posargs} \ No newline at end of file From e0426f98b09095402a0a7bb44a21ddfaba922d8c Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 8 May 2024 17:53:31 -0400 Subject: [PATCH 16/32] Add email for bug report of Makefile --- .make/base.make | 2 ++ Makefile | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.make/base.make b/.make/base.make index 8c9dd1c..35be2ea 100644 --- a/.make/base.make +++ b/.make/base.make @@ -8,6 +8,8 @@ # # The only valid reason to modify this file is to fix a bug or to add new # files to include. +# +# Please report bugs to francis.pelletier@mila.quebec ######################################################################################## ## Basic variables diff --git a/Makefile b/Makefile index 1bc3994..c3e0e9f 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,8 @@ # # The only valid reason to modify this file is to fix a bug or to add new # files to include. +# +# Please report bugs to francis.pelletier@mila.quebec ######################################################################################## #Include base makefile From 5910602e11ed711a95ed8961dfd6fc20a4ceba93 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 10 May 2024 14:12:39 -0400 Subject: [PATCH 17/32] Remove unnecessary config (configured by pyproject.toml --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d0ae46e..dbed080 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,6 @@ repos: rev: 5.13.2 hooks: - id: isort - args: ["--profile", "black"] - repo: https://github.com/ikamensh/flynt rev: 1.0.1 From 39f949991c56780b655f7d0bf7ece881ea3891f7 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 10 May 2024 14:12:56 -0400 Subject: [PATCH 18/32] Formatting and typos --- Makefile | 6 ++---- Makefile.targets | 5 ++++- Makefile.variables | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index c3e0e9f..323195b 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,16 @@ -######################################################################################## # # DO NOT MODIFY!!! # If necessary, override the corresponding variable and/or target, or create new ones # in one of the following files, depending on the nature of the override : # -# `Makefile.variables`, `Makefile.targets` or `Makefile.private`, +# Makefile.variables, Makefile.targets or Makefile.private, # # The only valid reason to modify this file is to fix a bug or to add new # files to include. # # Please report bugs to francis.pelletier@mila.quebec -######################################################################################## -#Include base makefile +# Include base makefile include .make/base.make # Include custom targets and variables -include Makefile.targets diff --git a/Makefile.targets b/Makefile.targets index 0e8f752..2554e5e 100644 --- a/Makefile.targets +++ b/Makefile.targets @@ -1,4 +1,7 @@ -## -- Project targets ------------------------------------------------------------------------------------------------ ## +# This file is for custom makefile targets at the project level. +# They are meant to be share by the whole project team. + +## -- Project targets ----------------------------------------------------------------------------------------------- ## .PHONY: custom-target-example custom-target-example: ## Example custom target diff --git a/Makefile.variables b/Makefile.variables index 401ff44..cdd619d 100644 --- a/Makefile.variables +++ b/Makefile.variables @@ -1,2 +1,5 @@ +# This file is for custom makefile variable at the project level. +# They are meant to be share by the whole project team. + APPLICATION_NAME := climateset CONDA_ENVIRONMENT := climateset \ No newline at end of file From d6ee7d18ef2687e35452f15b866949ffc552dced Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 10 May 2024 14:13:28 -0400 Subject: [PATCH 19/32] Fix bugs and add separate targets for Poetry installation --- .make/base.make | 140 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 47 deletions(-) diff --git a/.make/base.make b/.make/base.make index 35be2ea..7932319 100644 --- a/.make/base.make +++ b/.make/base.make @@ -1,28 +1,26 @@ -######################################################################################## -# # DO NOT MODIFY!!! # If necessary, override the corresponding variable and/or target, or create new ones # in one of the following files, depending on the nature of the override : # -# `Makefile.variables`, `Makefile.targets` or `Makefile.private`, +# Makefile.variables, Makefile.targets or Makefile.private`, # # The only valid reason to modify this file is to fix a bug or to add new # files to include. # # Please report bugs to francis.pelletier@mila.quebec -######################################################################################## -## Basic variables +# Basic variables PROJECT_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) MAKEFILE_NAME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) SHELL := /usr/bin/env bash BUMP_TOOL := bump-my-version APP_VERSION := 0.0.0 DOCKER_COMPOSE ?= docker compose +POETRY_VERSION := 1.8.2 -## Conda variables +# Conda variables # CONDA_TOOL can be overridden in Makefile.private file -CONDA_TOOL ?= conda +CONDA_TOOL := conda CONDA_ENVIRONMENT ?= # Colors @@ -37,9 +35,9 @@ _NORMAL := \033[0m all: help # Auto documented help targets & sections from comments -# - detects lines marked by double #, then applies the corresponding target/section markup -# - target comments must be defined after their dependencies (if any) -# - section comments must have at least a double dash (-) +# detects lines marked by double #, then applies the corresponding target/section markup +# target comments must be defined after their dependencies (if any) +# section comments must have at least a double dash (-) # # Original Reference: # https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html @@ -51,30 +49,31 @@ all: help .PHONY: help # note: use "\#\#" to escape results that would self-match in this target's search definition -help: ## print this help message (default) +help: ## print this help message (default) @echo "" @echo "Please use 'make ' where is one of below options." @echo "" @for makefile in $(MAKEFILE_LIST); do \ - grep -E '\#\#.*$$' "$(PROJECT_PATH)/$${makefile}" \ - | awk ' BEGIN {FS = "(:|\-\-\-)+.*?\#\# "}; \ - /\--/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \ - /:/ {printf " $(_TARGET)%-24s$(_NORMAL) %s\n", $$1, $$2} \ - ' ; \ - done + grep -E '\#\#.*$$' "$(PROJECT_PATH)/$${makefile}" | \ + awk 'BEGIN {FS = "(:|\-\-\-)+.*\#\# "}; \ + /\--/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \ + /:/ {printf " $(_TARGET)%-24s$(_NORMAL) %s\n", $$1, $$2} ' 2>/dev/null ; \ + done + .PHONY: targets targets: help .PHONY: version -version: ## display current version - @-echo "version: $(APP_VERSION)" +version: ## display current version + @echo "version: $(APP_VERSION)" ## -- Conda targets ------------------------------------------------------------------------------------------------- ## -.PHONY: install-conda -install-conda: ## Install conda on your local machine - @$(CONDA_TOOL) --version; \ +.PHONY: conda-install +conda-install: ## Install conda on your local machine + @echo "Looking for [$(CONDA_TOOL)]..."; \ + $(CONDA_TOOL) --version; \ if [ $$? != "0" ]; then \ echo " "; \ echo "Your defined Conda tool [$(CONDA_TOOL)] has not been found."; \ @@ -96,8 +95,8 @@ install-conda: ## Install conda on your local machine echo "Fetching and installing miniconda"; \ echo " "; \ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh; \ - bash ~/miniconda.sh -b -p $HOME/.conda; \ - export PATH=$HOME/.conda/bin:$PATH; \ + bash ~/miniconda.sh -b -p ${HOME}/.conda; \ + export PATH=${HOME}/.conda/bin:$PATH; \ conda init; \ /usr/bin/rm ~/miniconda.sh; \ ;; \ @@ -110,29 +109,76 @@ install-conda: ## Install conda on your local machine echo "Conda tool [$(CONDA_TOOL)] has been found, skipping installation"; \ fi; -.PHONY: create-conda-env -create-env: install-conda ## Create a local conda environment based on `environment.yml` - $(CONDA_TOOL) env create -f environment.yml - @echo "" - @echo "#####################################################################" - @echo "# #" - @echo "# Please activate your new environment using the following command: #" - @echo "# #" - @echo "#####################################################################" - @echo "" - @echo "$(CONDA_TOOL) activate $(CONDA_ENVIRONMENT)" - @echo "" - @echo "" +.PHONY: conda-create-env +conda-create-env: conda-install ## Create a local Conda environment based on `environment.yml` file + @$(CONDA_TOOL) env create -y -f environment.yml -## -- Install targets ----------------------------------------------------------------------------------------------- ## +.PHONY: conda-clean-env +conda-clean-env: ## Completely removes local project's Conda environment + $(CONDA_TOOL) env remove -n $(CONDA_ENVIRONMENT) -.PHONY: install-poetry -install-poetry: ## Install Poetry in the active environment (Also gets installed with other install targets) +## -- Poetry targets ------------------------------------------------------------------------------------------------ ## + +.PHONY: poetry-install +poetry-install: ## Install Poetry in activated Conda environment, or with pipx if Conda not found @poetry --version; \ - if [ $$? != "0" ]; then \ - echo "Poetry not found, proceeding to install Poetry..."; \ - pip install poetry==1.8.2; \ - fi; + if [ $$? != "0" ]; then \ + echo "Poetry not found, proceeding to install Poetry..."; \ + echo "Looking for [$(CONDA_TOOL)]...";\ + $(CONDA_TOOL) --version; \ + if [ $$? != "0" ]; then \ + echo "$(CONDA_TOOL) not found, trying with pipx"; \ + pipx --version; \ + if [ $$? != "0" ]; then \ + echo "pipx not found; installing pipx"; \ + pip install --user pipx; \ + pipx ensurepath; \ + fi; \ + pipx install poetry==$(POETRY_VERSION); \ + else \ + echo "Installing poetry with Conda"; \ + $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + fi; \ + fi; + +.PHONY: poetry-install-conda +poetry-install-conda: ## Install Poetry in currently active Conda environment. Will fail in Conda is not found + @poetry --version; \ + if [ $$? != "0" ]; then \ + echo "Poetry not found, proceeding to install Poetry..."; \ + echo "Looking for [$(CONDA_TOOL)]...";\ + $(CONDA_TOOL) --version; \ + if [ $$? != "0" ]; then \ + echo "$(CONDA_TOOL) not found; Poetry will not be installed"; \ + else \ + echo "Installing Poetry with Conda in currently active environment"; \ + $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + fi; \ + fi; + +.PHONY: poetry-install-pipx +poetry-install-pipx: ## Install Poetry using pipx. Will also install pipx if not present on system + @poetry --version; \ + if [ $$? != "0" ]; then \ + pipx --version; \ + if [ $$? != "0" ]; then \ + echo "pipx not found; installing pipx"; \ + pip install --user pipx; \ + pipx ensurepath; \ + fi; \ + pipx install poetry==$(POETRY_VERSION); \ + fi; + +.PHONY: poetry-uninstall-conda +poetry-uninstall-conda: ## Uninstall Poetry located in currently active Conda environment + $(CONDA_TOOL) remove poetry + +.PHONY: uninstall-poetry-pipx +poetry-uninstall-pipx: ## Uninstall pipx-installed Poetry and pipx + @pipx uninstall poetry + @pip uninstall pipx + +## -- Install targets (All install targets will try to install Poetry using `make poetry-install`)------------------- ## .PHONY: install install: install-precommit ## Install the application package, developer dependencies and pre-commit hook @@ -147,16 +193,16 @@ install-precommit: install-dev## Install the pre-commit hooks (also installs dev fi; .PHONY: install-dev -install-dev: install-poetry ## Install the application along with developer dependencies +install-dev: poetry-install ## Install the application along with developer dependencies @poetry install --with dev .PHONY: install-with-lab -install-with-lab: install-poetry ## Install the application and it's dependencies, including Jupyter Lab +install-with-lab: poetry-install ## Install the application and it's dependencies, including Jupyter Lab @poetry install --with lab .PHONY: install-package -install-package: install-poetry ## Install the application package only +install-package: poetry-install ## Install the application package only @poetry install ## -- Versionning targets ------------------------------------------------------------------------------------------- ## From 6d4210e07ceab1027680f7ad0527cac1b3f6f8d8 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Mon, 13 May 2024 16:19:19 -0400 Subject: [PATCH 20/32] Update image for README.md --- images/make_targets.png | Bin 80787 -> 213443 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/make_targets.png b/images/make_targets.png index 6fdbbcfe03ed3992e808c8e7975ca8191381d9b5..58c9a2a99efeae13e7f1716b7874bbb379ea3923 100644 GIT binary patch literal 213443 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 z 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%0AWRv47Kh&a;o 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 My85}Sb4q9e08n-=P5=M^ literal 80787 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 Date: Mon, 13 May 2024 16:20:45 -0400 Subject: [PATCH 21/32] Better UX for Poetry targets + Documentation update --- .make/base.make | 173 +++++++++++++++++++++++-------- Makefile.private.example | 4 + Makefile.variables | 3 +- README.md | 116 ++++++++++++++++++--- {images => img}/make_targets.png | Bin 5 files changed, 238 insertions(+), 58 deletions(-) rename {images => img}/make_targets.png (100%) diff --git a/.make/base.make b/.make/base.make index 7932319..055d02c 100644 --- a/.make/base.make +++ b/.make/base.make @@ -17,6 +17,7 @@ BUMP_TOOL := bump-my-version APP_VERSION := 0.0.0 DOCKER_COMPOSE ?= docker compose POETRY_VERSION := 1.8.2 +AUTO_INSTALL ?= # Conda variables # CONDA_TOOL can be overridden in Makefile.private file @@ -67,11 +68,10 @@ targets: help version: ## display current version @echo "version: $(APP_VERSION)" - ## -- Conda targets ------------------------------------------------------------------------------------------------- ## .PHONY: conda-install -conda-install: ## Install conda on your local machine +conda-install: ## Install Conda on your local machine @echo "Looking for [$(CONDA_TOOL)]..."; \ $(CONDA_TOOL) --version; \ if [ $$? != "0" ]; then \ @@ -113,14 +113,37 @@ conda-install: ## Install conda on your local machine conda-create-env: conda-install ## Create a local Conda environment based on `environment.yml` file @$(CONDA_TOOL) env create -y -f environment.yml +.PHONY: conda-env-info +conda-env-info: ## Print information about Conda environment using + @$(CONDA_TOOL) info + +.PHONY:conda-poetry-install +conda-poetry-install: ## Install Poetry in currently active Conda environment. Will fail if Conda is not found + @poetry --version; \ + if [ $$? != "0" ]; then \ + echo "Poetry not found, proceeding to install Poetry..."; \ + echo "Looking for [$(CONDA_TOOL)]...";\ + $(CONDA_TOOL) --version; \ + if [ $$? != "0" ]; then \ + echo "$(CONDA_TOOL) not found; Poetry will not be installed"; \ + else \ + echo "Installing Poetry with Conda in currently active environment"; \ + $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + fi; \ + fi; + +.PHONY: conda-poetry-uninstall +conda-poetry-uninstall: ## Uninstall Poetry located in currently active Conda environment + $(CONDA_TOOL) remove poetry + .PHONY: conda-clean-env conda-clean-env: ## Completely removes local project's Conda environment $(CONDA_TOOL) env remove -n $(CONDA_ENVIRONMENT) ## -- Poetry targets ------------------------------------------------------------------------------------------------ ## -.PHONY: poetry-install -poetry-install: ## Install Poetry in activated Conda environment, or with pipx if Conda not found +.PHONY: poetry-install-auto +poetry-install-auto: ## Install Poetry in activated Conda environment, or with pipx if Conda not found @poetry --version; \ if [ $$? != "0" ]; then \ echo "Poetry not found, proceeding to install Poetry..."; \ @@ -141,44 +164,112 @@ poetry-install: ## Install Poetry in activated Conda environment, or with pipx i fi; \ fi; -.PHONY: poetry-install-conda -poetry-install-conda: ## Install Poetry in currently active Conda environment. Will fail in Conda is not found - @poetry --version; \ +.PHONY: poetry-install +poetry-install: ## Install standalone Poetry using pipx and create Poetry env. Will install pipx if not found + @echo "Looking for Poetry version...";\ + poetry --version; \ if [ $$? != "0" ]; then \ - echo "Poetry not found, proceeding to install Poetry..."; \ - echo "Looking for [$(CONDA_TOOL)]...";\ - $(CONDA_TOOL) --version; \ - if [ $$? != "0" ]; then \ - echo "$(CONDA_TOOL) not found; Poetry will not be installed"; \ + if [ "$(AUTO_INSTALL)" = "true" ]; then \ + ans="y";\ else \ - echo "Installing Poetry with Conda in currently active environment"; \ - $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ - fi; \ - fi; - -.PHONY: poetry-install-pipx -poetry-install-pipx: ## Install Poetry using pipx. Will also install pipx if not present on system - @poetry --version; \ - if [ $$? != "0" ]; then \ - pipx --version; \ - if [ $$? != "0" ]; then \ - echo "pipx not found; installing pipx"; \ - pip install --user pipx; \ - pipx ensurepath; \ + echo""; \ + echo -n "Would you like to install Poetry using pipx? (This will also install pipx if needed) [y/N]: "; \ + read ans; \ fi; \ - pipx install poetry==$(POETRY_VERSION); \ + case $$ans in \ + [Yy]*) \ + pipx --version; \ + if [ $$? != "0" ]; then \ + echo "pipx not found; installing pipx"; \ + pip install --user pipx; \ + pipx ensurepath; \ + fi; \ + echo "Installing Poetry"; \ + pipx install poetry==$(POETRY_VERSION); \ + make poetry-create-env; \ + ;; \ + *) \ + echo "Skipping installation."; \ + echo " "; \ + ;; \ + esac; \ fi; -.PHONY: poetry-uninstall-conda -poetry-uninstall-conda: ## Uninstall Poetry located in currently active Conda environment - $(CONDA_TOOL) remove poetry +.PHONY: poetry-env-info +poetry-env-info: ## Information about the currently active environment used by Poetry + @poetry env info + +.PHONY: poetry-create-env +poetry-create-env: ## Create a Poetry managed environment for the project (Outside of Conda environment). + @echo "Creating Poetry environment that will use Python $(PYTHON_VERSION)"; \ + poetry env use $(PYTHON_VERSION); \ + poetry env info + @echo"" + @echo "This environment can be accessed either by using the " + @echo "command, or activated with the command." + @echo"" + @echo "Use and for more information" + @echo"" + +.PHONY: poetry-remove-env +poetry-remove-env: ## Remove current project's Poetry managed environment. + @if [ "$(AUTO_INSTALL)" = "true" ]; then \ + ans_env="y";\ + env_path=$$(poetry env info -p); \ + env_name=$$(basename $$env_path); \ + else \ + echo""; \ + env_path=$$(poetry env info -p); \ + if [[ "$$env_path" != "" ]]; then \ + echo "The following environment has been found for this project: "; \ + env_name=$$(basename $$env_path); \ + echo""; \ + echo "Env name : $$env_name"; \ + echo "PATH : $$env_path"; \ + echo""; \ + echo "If the active environment listed above is a Conda environment,"; \ + echo "Choosing to delete it will have no effect; use the target "; \ + echo""; \ + echo -n "Would you like delete the environment listed above? [y/N]: "; \ + read ans_env; \ + else \ + env_name="None"; \ + env_path="None"; \ + fi; \ + fi; \ + if [[ $$env_name != "None" ]]; then \ + case $$ans_env in \ + [Yy]*) \ + poetry env remove $$env_name || echo "No environment was removed"; \ + ;; \ + *) \ + echo "No environment was found/provided - skipping environment deletion"; \ + ;;\ + esac; \ + fi; \ -.PHONY: uninstall-poetry-pipx -poetry-uninstall-pipx: ## Uninstall pipx-installed Poetry and pipx - @pipx uninstall poetry - @pip uninstall pipx -## -- Install targets (All install targets will try to install Poetry using `make poetry-install`)------------------- ## +.PHONY: poetry-uninstall-pipx +poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the created env and pipx + @if [ "$(AUTO_INSTALL)" = "true" ]; then \ + ans="y";\ + else \ + echo""; \ + echo -n "Would you like to uninstall pipx-installed Poetry and pipx? [y/N]: "; \ + read ans; \ + fi; \ + case $$ans in \ + [Yy]*) \ + pipx uninstall poetry; \ + pip uninstall -y pipx; \ + ;; \ + *) \ + echo "Skipping uninstallation."; \ + echo " "; \ + ;; \ + esac; \ + +## -- Install targets (All install targets will install Poetry if not found using `make poetry-install-auto`)-------- ## .PHONY: install install: install-precommit ## Install the application package, developer dependencies and pre-commit hook @@ -193,19 +284,19 @@ install-precommit: install-dev## Install the pre-commit hooks (also installs dev fi; .PHONY: install-dev -install-dev: poetry-install ## Install the application along with developer dependencies +install-dev: poetry-install-auto ## Install the application along with developer dependencies @poetry install --with dev .PHONY: install-with-lab -install-with-lab: poetry-install ## Install the application and it's dependencies, including Jupyter Lab - @poetry install --with lab +install-with-lab: poetry-install-auto ## Install the application and it's dev dependencies, including Jupyter Lab + @poetry install --with dev --with lab .PHONY: install-package -install-package: poetry-install ## Install the application package only +install-package: poetry-install-auto ## Install the application package only @poetry install -## -- Versionning targets ------------------------------------------------------------------------------------------- ## +## -- Versioning targets ------------------------------------------------------------------------------------------- ## # Use the "dry" target for a dry-run version bump, ex. # make bump-major dry @@ -271,7 +362,7 @@ test-marker: ## Run tests using pytest markers. Ex. make test-tag TEST_ARGS=" DOCKER_COMPOSE := docker compose +# Some targets use this variable. A 'false' value will ask user to confirm some steps. +# a 'true' value will automatically install/remove without asking beforehand. +AUTO_INSTALL := false + ## -- Private targets -------------------------------------------------------------------------------------------------## diff --git a/Makefile.variables b/Makefile.variables index cdd619d..8876d41 100644 --- a/Makefile.variables +++ b/Makefile.variables @@ -2,4 +2,5 @@ # They are meant to be share by the whole project team. APPLICATION_NAME := climateset -CONDA_ENVIRONMENT := climateset \ No newline at end of file +CONDA_ENVIRONMENT := climateset +PYTHON_VERSION := 3.10 \ No newline at end of file diff --git a/README.md b/README.md index 196ab0b..feaff48 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ This project has only been tested in a Linux (Debian based) environment and assumes some basic tools for development are already installed. -The project uses a Makefile to automate most operations. If you can run make on your -machine there's a good chance this will work on your machine. +The project uses a Makefile to automate most operations. If make is available on your +machine there's a good chance this will work. Please consult the [Makefile](Makefile) before trying to use it. @@ -17,32 +17,120 @@ Much of this repository is organized through the Makefile. The different targets and their description can be examined by executing the command `make targets` -![](images/make_targets.png) +![](img/make_targets.png) ## Installation -This project assumes environment management will be done with Conda. It would, however, -be possible to create you own environment with, for example, poetry, pyenv or virtualenv. +This project assumes environment management will be done with `Conda` or directly with +`Poetry`. It would, however, be possible to manage the environment with, for example, +pyenv or virtualenv. -**Do note that this project is configured to use [Poetry](https://python-poetry.org/) -and as such, this tool is required to install it.** +Those specific use cases are not specifically supported by the Makefile and require +users to set up their own environments beforehand. -Poetry is not included in the [environment.yml](environment.yml), due to some problems +For detailed information about `Poetry` and `Conda`: + +* [Poetry](https://python-poetry.org/docs/basic-usage/) +* [Conda](https://conda.io/projects/conda/en/latest/user-guide/getting-started.html) + +If you want to use something else than `Conda` or `Poetry` to manage environment isolation, +it is recommended to follow +[Poetry's guidelines on managing environments](https://python-poetry.org/docs/managing-environments/) + +Poetry is not included in the [environment.yml](environment.yml), due to some possible problems in compute cluster environments, but will be installed automatically if needed by most `install` targets. +Currently, the project runs on Python version 3.10. + +### Environment management choices + +Environment management can become quite complicated. Using Conda allows a certain +ease of management since the Poetry installation is contained inside the created Conda +environment. + +However, some computing environments do not permit the use of Conda (like certain SLURM +clusters). This is why the `pipx` option for Poetry is also enabled in this project. + +**Unless you really know what you are doing, it is not recommended to install Poetry +as a standalone tool (with pipx) while also using Conda environments.** + +### Conda targets + If you need or want to install Conda: ``` -make install-conda +make conda-install ``` To create the conda environment: ``` -make create-env +make conda-create-env +``` + +To remove the conda environment: +``` +make conda-clean-env +``` + +Make sure to activate the configured environment before installing this package. + +### Poetry targets + +There are 2 possibilities available in how to manage `Poetry` if it is not already +configured on your system. + +**It is not recommended to install `Poetry` in the same environment that will be managed +by `Poetry`; It should be installed by `Conda` (as in, `conda install poetry`) or +on the system using `pipx`, in order to minimize dependency conflicts.** + +The following target will first try to install `Poetry` in the active `Conda` +environment; if it can't find `Conda`, it will proceed to install via `pipx` + +``` +make poetry-install-auto ``` -After you have created your Conda environment, or you want to manage your environment -yourself, make sure to activate it properly before installing this package. +To install `Poetry` using `Conda`: + +``` +make conda-poetry-install +``` + +Using `pipx` will instead allow environment management directly with `Poetry`. The +following target will also make `Poetry` use a Python 3.10 environment for this +project. + +``` +make poetry-install-pipx +``` + +This will also create a virtual environment managed by `Poetry`. + +A standalone environment can also be created later using the `make poetry-create-env` +command, and removed with the `make poetry-remove-env` command. + +Information about the currently active environment used by Poetry, +whether Conda or Poetry, can be seen using the `make poetry-env-info` command. + +Both install methods can also be cleaned up: + +``` +make conda-poetry-uninstall +# or +make poetry-uninstall-pipx +``` + +**Important note!** + +If you have an active `Conda` environment and install `Poetry` using `pipx`, +you will have to use `poetry run python ` instead of +`python `, (which is normal when using Poetry) as +`python` will use Conda's active environment. + +### Install targets + +**All `install` targets will first check if `Poetry` is available and try to install +it with the `make poetry-install-auto` target.** To install the package, development dependencies and CLI tools (if available): ``` @@ -76,10 +164,6 @@ To run tests: make test ``` -To run all tests, including the integration test: -``` -make test-all -``` ## Data diff --git a/images/make_targets.png b/img/make_targets.png similarity index 100% rename from images/make_targets.png rename to img/make_targets.png From 2b6fa4c7bf2e6b568f2d41de057df19d441eed50 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Mon, 13 May 2024 17:37:32 -0400 Subject: [PATCH 22/32] Update README.md --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index feaff48..42a9d47 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,18 @@ some basic tools for development are already installed. The project uses a Makefile to automate most operations. If make is available on your machine there's a good chance this will work. -Please consult the [Makefile](Makefile) before trying to use it. +The following Makefile files should not be modified, but can be consulted: -## Basic Information +* [Makefile](Makefile) : Orchestration of the different files +* [base.make](.make/base.make) : Shared utilities, project agnostic. + +The following Makefile files are project or user specific: + +* [Makefile.variables](Makefile.variables) : Shared project variables. +* [Makefile.targets](Makefile.targets) : Shared project targets. +* [Makefile.private](Makefile.private.example) : User specific variables and targets. -Much of this repository is organized through the Makefile. +## Basic Information The different targets and their description can be examined by executing the command `make targets` @@ -21,18 +28,18 @@ The different targets and their description can be examined by executing the com ## Installation -This project assumes environment management will be done with `Conda` or directly with -`Poetry`. It would, however, be possible to manage the environment with, for example, -pyenv or virtualenv. - -Those specific use cases are not specifically supported by the Makefile and require -users to set up their own environments beforehand. - -For detailed information about `Poetry` and `Conda`: +This project assumes environment management will be done with `Conda` or directly through +`Poetry`. * [Poetry](https://python-poetry.org/docs/basic-usage/) * [Conda](https://conda.io/projects/conda/en/latest/user-guide/getting-started.html) +While it is possible to manage the environment with, for example, pyenv or virtualenv, +those specific use cases are not supported by the Makefile and require users to set up +their own environments beforehand. + +For detailed information about `Poetry` and `Conda`: + If you want to use something else than `Conda` or `Poetry` to manage environment isolation, it is recommended to follow [Poetry's guidelines on managing environments](https://python-poetry.org/docs/managing-environments/) @@ -142,6 +149,52 @@ To install only the package, without development tools: make install-package ``` +## First time user quick setup + +### Conda +The easiest and quickest way to get up and running with Conda. + +Create Conda environment (will check for Conda and install it if not found): + +``` +make conda-create-env +``` + +Activate Conda environment (substitute with your if something else +than `conda`: + +``` +conda activate climateset +``` + +Install package: + +``` +make install +``` + +### Poetry + +The easiest and quickest way to get up and running with Poetry. + +Install pipx and Poetry and activate project environment : + +``` +make poetry-install +``` + +**Or, if Poetry is already available:** + +``` +make poetry-create-env +``` + +Install package: + +``` +make install +``` + ## Basic automations To run linting checks with `flake8`, `pylint`, `black` and `isort`: From 5b59b42cf4356489a357f67c618e03a58d141654 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Mon, 13 May 2024 17:37:55 -0400 Subject: [PATCH 23/32] Small refactor Makefile --- .make/base.make | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.make/base.make b/.make/base.make index 055d02c..724ddde 100644 --- a/.make/base.make +++ b/.make/base.make @@ -114,9 +114,15 @@ conda-create-env: conda-install ## Create a local Conda environment based on `en @$(CONDA_TOOL) env create -y -f environment.yml .PHONY: conda-env-info -conda-env-info: ## Print information about Conda environment using +conda-env-info: ## Print information about active Conda environment using @$(CONDA_TOOL) info +.PHONY: _conda-poetry-install +_conda-poetry-install: + $(CONDA_TOOL) run -n $(CONDA_ENVIRONMENT) $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + + + .PHONY:conda-poetry-install conda-poetry-install: ## Install Poetry in currently active Conda environment. Will fail if Conda is not found @poetry --version; \ @@ -128,13 +134,13 @@ conda-poetry-install: ## Install Poetry in currently active Conda environment. W echo "$(CONDA_TOOL) not found; Poetry will not be installed"; \ else \ echo "Installing Poetry with Conda in currently active environment"; \ - $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + make -s _conda-poetry-install; \ fi; \ fi; .PHONY: conda-poetry-uninstall conda-poetry-uninstall: ## Uninstall Poetry located in currently active Conda environment - $(CONDA_TOOL) remove poetry + $(CONDA_TOOL) run -n $(CONDA_ENVIRONMENT) $(CONDA_TOOL) remove poetry .PHONY: conda-clean-env conda-clean-env: ## Completely removes local project's Conda environment @@ -160,7 +166,7 @@ poetry-install-auto: ## Install Poetry in activated Conda environment, or with p pipx install poetry==$(POETRY_VERSION); \ else \ echo "Installing poetry with Conda"; \ - $(CONDA_TOOL) install -y poetry==$(POETRY_VERSION); \ + make -s _conda-poetry-install; \ fi; \ fi; @@ -186,7 +192,7 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W fi; \ echo "Installing Poetry"; \ pipx install poetry==$(POETRY_VERSION); \ - make poetry-create-env; \ + make -s poetry-create-env; \ ;; \ *) \ echo "Skipping installation."; \ From 64cb1be452f0ce9d7c64e4fa95d8d8acb6fc9988 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Tue, 14 May 2024 11:27:20 -0400 Subject: [PATCH 24/32] Update message in conda-poetry-install target --- .make/base.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.make/base.make b/.make/base.make index 724ddde..2e30128 100644 --- a/.make/base.make +++ b/.make/base.make @@ -133,7 +133,7 @@ conda-poetry-install: ## Install Poetry in currently active Conda environment. W if [ $$? != "0" ]; then \ echo "$(CONDA_TOOL) not found; Poetry will not be installed"; \ else \ - echo "Installing Poetry with Conda in currently active environment"; \ + echo "Installing Poetry with Conda in [$(CONDA_ENVIRONMENT)] environment"; \ make -s _conda-poetry-install; \ fi; \ fi; From d638afb4ac3a43738c1e2c38e3801dfacca53a8e Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 15 May 2024 16:14:53 -0400 Subject: [PATCH 25/32] Fix typos --- .make/base.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.make/base.make b/.make/base.make index 2e30128..d16ca88 100644 --- a/.make/base.make +++ b/.make/base.make @@ -316,11 +316,11 @@ bump-major: ## Bump application major version $(BUMP_TOOL) $(BUMP_ARGS) bump major .PHONY: bump-minor -bump-minor: ## Bump application major version <0.X.0> +bump-minor: ## Bump application minor version <0.X.0> $(BUMP_TOOL) $(BUMP_ARGS) bump minor .PHONY: bump-patch -bump-patch: ## Bump application major version <0.0.X> +bump-patch: ## Bump application patch version <0.0.X> $(BUMP_TOOL) $(BUMP_ARGS) bump patch ## -- Docker targets ------------------------------------------------------------------------------------------------ ## From 22decf2953dbbb8486589b4ead84d37d7dc3bdb9 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 15 May 2024 16:15:33 -0400 Subject: [PATCH 26/32] Update CONTRIBUTING.md --- CONTRIBUTING.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bfc6b08..5ac6828 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,29 @@ # Contributing to this repository +## Adding dependencies + +Please make sure to add dependencies using `Poetry`, so the project environment +is kept up to date and functional for other users. + +To add a new dependency: + +``` +poetry add +``` + +To add a new dependency with a specific version: + +``` +poetry add "==" +``` + +To add a new dependency to a specific group of dependencies +(for exemple, the developer dependencies): + +``` +poetry add --group dev +``` + ## Design patterns Two main considerations should be made when contributing to this package. @@ -13,6 +37,10 @@ completely new behavior or needs. Secondly, a dependency-injection approach is to be preferred, as well as a composition approach when creating new modules or extending existing ones. +Functional approaches are also acceptable when appropriate, but classes should still +be used for data management/representation. This can be done with either regular +classes, `dataclasses`, or `pydantic` models. + ## Tests New contributions should include appropriate tests. From f4a6f1dd848a2972f07cedc49f63e366661de167 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Fri, 17 May 2024 16:11:26 -0400 Subject: [PATCH 27/32] Fix attempt for conda environment problems --- .make/base.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.make/base.make b/.make/base.make index d16ca88..af24b8d 100644 --- a/.make/base.make +++ b/.make/base.make @@ -111,7 +111,7 @@ conda-install: ## Install Conda on your local machine .PHONY: conda-create-env conda-create-env: conda-install ## Create a local Conda environment based on `environment.yml` file - @$(CONDA_TOOL) env create -y -f environment.yml + @$(CONDA_TOOL) env create -f environment.yml .PHONY: conda-env-info conda-env-info: ## Print information about active Conda environment using @@ -119,7 +119,7 @@ conda-env-info: ## Print information about active Conda environment using Date: Wed, 22 May 2024 08:36:25 -0400 Subject: [PATCH 28/32] Add back `y` flag for poetry install --- .make/base.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.make/base.make b/.make/base.make index af24b8d..c2371b9 100644 --- a/.make/base.make +++ b/.make/base.make @@ -119,7 +119,7 @@ conda-env-info: ## Print information about active Conda environment using Date: Wed, 22 May 2024 11:46:03 -0400 Subject: [PATCH 29/32] Fix typos and refactor for pipx cluster use --- .make/base.make | 44 +++++++++++++++--- Makefile.private.example | 2 +- README.md | 98 +++++++++++++++++++++++++++++++--------- 3 files changed, 114 insertions(+), 30 deletions(-) diff --git a/.make/base.make b/.make/base.make index c2371b9..ba4b6b8 100644 --- a/.make/base.make +++ b/.make/base.make @@ -16,7 +16,6 @@ SHELL := /usr/bin/env bash BUMP_TOOL := bump-my-version APP_VERSION := 0.0.0 DOCKER_COMPOSE ?= docker compose -POETRY_VERSION := 1.8.2 AUTO_INSTALL ?= # Conda variables @@ -163,7 +162,7 @@ poetry-install-auto: ## Install Poetry in activated Conda environment, or with p pip install --user pipx; \ pipx ensurepath; \ fi; \ - pipx install poetry==$(POETRY_VERSION); \ + pipx install poetry; \ else \ echo "Installing poetry with Conda"; \ make -s _conda-poetry-install; \ @@ -178,8 +177,21 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W if [ "$(AUTO_INSTALL)" = "true" ]; then \ ans="y";\ else \ - echo""; \ - echo -n "Would you like to install Poetry using pipx? (This will also install pipx if needed) [y/N]: "; \ + pipx --version; \ + if [ $$? != "0" ]; then \ + echo""; \ + echo -e "\e[1;39;41m-- WARNING --\e[0m The following pip has been found and will be used to install pipx: "; \ + echo " -> "$$(which pip); \ + echo""; \ + echo "If you do not have write permission to that environment, you will need to either activate"; \ + echo "a different environment, or create a virtual one (ex. venv) to install pipx into it."; \ + echo "See documentation for more information."; \ + echo""; \ + echo -n "Would you like to install pipx and Poetry? [y/N]: "; \ + else \ + echo""; \ + echo -n "Would you like to install Poetry using pipx? [y/N]: "; \ + fi; \ read ans; \ fi; \ case $$ans in \ @@ -191,7 +203,7 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W pipx ensurepath; \ fi; \ echo "Installing Poetry"; \ - pipx install poetry==$(POETRY_VERSION); \ + pipx install poetry; \ make -s poetry-create-env; \ ;; \ *) \ @@ -254,9 +266,27 @@ poetry-remove-env: ## Remove current project's Poetry managed environment. esac; \ fi; \ +.PHONY: poetry-uninstall +poetry-uninstall: poetry-remove-env ## Uninstall pipx-installed Poetry and the created environment + @if [ "$(AUTO_INSTALL)" = "true" ]; then \ + ans="y";\ + else \ + echo""; \ + echo -n "Would you like to uninstall pipx-installed Poetry? [y/N]: "; \ + read ans; \ + fi; \ + case $$ans in \ + [Yy]*) \ + pipx uninstall poetry; \ + ;; \ + *) \ + echo "Skipping uninstallation."; \ + echo " "; \ + ;; \ + esac; \ .PHONY: poetry-uninstall-pipx -poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the created env and pipx +poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the created environment and pipx @if [ "$(AUTO_INSTALL)" = "true" ]; then \ ans="y";\ else \ @@ -302,7 +332,7 @@ install-with-lab: poetry-install-auto ## Install the application and it's dev de install-package: poetry-install-auto ## Install the application package only @poetry install -## -- Versioning targets ------------------------------------------------------------------------------------------- ## +## -- Versioning targets -------------------------------------------------------------------------------------------- ## # Use the "dry" target for a dry-run version bump, ex. # make bump-major dry diff --git a/Makefile.private.example b/Makefile.private.example index 9b97863..be83cd0 100644 --- a/Makefile.private.example +++ b/Makefile.private.example @@ -24,5 +24,5 @@ DOCKER_COMPOSE := docker compose # a 'true' value will automatically install/remove without asking beforehand. AUTO_INSTALL := false -## -- Private targets -------------------------------------------------------------------------------------------------## +## -- Private targets ------------------------------------------------------------------------------------------------## diff --git a/README.md b/README.md index 42a9d47..90cd870 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ The following Makefile files are project or user specific: The different targets and their description can be examined by executing the command `make targets` +Ex. + ![](img/make_targets.png) ## Installation @@ -62,6 +64,39 @@ clusters). This is why the `pipx` option for Poetry is also enabled in this proj **Unless you really know what you are doing, it is not recommended to install Poetry as a standalone tool (with pipx) while also using Conda environments.** +There are 2 recommended ways to manage `Poetry` if it is not already configured on +your system. Using `Conda`, or installing `Poetry` as a standalone tool using `pipx` + +It is not recommended to install `Poetry` in the same environment that will be managed +by `Poetry` in order to minimize dependency conflicts. + +#### Pipx particularities + +**WARNING** : If you want to install `Poetry` using `pipx`, and pipx is not already +installed on your system, it will be installed using `pip`. + +Write access to that environment is required (use `which pip` to learn which +environment is active if not sure). + +Particularly on remote compute clusters (SLURM), default system `pip` will probably not +be writable by users. One way around it is to create a generic virtual environment +using `venv` like so (preferably in your $HOME): + +``` +python -m venv $HOME/.venv +source $HOME/.venv/bin/activate +pip install pipx +pipx ensurepath +pipx install poetry +``` + +This virtual environment can be deactivated afterward, as Poetry will still be +available to the user. + +``` +deactivate +``` + ### Conda targets If you need or want to install Conda: @@ -79,16 +114,22 @@ To remove the conda environment: make conda-clean-env ``` -Make sure to activate the configured environment before installing this package. +To install `Poetry` using `Conda` (after conda environment as been created: -### Poetry targets +``` +make conda-poetry-install +``` + +To remove poetry from the Conda environment: -There are 2 possibilities available in how to manage `Poetry` if it is not already -configured on your system. +``` +make conda-poetry-uninstall +``` -**It is not recommended to install `Poetry` in the same environment that will be managed -by `Poetry`; It should be installed by `Conda` (as in, `conda install poetry`) or -on the system using `pipx`, in order to minimize dependency conflicts.** +Make sure to activate the conda environment before moving on the +[install targets](#install-targets). + +### Poetry targets The following target will first try to install `Poetry` in the active `Conda` environment; if it can't find `Conda`, it will proceed to install via `pipx` @@ -97,33 +138,45 @@ environment; if it can't find `Conda`, it will proceed to install via `pipx` make poetry-install-auto ``` -To install `Poetry` using `Conda`: +The following target will allow environment management directly with a standalone +`Poetry` installation through `pipx`. It will also create a virtual environment managed +by `Poetry` that uses Python 3.10. ``` -make conda-poetry-install +make poetry-install ``` -Using `pipx` will instead allow environment management directly with `Poetry`. The -following target will also make `Poetry` use a Python 3.10 environment for this -project. +If you already have Poetry installed and configured, or want to recreate it later, +an environment for the project can also be created using: ``` -make poetry-install-pipx +make poetry-create-env ``` -This will also create a virtual environment managed by `Poetry`. +and removed using: -A standalone environment can also be created later using the `make poetry-create-env` -command, and removed with the `make poetry-remove-env` command. +``` +make poetry-remove-env +``` -Information about the currently active environment used by Poetry, -whether Conda or Poetry, can be seen using the `make poetry-env-info` command. +Information about the currently active environment used by `Poetry`, +whether `Conda` or `Poetry`, can be seen using: -Both install methods can also be cleaned up: +``` +make poetry-env-info +``` + +To remove `Poetry` that was installed with `pipx` (be sure to execute this command in +the environment where pipx is installed): + +``` +make poetry-uninstall +``` + +To uninstall both `Poetry` and `pipx` (again, be sure to execute this command in +the environment where pipx is installed): ``` -make conda-poetry-uninstall -# or make poetry-uninstall-pipx ``` @@ -132,7 +185,8 @@ make poetry-uninstall-pipx If you have an active `Conda` environment and install `Poetry` using `pipx`, you will have to use `poetry run python ` instead of `python `, (which is normal when using Poetry) as -`python` will use Conda's active environment. +Conda's active environment will define the available default `python` executable. + ### Install targets From 97e9e9b0e33227f4b887ac2f6180c7cc70ce997d Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 22 May 2024 12:33:46 -0400 Subject: [PATCH 30/32] Add virtual environment option for pipx installation This is relevant in remote compute cluster environments. --- .make/base.make | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/.make/base.make b/.make/base.make index ba4b6b8..2ef3fef 100644 --- a/.make/base.make +++ b/.make/base.make @@ -199,7 +199,7 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W pipx --version; \ if [ $$? != "0" ]; then \ echo "pipx not found; installing pipx"; \ - pip install --user pipx; \ + pip install --user pipx || pip install pipx; \ pipx ensurepath; \ fi; \ echo "Installing Poetry"; \ @@ -213,6 +213,13 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W esac; \ fi; +.PHONY: poetry-install-venv +poetry-install-venv: ## Install standalone Poetry and Poetry environment. Will install pipx in $HOME/.pipx_venv + python3 -m venv $$HOME/.pipx_venv + @source $$HOME/.pipx_venv/bin/activate + @pip3 install pipx + make -s poetry-install + .PHONY: poetry-env-info poetry-env-info: ## Information about the currently active environment used by Poetry @poetry env info @@ -286,7 +293,7 @@ poetry-uninstall: poetry-remove-env ## Uninstall pipx-installed Poetry and the c esac; \ .PHONY: poetry-uninstall-pipx -poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the created environment and pipx +poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the created Poetry environment and pipx @if [ "$(AUTO_INSTALL)" = "true" ]; then \ ans="y";\ else \ @@ -305,6 +312,28 @@ poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the ;; \ esac; \ +.PHONY: poetry-uninstall-venv +poetry-uninstall-venv: ## Uninstall pipx-installed Poetry, the created Poetry environment, pipx and $HOME/.pipx_venv + python3 -m venv $$HOME/.pipx_venv + @source $$HOME/.pipx_venv/bin/activate + make -s poetry-uninstall-pipx + @if [ "$(AUTO_INSTALL)" = "true" ]; then \ + ans="y";\ + else \ + echo""; \ + echo -n "Would you like to remove the virtual environment located here : [$$HOME/.pipx_venv] ? [y/N]: "; \ + read ans; \ + fi; \ + case $$ans in \ + [Yy]*) \ + rm -r $$HOME/.pipx_venv; \ + ;; \ + *) \ + echo "Skipping [$$HOME/.pipx_venv] virtual environment removal."; \ + echo ""; \ + ;; \ + esac; \ + ## -- Install targets (All install targets will install Poetry if not found using `make poetry-install-auto`)-------- ## .PHONY: install From 8396ac28390ab8be3e3fa70e117db003e263a343 Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 22 May 2024 12:39:28 -0400 Subject: [PATCH 31/32] Update README.md --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90cd870..307fd99 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,10 @@ environment is active if not sure). Particularly on remote compute clusters (SLURM), default system `pip` will probably not be writable by users. One way around it is to create a generic virtual environment -using `venv` like so (preferably in your $HOME): +using `venv` like so (preferably in your $HOME). It can be done manually using the +following commands: +Ex. ``` python -m venv $HOME/.venv source $HOME/.venv/bin/activate @@ -97,6 +99,8 @@ available to the user. deactivate ``` +There are also targets in the [Poetry section](#poetry-targets) that handle this use case. + ### Conda targets If you need or want to install Conda: @@ -146,6 +150,12 @@ by `Poetry` that uses Python 3.10. make poetry-install ``` +If the compute environment requires `pipx` to be installed in a virtual environment: + +``` +make poetry-install-venv +``` + If you already have Poetry installed and configured, or want to recreate it later, an environment for the project can also be created using: @@ -177,7 +187,14 @@ To uninstall both `Poetry` and `pipx` (again, be sure to execute this command in the environment where pipx is installed): ``` -make poetry-uninstall-pipx +make poetry-uninstall +``` + +If `Poetry` and `pipx` were installed using the `make poetry-install-venv`, they can be +removed, including the virtual environment, using: + +``` +make poetry-uninstall-venv ``` **Important note!** From f7aa168588b702a648957f137dd510faf116ee6a Mon Sep 17 00:00:00 2001 From: f-PLT Date: Wed, 22 May 2024 13:11:33 -0400 Subject: [PATCH 32/32] Update and improve README.md and makefile text output for pipx --- .make/base.make | 13 +++++++++---- README.md | 42 +++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/.make/base.make b/.make/base.make index 2ef3fef..185e80b 100644 --- a/.make/base.make +++ b/.make/base.make @@ -177,6 +177,7 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W if [ "$(AUTO_INSTALL)" = "true" ]; then \ ans="y";\ else \ + echo "Looking for pipx version...";\ pipx --version; \ if [ $$? != "0" ]; then \ echo""; \ @@ -187,6 +188,8 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W echo "a different environment, or create a virtual one (ex. venv) to install pipx into it."; \ echo "See documentation for more information."; \ echo""; \ + echo "Alternatively, the [make poetry-install-venv] target can also be used"; \ + echo""; \ echo -n "Would you like to install pipx and Poetry? [y/N]: "; \ else \ echo""; \ @@ -215,10 +218,12 @@ poetry-install: ## Install standalone Poetry using pipx and create Poetry env. W .PHONY: poetry-install-venv poetry-install-venv: ## Install standalone Poetry and Poetry environment. Will install pipx in $HOME/.pipx_venv - python3 -m venv $$HOME/.pipx_venv + @echo "Creating virtual environment using venv here : [$$HOME/.pipx_venv]" + @python3 -m venv $$HOME/.pipx_venv + @echo "Activating virtual environment [$$HOME/.pipx_venv]" @source $$HOME/.pipx_venv/bin/activate @pip3 install pipx - make -s poetry-install + @make -s poetry-install .PHONY: poetry-env-info poetry-env-info: ## Information about the currently active environment used by Poetry @@ -314,9 +319,9 @@ poetry-uninstall-pipx: poetry-remove-env ## Uninstall pipx-installed Poetry, the .PHONY: poetry-uninstall-venv poetry-uninstall-venv: ## Uninstall pipx-installed Poetry, the created Poetry environment, pipx and $HOME/.pipx_venv - python3 -m venv $$HOME/.pipx_venv + @python3 -m venv $$HOME/.pipx_venv @source $$HOME/.pipx_venv/bin/activate - make -s poetry-uninstall-pipx + @make -s poetry-uninstall-pipx @if [ "$(AUTO_INSTALL)" = "true" ]; then \ ans="y";\ else \ diff --git a/README.md b/README.md index 307fd99..f33e077 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # ClimatesetExtension -## Requirements - -This project has only been tested in a Linux (Debian based) environment and assumes -some basic tools for development are already installed. +## Tools and Makefile structure The project uses a Makefile to automate most operations. If make is available on your machine there's a good chance this will work. @@ -19,7 +16,7 @@ The following Makefile files are project or user specific: * [Makefile.targets](Makefile.targets) : Shared project targets. * [Makefile.private](Makefile.private.example) : User specific variables and targets. -## Basic Information +### Basic Information The different targets and their description can be examined by executing the command `make targets` @@ -28,7 +25,12 @@ Ex. ![](img/make_targets.png) -## Installation +## Requirements + +This project has only been tested in a Linux (Debian based) environment and assumes +some basic tools for development are already installed. + +It also requires that minimally `Python`, `pip` and `venv` are available on your system. This project assumes environment management will be done with `Conda` or directly through `Poetry`. @@ -52,7 +54,7 @@ by most `install` targets. Currently, the project runs on Python version 3.10. -### Environment management choices +## Environment management choices Environment management can become quite complicated. Using Conda allows a certain ease of management since the Poetry installation is contained inside the created Conda @@ -70,17 +72,17 @@ your system. Using `Conda`, or installing `Poetry` as a standalone tool using `p It is not recommended to install `Poetry` in the same environment that will be managed by `Poetry` in order to minimize dependency conflicts. -#### Pipx particularities +### Note about Pipx installation -**WARNING** : If you want to install `Poetry` using `pipx`, and pipx is not already +If you want to install `Poetry` using `pipx`, and pipx is not already installed on your system, it will be installed using `pip`. Write access to that environment is required (use `which pip` to learn which environment is active if not sure). Particularly on remote compute clusters (SLURM), default system `pip` will probably not -be writable by users. One way around it is to create a generic virtual environment -using `venv` like so (preferably in your $HOME). It can be done manually using the +allow users to install packages. One way around it is to create a generic virtual +environment using `venv` like so (preferably in your $HOME). It can be done manually using the following commands: Ex. @@ -90,18 +92,15 @@ source $HOME/.venv/bin/activate pip install pipx pipx ensurepath pipx install poetry +deactivate ``` This virtual environment can be deactivated afterward, as Poetry will still be available to the user. -``` -deactivate -``` - -There are also targets in the [Poetry section](#poetry-targets) that handle this use case. +There are also targets in the [Poetry section](#using-poetry) that handle this use case. -### Conda targets +## Using Conda If you need or want to install Conda: ``` @@ -133,7 +132,7 @@ make conda-poetry-uninstall Make sure to activate the conda environment before moving on the [install targets](#install-targets). -### Poetry targets +## Using Poetry The following target will first try to install `Poetry` in the active `Conda` environment; if it can't find `Conda`, it will proceed to install via `pipx` @@ -205,7 +204,7 @@ you will have to use `poetry run python ` instead o Conda's active environment will define the available default `python` executable. -### Install targets +## Installing the python package and it's dependencies **All `install` targets will first check if `Poetry` is available and try to install it with the `make poetry-install-auto` target.** @@ -251,10 +250,11 @@ The easiest and quickest way to get up and running with Poetry. Install pipx and Poetry and activate project environment : ``` -make poetry-install +make poetry-install ``` +_can be replaced by `make poetry-install-venv` if needed_ -**Or, if Poetry is already available:** +If Poetry is already available, the environment can be created using: ``` make poetry-create-env