diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index 0be1911e..e6f45180 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -15,12 +15,12 @@ jobs: # check-out repo and set-up python #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" #---------------------------------------------- # ----- install & configure poetry ----- #---------------------------------------------- @@ -35,7 +35,7 @@ jobs: #---------------------------------------------- - name: Load cached venv id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: .venv key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 30b73d1b..96146e19 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -17,12 +17,12 @@ jobs: # check-out repo and set-up python #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.12" #---------------------------------------------- # ----- install & configure poetry ----- #---------------------------------------------- diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index b7478469..18f572f5 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -9,7 +9,8 @@ jobs: matrix: python-version: - "3.10" # Earliest version supported by ixmp4 - - "3.11" # Latest version supported by ixmp4 + - "3.11" + - "3.12" # Latest version supported by ixmp4 runs-on: ubuntu-latest services: @@ -34,7 +35,7 @@ jobs: uses: actions/checkout@v4 - name: Set up python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} #---------------------------------------------- @@ -51,7 +52,7 @@ jobs: #---------------------------------------------- - name: Load cached venv id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: .venv key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} @@ -81,8 +82,8 @@ jobs: #---------------------------------------------- # check-out repo and set-up python #---------------------------------------------- - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 #---------------------------------------------- # ----- install & configure poetry ----- #---------------------------------------------- @@ -97,7 +98,7 @@ jobs: #---------------------------------------------- - name: Load cached venv id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: .venv key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09e74ced..3ef04704 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,13 @@ repos: - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.6.1 + rev: v1.8.0 hooks: - id: mypy entry: bash -c "poetry run mypy ." language: system -- repo: https://github.com/psf/black - rev: 23.12.1 - hooks: - - id: black - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.11 + rev: v0.2.1 hooks: - - id: ruff \ No newline at end of file + - id: ruff + - id: ruff-format + args: [ --check ] \ No newline at end of file diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 92e77c31..fb8bf121 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.10" + python: "3.12" # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" diff --git a/DEVELOPING.md b/DEVELOPING.md index e8e26807..be3c3d34 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -207,7 +207,7 @@ alembic revision -m "" --autogenerate ``` You will have to run all migrations before being able to create new ones in the development database. -Be sure to run `black` and `isort` on newly created migrations! +Be sure to run `ruff` on newly created migrations! ## Tests @@ -322,7 +322,7 @@ It is overwritten on the fly by the poetry-dynamic-versioning plugin. Contributions to the code are always welcome! Please make sure your code follows our code style so that the style is consistent. Each PR will be checked by a Code Quality -test that examines compliance with black, ruff, and mypy. +test that examines compliance with ruff and mypy. ### Running pre-commit locally @@ -340,7 +340,7 @@ on changed files, but if you want to run it on all files, you can run pre-commit run --all-files ``` -If you only want certain hooks to run, choose from `ruff`, `black`, and `mypy` as +If you only want certain hooks to run, choose from `ruff` and `mypy` as `hook-ids` and run ```bash @@ -354,16 +354,15 @@ are the same. You can, of course, run the code style tools manually. From within ixmp4 directory, this would look similar to this: ```bash -black . mypy . ruff check . +ruff format . # Or to enable ruff's automic fixes ruff check --fix . ``` However, it is easy to forget running these commands manually. Therefore, we recommend -setting your editor up to run at least -[black](https://black.readthedocs.io/en/stable/integrations/editors.html) and -[ruff](https://docs.astral.sh/ruff/usage/#vs-code) automatically whenever you hit -`save`. A few minutes of configuration will save you time and nerves later on. +setting your editor up to run at least [ruff](https://docs.astral.sh/ruff/usage/#vs-code) +automatically whenever you hit `save`. A few minutes of configuration will save you time +and nerves later on. diff --git a/README.md b/README.md index 285cbe03..b6c6f810 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ Copyright (c) 2023-2024 IIASA - Energy, Climate, and Environment Program (ECE) [![license: MIT](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/iiasa/ixmp4/blob/main/LICENSE) -[![python](https://img.shields.io/badge/python-3.10_|_3.11-blue?logo=python&logoColor=white)](https://github.com/iiasa/ixmp4) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![python](https://img.shields.io/badge/python-3.10_|_3.11_|_3.12-blue?logo=python&logoColor=white)](https://github.com/iiasa/ixmp4) +[![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) ## Overview diff --git a/doc/source/index.rst b/doc/source/index.rst index 106ab64b..594d317d 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -3,15 +3,15 @@ The ixmp4 package for scenario data management Copyright © 2023-2024 IIASA - Energy, Climate, and Environment Program (ECE) -|license| |black| |python| +|license| |ruff| |python| .. |license| image:: https://img.shields.io/badge/license-MIT-brightgreen :target: https://github.com/iiasa/ixmp4/blob/main/LICENSE -.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black +.. |ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff -.. |python| image:: https://img.shields.io/badge/python-3.10_|_3.11-blue?logo=python&logoColor=white +.. |python| image:: https://img.shields.io/badge/python-3.10_|_3.11_|_3.12-blue?logo=python&logoColor=white :target: https://github.com/iiasa/ixmp4 Overview diff --git a/ixmp4/cli/platforms.py b/ixmp4/cli/platforms.py index c7c7d7d6..f2d85804 100644 --- a/ixmp4/cli/platforms.py +++ b/ixmp4/cli/platforms.py @@ -97,8 +97,7 @@ def prompt_sqlite_removal(dsn: str): path = Path(dsn.replace("sqlite://", "")) path_str = typer.style(path, fg=typer.colors.CYAN) if typer.confirm( - "Do you want to remove the associated database file at " - f"{path_str} aswell?" # type: ignore + "Do you want to remove the associated database file at " f"{path_str} as well?" # type: ignore ): path.unlink() utils.echo("\nDatabase file deleted.") @@ -110,7 +109,7 @@ def prompt_sqlite_removal(dsn: str): def remove( name: str = typer.Argument( ..., help="The string identifier of the platform to remove." - ) + ), ): try: platform = settings.toml.get_platform(name) diff --git a/ixmp4/data/api/iamc/datapoint.py b/ixmp4/data/api/iamc/datapoint.py index 905f5f4b..3692acce 100644 --- a/ixmp4/data/api/iamc/datapoint.py +++ b/ixmp4/data/api/iamc/datapoint.py @@ -39,7 +39,7 @@ def list( self, join_parameters: bool | None = None, join_runs: bool | None = None, - **kwargs + **kwargs, ) -> list[DataPoint]: return super()._list( json=kwargs, @@ -53,7 +53,7 @@ def tabulate( self, join_parameters: bool | None = None, join_runs: bool | None = None, - **kwargs + **kwargs, ) -> pd.DataFrame: return super()._tabulate( json=kwargs, diff --git a/ixmp4/data/backend/base.py b/ixmp4/data/backend/base.py index ab5294e6..931b9e17 100644 --- a/ixmp4/data/backend/base.py +++ b/ixmp4/data/backend/base.py @@ -40,3 +40,7 @@ def __init__(self, info: PlatformInfo) -> None: self.info = info self.iamc = IamcSubobject() self.optimization = OptimizationSubobject() + + def close(self) -> None: + """Closes the connection to the database.""" + ... diff --git a/ixmp4/data/db/base.py b/ixmp4/data/db/base.py index 0cd2e451..0f68d5af 100644 --- a/ixmp4/data/db/base.py +++ b/ixmp4/data/db/base.py @@ -1,6 +1,6 @@ import logging import sqlite3 -from datetime import datetime +from datetime import datetime, timezone from typing import ( TYPE_CHECKING, Any, @@ -116,7 +116,10 @@ def get(self, *args, **kwargs) -> ModelType: class Creator(BaseRepository[ModelType], abstract.Creator): def get_creation_info(self) -> dict: - info = {"created_at": datetime.utcnow(), "created_by": "@unknown"} + info = { + "created_at": datetime.now(tz=timezone.utc), + "created_by": "@unknown", + } if self.backend.auth_context is not None: info["created_by"] = self.backend.auth_context.user.username return info @@ -236,9 +239,7 @@ def tabulate( if self.session.bind is not None: with self.engine.connect() as con: - return ( - pd.read_sql(_exc, con=con).fillna(np.nan).replace([np.nan], [None]) - ) + return pd.read_sql(_exc, con=con).replace([np.nan], [None]) else: raise ProgrammingError("Database session is closed.") diff --git a/ixmp4/data/db/iamc/datapoint/repository.py b/ixmp4/data/db/iamc/datapoint/repository.py index f098568f..ae289ffb 100644 --- a/ixmp4/data/db/iamc/datapoint/repository.py +++ b/ixmp4/data/db/iamc/datapoint/repository.py @@ -163,7 +163,7 @@ def select( join_runs: bool = False, _filter: DataPointFilter | None = None, _exc: db.sql.Select | None = None, - **kwargs: Any + **kwargs: Any, ) -> db.sql.Select: if _exc is not None: exc = _exc diff --git a/ixmp4/data/db/timeseries.py b/ixmp4/data/db/timeseries.py index 232235a0..5bcf3600 100644 --- a/ixmp4/data/db/timeseries.py +++ b/ixmp4/data/db/timeseries.py @@ -94,7 +94,7 @@ def select( *, _exc: db.sql.Select | None = None, join_parameters: bool | None = False, - **kwargs + **kwargs, ) -> db.sql.Select: if _exc is not None: exc = _exc diff --git a/ixmp4/db/filters.py b/ixmp4/db/filters.py index 489fe8ef..35d91a35 100644 --- a/ixmp4/db/filters.py +++ b/ixmp4/db/filters.py @@ -192,11 +192,11 @@ def process_field(cls, namespace: dict, field_name: str, field_type: type): ) else: override_lookups = None - if override_lookups: + if isinstance(override_lookups, list): lookups = {k: v for k, v in lookups.items() if k in override_lookups} elif override_lookups is None: pass - else: + else: # TODO (How) do we ensure the type of override_lookups? lookups = {} base_field_alias = str(field.alias) if field.alias else field_name diff --git a/ixmp4/server/rest/__init__.py b/ixmp4/server/rest/__init__.py index 85c833be..307be244 100644 --- a/ixmp4/server/rest/__init__.py +++ b/ixmp4/server/rest/__init__.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone from fastapi import Depends, FastAPI, Path, Request from fastapi.encoders import jsonable_encoder @@ -69,7 +69,7 @@ def root( version=version, is_managed=settings.managed, manager_url=str(settings.manager_url), - utcnow=datetime.utcnow(), + utcnow=datetime.now(tz=timezone.utc), ) diff --git a/ixmp4/server/rest/base.py b/ixmp4/server/rest/base.py index fa961926..2ade6953 100644 --- a/ixmp4/server/rest/base.py +++ b/ixmp4/server/rest/base.py @@ -33,7 +33,7 @@ def __init__( __pydantic_self__, *args, results: pd.DataFrame | api.DataFrame | list[EnumeratedT], - **kwargs + **kwargs, ): if isinstance(results, pd.DataFrame): kwargs["results"] = api.DataFrame.model_validate(results) diff --git a/poetry.lock b/poetry.lock index 00cb5696..0182ff3b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.16" description = "A light, configurable Sphinx theme" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -16,7 +15,6 @@ files = [ name = "alembic" version = "1.13.1" description = "A database migration tool for SQLAlchemy." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -36,7 +34,6 @@ tz = ["backports.zoneinfo"] name = "annotated-types" version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -48,7 +45,6 @@ files = [ name = "anyio" version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -69,21 +65,19 @@ trio = ["trio (>=0.23)"] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -102,7 +96,6 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -122,7 +115,6 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p name = "babel" version = "2.14.0" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -133,58 +125,10 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "black" -version = "23.12.1" -description = "The uncompromising code formatter." -category = "dev" -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 = "build" version = "1.0.3" description = "A simple, correct Python build frontend" -category = "dev" optional = false python-versions = ">= 3.7" files = [ @@ -206,21 +150,19 @@ virtualenv = ["virtualenv (>=20.0.35)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {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." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -285,7 +227,6 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -297,7 +238,6 @@ files = [ name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -397,7 +337,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -412,7 +351,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "cloudpickle" version = "3.0.0" description = "Pickler class to extend the standard pickle.Pickler functionality" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -424,7 +362,6 @@ files = [ name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -436,7 +373,6 @@ files = [ name = "comm" version = "0.2.1" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -454,7 +390,6 @@ test = ["pytest"] name = "coverage" version = "7.4.1" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -520,14 +455,13 @@ toml = ["tomli"] [[package]] name = "dask" -version = "2023.12.1" +version = "2024.1.1" description = "Parallel PyData with Task Scheduling" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "dask-2023.12.1-py3-none-any.whl", hash = "sha256:55f316f32da9e68fe995e2c0dc460cb8888cd4a1af32096753788e8af45a8d10"}, - {file = "dask-2023.12.1.tar.gz", hash = "sha256:0ac3acd5bdbfacb5ad6401ac7663a1135955b3fa051a118e1b8a88e87b6b44a2"}, + {file = "dask-2024.1.1-py3-none-any.whl", hash = "sha256:860ce2797905095beff0187c214840b80c77d752dcb9098a8283e3655a762bf5"}, + {file = "dask-2024.1.1.tar.gz", hash = "sha256:d0dc92e81ce68594a0a0ce23ba33f4d648f2c2f4217ab9b79068b7ecfb0416c7"}, ] [package.dependencies] @@ -545,14 +479,13 @@ array = ["numpy (>=1.21)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] dataframe = ["dask[array]", "pandas (>=1.3)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2023.12.1)"] +distributed = ["distributed (==2024.1.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] name = "debugpy" version = "1.8.0" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -580,7 +513,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -592,7 +524,6 @@ files = [ name = "deepmerge" version = "1.1.1" description = "a toolset to deeply merge python dictionaries." -category = "dev" optional = false python-versions = "*" files = [ @@ -604,7 +535,6 @@ files = [ name = "distlib" version = "0.3.8" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -614,21 +544,19 @@ files = [ [[package]] name = "docutils" -version = "0.18.1" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -640,7 +568,6 @@ files = [ name = "exceptiongroup" version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -655,7 +582,6 @@ test = ["pytest (>=6)"] name = "executing" version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -668,29 +594,27 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.108.0" +version = "0.109.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.108.0-py3-none-any.whl", hash = "sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7"}, - {file = "fastapi-0.108.0.tar.gz", hash = "sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296"}, + {file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"}, + {file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"}, ] [package.dependencies] pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.29.0,<0.33.0" +starlette = ">=0.36.3,<0.37.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" version = "3.13.1" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -705,14 +629,13 @@ typing = ["typing-extensions (>=4.8)"] [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.2.0" description = "File-system specification" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, ] [package.extras] @@ -730,7 +653,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -743,7 +666,6 @@ tqdm = ["tqdm"] name = "greenlet" version = "3.0.3" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -815,7 +737,6 @@ test = ["objgraph", "psutil"] name = "gunicorn" version = "21.2.0" description = "WSGI HTTP Server for UNIX" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -836,7 +757,6 @@ tornado = ["tornado (>=0.2)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -848,7 +768,6 @@ files = [ name = "h2" version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -864,7 +783,6 @@ hyperframe = ">=6.0,<7" name = "hpack" version = "4.0.0" description = "Pure-Python HPACK header compression" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -876,7 +794,6 @@ files = [ name = "httpcore" version = "1.0.2" description = "A minimal low-level HTTP client." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -891,14 +808,13 @@ h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] name = "httptools" version = "0.6.1" description = "A collection of framework independent HTTP protocol utils." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -945,35 +861,33 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.25.2" +version = "0.26.0" description = "The next generation HTTP client." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"}, - {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"}, + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, ] [package.dependencies] anyio = "*" certifi = "*" h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} -httpcore = ">=1.0.0,<2.0.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -985,7 +899,6 @@ files = [ name = "identify" version = "2.5.33" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1000,7 +913,6 @@ license = ["ukkonen"] name = "idna" version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1012,7 +924,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1024,7 +935,6 @@ files = [ name = "importlib-metadata" version = "7.0.1" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1044,7 +954,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1054,14 +963,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.0" +version = "6.29.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"}, - {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"}, + {file = "ipykernel-6.29.1-py3-none-any.whl", hash = "sha256:e5dfba210fc9da74a5dae8fa6c41f816e11bd18d10381b2517d9a0d57cc987c4"}, + {file = "ipykernel-6.29.1.tar.gz", hash = "sha256:1547352b32da95a2761011a8dac2af930c26a0703dfa07690d16b7d74dac0ba1"}, ] [package.dependencies] @@ -1070,7 +978,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1084,13 +992,12 @@ 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.2)", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.4)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" version = "8.21.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.10" files = [ @@ -1127,7 +1034,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pa name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1147,7 +1053,6 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.3" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1165,7 +1070,6 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.21.1" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1187,7 +1091,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1202,7 +1105,6 @@ referencing = ">=0.31.0" name = "jupyter-client" version = "8.6.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1211,7 +1113,7 @@ files = [ ] [package.dependencies] -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1225,7 +1127,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-core" version = "5.7.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1246,7 +1147,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "latexcodec" version = "2.0.1" description = "A lexer and codec to work with LaTeX code in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1261,7 +1161,6 @@ six = ">=1.4.1" name = "locket" version = "1.0.0" description = "File-based locks for Python on Linux and Windows" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1273,7 +1172,6 @@ files = [ name = "mako" version = "1.3.2" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1293,7 +1191,6 @@ testing = ["pytest"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1316,79 +1213,77 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {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.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1403,7 +1298,6 @@ traitlets = "*" name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1415,7 +1309,6 @@ files = [ name = "mistune" version = "2.0.5" description = "A sane Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = "*" files = [ @@ -1427,7 +1320,6 @@ files = [ name = "multimethod" version = "1.11" description = "Multiple argument dispatching." -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -1439,7 +1331,6 @@ files = [ name = "mypy" version = "1.8.0" description = "Optional static typing for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1487,7 +1378,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1499,7 +1389,6 @@ files = [ name = "nest-asyncio" version = "1.6.0" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1511,7 +1400,6 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -1524,55 +1412,53 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openpyxl" version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1587,7 +1473,6 @@ et-xmlfile = "*" name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1597,41 +1482,36 @@ files = [ [[package]] name = "pandas" -version = "2.2.0" +version = "2.1.4" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, - {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, - {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, - {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, - {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, - {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, - {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, + {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, + {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, + {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, + {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, + {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, + {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, + {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, + {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, + {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, + {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, + {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, ] [package.dependencies] @@ -1641,37 +1521,36 @@ numpy = [ ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" -tzdata = ">=2022.7" +tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "pandas-stubs" version = "2.1.4.231227" description = "Type annotations for pandas" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1685,14 +1564,13 @@ types-pytz = ">=2022.1.1" [[package]] name = "pandera" -version = "0.17.2" +version = "0.18.0" description = "A light-weight and flexible data validation and testing tool for statistical data objects." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pandera-0.17.2-py3-none-any.whl", hash = "sha256:8e4e7b279c62f6d4b5109801544bf8d46e1c9fdf7ceceb8fedd5f3dad0c1bea1"}, - {file = "pandera-0.17.2.tar.gz", hash = "sha256:67515984f855ba14d12443f893b5ff90ae6796f613d5f3df43abad406a48c373"}, + {file = "pandera-0.18.0-py3-none-any.whl", hash = "sha256:fe2da835a16df5a7e49fbfb828f1eeaea9d6f4534f124630957e64fef53e7e73"}, + {file = "pandera-0.18.0.tar.gz", hash = "sha256:97ab33d884362c0bb99668a12be2855d15c1a71f4934c588a999947b47764bc1"}, ] [package.dependencies] @@ -1723,7 +1601,6 @@ strategies = ["hypothesis (>=5.41.1)"] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1739,7 +1616,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "partd" version = "1.4.1" description = "Appendable key-value storage" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1754,23 +1630,10 @@ toolz = "*" [package.extras] complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -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." -category = "dev" optional = false python-versions = "*" files = [ @@ -1785,7 +1648,6 @@ ptyprocess = ">=0.5" name = "picobox" version = "4.0.0" description = "Dependency injection framework designed with Python in mind." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1797,7 +1659,6 @@ files = [ name = "platformdirs" version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1813,7 +1674,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- name = "pluggy" version = "1.4.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1829,7 +1689,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.6.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1848,7 +1707,6 @@ virtualenv = ">=20.10.0" name = "prompt-toolkit" version = "3.0.43" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -1863,7 +1721,6 @@ wcwidth = "*" name = "psutil" version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -1890,109 +1747,106 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg" -version = "3.1.17" +version = "3.1.18" description = "PostgreSQL database adapter for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "psycopg-3.1.17-py3-none-any.whl", hash = "sha256:96b7b13af6d5a514118b759a66b2799a8a4aa78675fa6bb0d3f7d52d67eff002"}, - {file = "psycopg-3.1.17.tar.gz", hash = "sha256:437e7d7925459f21de570383e2e10542aceb3b9cb972ce957fdd3826ca47edc6"}, + {file = "psycopg-3.1.18-py3-none-any.whl", hash = "sha256:4d5a0a5a8590906daa58ebd5f3cfc34091377354a1acced269dd10faf55da60e"}, + {file = "psycopg-3.1.18.tar.gz", hash = "sha256:31144d3fb4c17d78094d9e579826f047d4af1da6a10427d91dfcfb6ecdf6f12b"}, ] [package.dependencies] -psycopg-binary = {version = "3.1.17", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} +psycopg-binary = {version = "3.1.18", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} typing-extensions = ">=4.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.1.17)"] -c = ["psycopg-c (==3.1.17)"] -dev = ["black (>=23.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +binary = ["psycopg-binary (==3.1.18)"] +c = ["psycopg-c (==3.1.18)"] +dev = ["black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] pool = ["psycopg-pool"] test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "psycopg-binary" -version = "3.1.17" +version = "3.1.18" description = "PostgreSQL database adapter for Python -- C optimisation distribution" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "psycopg_binary-3.1.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9ba559eabb0ba1afd4e0504fa0b10e00a212cac0c4028b8a1c3b087b5c1e5de"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2b2a689eaede08cf91a36b10b0da6568dd6e4669200f201e082639816737992b"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a16abab0c1abc58feb6ab11d78d0f8178a67c3586bd70628ec7c0218ec04c4ef"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73e7097b81cad9ae358334e3cec625246bb3b8013ae6bb287758dd6435e12f65"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67a5b93101bc85a95a189c0a23d02a29cf06c1080a695a0dedfdd50dd734662a"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:751b31c2faae0348f87f22b45ef58f704bdcfc2abdd680fa0c743c124071157e"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b447ea765e71bc33a82cf070bba814b1efa77967442d116b95ccef8ce5da7631"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d2e9ed88d9a6a475c67bf70fc8285e88ccece0391727c7701e5a512e0eafbb05"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a89f36bf7b612ff6ed3e789bd987cbd0787cf0d66c49386fa3bad816dd7bee87"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5ccbe8b2ec444763a51ecb1213befcbb75defc1ef36e7dd5dff501a23d7ce8cf"}, - {file = "psycopg_binary-3.1.17-cp310-cp310-win_amd64.whl", hash = "sha256:adb670031b27949c9dc5cf585c4a5a6b4469d3879fd2fb9d39b6d53e5f66b9bc"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0227885686c2cc0104ceb22d6eebc732766e9ad48710408cb0123237432e5435"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9124b6db07e8d8b11f4512b8b56cbe136bf1b7d0417d1280e62291a9dcad4408"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a46f77ba0ca7c5a5449b777170a518fa7820e1710edb40e777c9798f00d033"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f5f5bcbb772d8c243d605fc7151beec760dd27532d42145a58fb74ef9c5fbf2"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:267a82548c21476120e43dc72b961f1af52c380c0b4c951bdb34cf14cb26bd35"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b20013051f1fd7d02b8d0766cfe8d009e8078babc00a6d39bc7e2d50a7b96af"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c5c38129cc79d7e3ba553035b9962a442171e9f97bb1b8795c0885213f206f3"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d01c4faae66de60fcd3afd3720dcc8ffa03bc2087f898106da127774db12aac5"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e6ae27b0617ad3809449964b5e901b21acff8e306abacb8ba71d5ee7c8c47eeb"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:40af298b209dd77ca2f3e7eb3fbcfb87a25999fc015fcd14140bde030a164c7e"}, - {file = "psycopg_binary-3.1.17-cp311-cp311-win_amd64.whl", hash = "sha256:7b4e4c2b05f3b431e9026e82590b217e87696e7a7548f512ae8059d59fa8af3b"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ea425a8dcd808a7232a5417d2633bfa543da583a2701b5228e9e29989a50deda"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3f1196d76860e72d338fab0d2b6722e8d47e2285d693e366ae36011c4a5898a"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1e867c2a729348df218a14ba1b862e627177fd57c7b4f3db0b4c708f6d03696"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0711e46361ea3047cd049868419d030c8236a9dea7e9ed1f053cbd61a853ec9"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1c0115bdf80cf6c8c9109cb10cf6f650fd1a8d841f884925e8cb12f34eb5371"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d0d154c780cc7b28a3a0886e8a4b18689202a1dbb522b3c771eb3a1289cf7c3"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f4028443bf25c1e04ecffdc552c0a98d826903dec76a1568dfddf5ebbbb03db7"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf424d92dd7e94705b31625b02d396297a7c8fab4b6f7de8dba6388323a7b71c"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:00377f6963ee7e4bf71cab17c2c235ef0624df9483f3b615d86aa24cde889d42"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9690a535d9ccd361bbc3590bfce7fe679e847f44fa7cc97f3b885f4744ca8a2c"}, - {file = "psycopg_binary-3.1.17-cp312-cp312-win_amd64.whl", hash = "sha256:6b2ae342d69684555bfe77aed5546d125b4a99012e0b83a8b3da68c8829f0935"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:86bb3656c8d744cc1e42003414cd6c765117d70aa23da6c0f4ff2b826e0fd0fd"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10b7713e3ed31df7319c2a72d5fea5a2536476d7695a3e1d18a1f289060997c"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12eab8bc91b4ba01b2ecee3b5b80501934b198f6e1f8d4b13596f3f38ba6e762"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a728beefd89b430ebe2729d04ba10e05036b5e9d01648da60436000d2fcd242"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61104b8e7a43babf2bbaa36c08e31a12023e2f967166e99d6b052b11a4c7db06"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:02cd2eb62ffc56f8c847d68765cbf461b3d11b438fe48951e44b6c563ec27d18"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ca1757a6e080086f7234dc45684e81a47a66a6dd492a37d6ce38c58a1a93e9ff"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6e3543edc18553e31a3884af3cd7eea43d6c44532d8b9b16f3e743cdf6cfe6c5"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:914254849486e14aa931b0b3382cd16887f1507068ffba775cbdc5a55fe9ef19"}, - {file = "psycopg_binary-3.1.17-cp37-cp37m-win_amd64.whl", hash = "sha256:92fad8f1aa80a5ab316c0493dc6d1b54c1dba21937e43eea7296ff4a0ccc071e"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6d4f2e15d33ed4f9776fdf23683512d76f4e7825c4b80677e9e3ce6c1b193ff2"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fa26836ce074a1104249378727e1f239a01530f36bae16e77cf6c50968599b4"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54bcf2dfc0880bf13f38512d44b194c092794e4ee9e01d804bc6cd3eed9bfb7"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e28024204dc0c61094268c682041d2becfedfea2e3b46bed5f6138239304d98"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b1ec6895cab887b92c303565617f994c9b9db53befda81fa2a31b76fe8a3ab1"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:420c1eb1626539c261cf3fbe099998da73eb990f9ce1a34da7feda414012ea5f"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:83404a353240fdff5cfe9080665fdfdcaa2d4d0c5112e15b0a2fe2e59200ed57"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a0c4ba73f9e7721dd6cc3e6953016652dbac206f654229b7a1a8ac182b16e689"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f6898bf1ca5aa01115807643138e3e20ec603b17a811026bc4a49d43055720a7"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b40fa54a02825d3d6a8009d9a82a2b4fad80387acf2b8fd6d398fd2813cb2d9"}, - {file = "psycopg_binary-3.1.17-cp38-cp38-win_amd64.whl", hash = "sha256:78ebb43dca7d5b41eee543cd005ee5a0256cecc74d84acf0fab4f025997b837e"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02ac573f5a6e79bb6df512b3a6279f01f033bbd45c47186e8872fee45f6681d0"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:704f6393d758b12a4369887fe956b2a8c99e4aced839d9084de8e3f056015d40"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0340ef87a888fd940796c909e038426f4901046f61856598582a817162c64984"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a880e4113af3ab84d6a0991e3f85a2424924c8a182733ab8d964421df8b5190a"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93921178b9a40c60c26e47eb44970f88c49fe484aaa3bb7ec02bb8b514eab3d9"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a05400e9314fc30bc1364865ba9f6eaa2def42b5e7e67f71f9a4430f870023e"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e2cc2bbf37ff1cf11e8b871c294e3532636a3cf7f0c82518b7537158923d77b"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a343261701a8f63f0d8268f7fd32be40ffe28d24b65d905404ca03e7281f7bb5"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dceb3930ec426623c0cacc78e447a90882981e8c49d6fea8d1e48850e24a0170"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d613a23f8928f30acb2b6b2398cb7775ba9852e8968e15df13807ba0d3ebd565"}, - {file = "psycopg_binary-3.1.17-cp39-cp39-win_amd64.whl", hash = "sha256:d90c0531e9d591bde8cea04e75107fcddcc56811b638a34853436b23c9a3cb7d"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c323103dfa663b88204cf5f028e83c77d7a715f9b6f51d2bbc8184b99ddd90a"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:887f8d856c91510148be942c7acd702ccf761a05f59f8abc123c22ab77b5a16c"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d322ba72cde4ca2eefc2196dad9ad7e52451acd2f04e3688d590290625d0c970"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:489aa4fe5a0b653b68341e9e44af247dedbbc655326854aa34c163ef1bcb3143"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ff0948457bfa8c0d35c46e3a75193906d1c275538877ba65907fd67aa059ad"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b15e3653c82384b043d820fc637199b5c6a36b37fa4a4943e0652785bb2bad5d"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f8ff3bc08b43f36fdc24fedb86d42749298a458c4724fb588c4d76823ac39f54"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1729d0e3dfe2546d823841eb7a3d003144189d6f5e138ee63e5227f8b75276a5"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:13bcd3742112446037d15e360b27a03af4b5afcf767f5ee374ef8f5dd7571b31"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:320047e3d3554b857e16c2b6b615a85e0db6a02426f4d203a4594a2f125dfe57"}, + {file = "psycopg_binary-3.1.18-cp310-cp310-win_amd64.whl", hash = "sha256:888a72c2aca4316ca6d4a619291b805677bae99bba2f6e31a3c18424a48c7e4d"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e4de16a637ec190cbee82e0c2dc4860fed17a23a35f7a1e6dc479a5c6876722"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6432047b8b24ef97e3fbee1d1593a0faaa9544c7a41a2c67d1f10e7621374c83"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d684227ef8212e27da5f2aff9d4d303cc30b27ac1702d4f6881935549486dd5"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67284e2e450dc7a9e4d76e78c0bd357dc946334a3d410defaeb2635607f632cd"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9b6bd7fb5c6638cb32469674707649b526acfe786ba6d5a78ca4293d87bae4"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7121acc783c4e86d2d320a7fb803460fab158a7f0a04c5e8c5d49065118c1e73"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e28ff8f3de7b56588c2a398dc135fd9f157d12c612bd3daa7e6ba9872337f6f5"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c84a0174109f329eeda169004c7b7ca2e884a6305acab4a39600be67f915ed38"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:531381f6647fc267383dca88dbe8a70d0feff433a8e3d0c4939201fea7ae1b82"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b293e01057e63c3ac0002aa132a1071ce0fdb13b9ee2b6b45d3abdb3525c597d"}, + {file = "psycopg_binary-3.1.18-cp311-cp311-win_amd64.whl", hash = "sha256:780a90bcb69bf27a8b08bc35b958e974cb6ea7a04cdec69e737f66378a344d68"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:87dd9154b757a5fbf6d590f6f6ea75f4ad7b764a813ae04b1d91a70713f414a1"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f876ebbf92db70125f6375f91ab4bc6b27648aa68f90d661b1fc5affb4c9731c"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d2f0cb45e4574f8b2fe7c6d0a0e2eb58903a4fd1fbaf60954fba82d595ab7"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd27f713f2e5ef3fd6796e66c1a5203a27a30ecb847be27a78e1df8a9a5ae68c"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c38a4796abf7380f83b1653c2711cb2449dd0b2e5aca1caa75447d6fa5179c69"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2f7f95746efd1be2dc240248cc157f4315db3fd09fef2adfcc2a76e24aa5741"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4085f56a8d4fc8b455e8f44380705c7795be5317419aa5f8214f315e4205d804"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2e2484ae835dedc80cdc7f1b1a939377dc967fed862262cfd097aa9f50cade46"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c2b039ae0c45eee4cd85300ef802c0f97d0afc78350946a5d0ec77dd2d7e834"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f54978c4b646dec77fefd8485fa82ec1a87807f334004372af1aaa6de9539a5"}, + {file = "psycopg_binary-3.1.18-cp312-cp312-win_amd64.whl", hash = "sha256:9ffcbbd389e486d3fd83d30107bbf8b27845a295051ccabde240f235d04ed921"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c76659ae29a84f2c14f56aad305dd00eb685bd88f8c0a3281a9a4bc6bd7d2aa7"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7afcd6f1d55992f26d9ff7b0bd4ee6b475eb43aa3f054d67d32e09f18b0065"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:639dd78ac09b144b0119076783cb64e1128cc8612243e9701d1503c816750b2e"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1cf59e0bb12e031a48bb628aae32df3d0c98fd6c759cb89f464b1047f0ca9c8"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e262398e5d51563093edf30612cd1e20fedd932ad0994697d7781ca4880cdc3d"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:59701118c7d8842e451f1e562d08e8708b3f5d14974eefbce9374badd723c4ae"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dea4a59da7850192fdead9da888e6b96166e90608cf39e17b503f45826b16f84"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4575da95fc441244a0e2ebaf33a2b2f74164603341d2046b5cde0a9aa86aa7e2"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:812726266ab96de681f2c7dbd6b734d327f493a78357fcc16b2ac86ff4f4e080"}, + {file = "psycopg_binary-3.1.18-cp37-cp37m-win_amd64.whl", hash = "sha256:3e7ce4d988112ca6c75765c7f24c83bdc476a6a5ce00878df6c140ca32c3e16d"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:02bd4da45d5ee9941432e2e9bf36fa71a3ac21c6536fe7366d1bd3dd70d6b1e7"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39242546383f6b97032de7af30edb483d237a0616f6050512eee7b218a2aa8ee"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d46ae44d66bf6058a812467f6ae84e4e157dee281bfb1cfaeca07dee07452e85"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad35ac7fd989184bf4d38a87decfb5a262b419e8ba8dcaeec97848817412c64a"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:247474af262bdd5559ee6e669926c4f23e9cf53dae2d34c4d991723c72196404"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ebecbf2406cd6875bdd2453e31067d1bd8efe96705a9489ef37e93b50dc6f09"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1859aeb2133f5ecdd9cbcee155f5e38699afc06a365f903b1512c765fd8d457e"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:da917f6df8c6b2002043193cb0d74cc173b3af7eb5800ad69c4e1fbac2a71c30"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9e24e7b6a68a51cc3b162d0339ae4e1263b253e887987d5c759652f5692b5efe"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e252d66276c992319ed6cd69a3ffa17538943954075051e992143ccbf6dc3d3e"}, + {file = "psycopg_binary-3.1.18-cp38-cp38-win_amd64.whl", hash = "sha256:5d6e860edf877d4413e4a807e837d55e3a7c7df701e9d6943c06e460fa6c058f"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eea5f14933177ffe5c40b200f04f814258cc14b14a71024ad109f308e8bad414"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:824a1bfd0db96cc6bef2d1e52d9e0963f5bf653dd5bc3ab519a38f5e6f21c299"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87e9eeb80ce8ec8c2783f29bce9a50bbcd2e2342a340f159c3326bf4697afa1"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91074f78a9f890af5f2c786691575b6b93a4967ad6b8c5a90101f7b8c1a91d9c"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e05f6825f8db4428782135e6986fec79b139210398f3710ed4aa6ef41473c008"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f68ac2364a50d4cf9bb803b4341e83678668f1881a253e1224574921c69868c"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7ac1785d67241d5074f8086705fa68e046becea27964267ab3abd392481d7773"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cd2a9f7f0d4dacc5b9ce7f0e767ae6cc64153264151f50698898c42cabffec0c"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:3e4b0bb91da6f2238dbd4fbb4afc40dfb4f045bb611b92fce4d381b26413c686"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:74e498586b72fb819ca8ea82107747d0cb6e00ae685ea6d1ab3f929318a8ce2d"}, + {file = "psycopg_binary-3.1.18-cp39-cp39-win_amd64.whl", hash = "sha256:d4422af5232699f14b7266a754da49dc9bcd45eba244cf3812307934cd5d6679"}, ] [[package]] name = "ptvsd" version = "4.3.2" description = "Remote debugging server for Python support in Visual Studio and Visual Studio Code" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" files = [ @@ -2027,7 +1881,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2039,7 +1892,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -2054,7 +1906,6 @@ tests = ["pytest"] name = "py-cpuinfo" version = "9.0.0" description = "Get CPU info with pure Python" -category = "dev" optional = false python-versions = "*" files = [ @@ -2066,7 +1917,6 @@ files = [ name = "pybtex" version = "0.24.0" description = "A BibTeX-compatible bibliography processor in Python" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" files = [ @@ -2086,7 +1936,6 @@ test = ["pytest"] name = "pybtex-docutils" version = "1.0.3" description = "A docutils backend for pybtex." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2102,7 +1951,6 @@ pybtex = ">=0.16" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2112,19 +1960,18 @@ files = [ [[package]] name = "pydantic" -version = "2.6.0" +version = "2.6.1" description = "Data validation using Python type hints" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"}, - {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"}, + {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, + {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.16.1" +pydantic-core = "2.16.2" typing-extensions = ">=4.6.1" [package.extras] @@ -2132,91 +1979,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.1" +version = "2.16.2" description = "" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"}, - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"}, - {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"}, - {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"}, - {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"}, - {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"}, - {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"}, - {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"}, - {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"}, - {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"}, - {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"}, - {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"}, - {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"}, - {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"}, - {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, + {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, + {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, + {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, + {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, + {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, + {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, + {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, + {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, + {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, + {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, + {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, + {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, + {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, ] [package.dependencies] @@ -2226,7 +2072,6 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" name = "pydantic-settings" version = "2.1.0" description = "Settings management using Pydantic" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2242,7 +2087,6 @@ python-dotenv = ">=0.21.0" name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2258,7 +2102,6 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2276,7 +2119,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pyproject-hooks" version = "1.0.0" description = "Wrappers to call pyproject.toml-based build backend hooks." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2289,14 +2131,13 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "pytest" -version = "7.4.4" +version = "8.0.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"}, + {file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"}, ] [package.dependencies] @@ -2304,7 +2145,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" +pluggy = ">=1.3.0,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] @@ -2314,7 +2155,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-benchmark" version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2335,7 +2175,6 @@ histogram = ["pygal", "pygaljs"] name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2350,26 +2189,10 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] -[[package]] -name = "pytest-lazy-fixture" -version = "0.6.3" -description = "It helps to use fixtures in pytest.mark.parametrize" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pytest-lazy-fixture-0.6.3.tar.gz", hash = "sha256:0e7d0c7f74ba33e6e80905e9bfd81f9d15ef9a790de97993e34213deb5ad10ac"}, - {file = "pytest_lazy_fixture-0.6.3-py3-none-any.whl", hash = "sha256:e0b379f38299ff27a653f03eaa69b08a6fd4484e46fd1c9907d984b9f9daeda6"}, -] - -[package.dependencies] -pytest = ">=3.2.5" - [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -2384,7 +2207,6 @@ six = ">=1.5" name = "python-dotenv" version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2397,21 +2219,19 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2023.4" +version = "2024.1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.4-py2.py3-none-any.whl", hash = "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a"}, - {file = "pytz-2023.4.tar.gz", hash = "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "dev" optional = false python-versions = "*" files = [ @@ -2435,7 +2255,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2444,6 +2263,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2451,8 +2271,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_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"}, @@ -2469,6 +2296,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2476,6 +2304,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2485,7 +2314,6 @@ files = [ name = "pyzmq" version = "25.1.2" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2591,7 +2419,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "referencing" version = "0.33.0" description = "JSON Referencing + Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2607,7 +2434,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2629,7 +2455,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rich" version = "13.7.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2648,7 +2473,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.17.1" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2755,36 +2579,34 @@ files = [ [[package]] name = "ruff" -version = "0.1.15" +version = "0.2.1" description = "An extremely fast Python linter and code formatter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, + {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, + {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, + {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, + {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, + {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, ] [[package]] name = "setuptools" version = "69.0.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2801,7 +2623,6 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2813,7 +2634,6 @@ files = [ name = "snakeviz" version = "2.2.0" description = "A web-based viewer for Python profiler output" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2828,7 +2648,6 @@ tornado = ">=2.0" name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2840,7 +2659,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -2852,7 +2670,6 @@ files = [ name = "sphinx" version = "7.2.6" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2887,7 +2704,6 @@ test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools name = "sphinx-mdinclude" version = "0.5.3" description = "Markdown extension for Sphinx" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2904,7 +2720,6 @@ pygments = ">=2.8" name = "sphinx-multiversion" version = "0.2.4" description = "Add support for multiple versions to sphinx" -category = "dev" optional = false python-versions = "*" files = [ @@ -2917,19 +2732,18 @@ sphinx = ">=2.1" [[package]] name = "sphinx-rtd-theme" -version = "1.3.0" +version = "2.0.0" description = "Read the Docs theme for Sphinx" -category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, - {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, + {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, + {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, ] [package.dependencies] -docutils = "<0.19" -sphinx = ">=1.6,<8" +docutils = "<0.21" +sphinx = ">=5,<8" sphinxcontrib-jquery = ">=4,<5" [package.extras] @@ -2939,7 +2753,6 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] name = "sphinxcontrib-applehelp" version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2954,27 +2767,25 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-bibtex" -version = "2.5.0" +version = "2.6.2" description = "Sphinx extension for BibTeX style citations." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, - {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, + {file = "sphinxcontrib-bibtex-2.6.2.tar.gz", hash = "sha256:f487af694336f28bfb7d6a17070953a7d264bec43000a2379724274f5f8d70ae"}, + {file = "sphinxcontrib_bibtex-2.6.2-py3-none-any.whl", hash = "sha256:10d45ebbb19207c5665396c9446f8012a79b8a538cb729f895b5910ab2d0b2da"}, ] [package.dependencies] -docutils = ">=0.8" +docutils = ">=0.8,<0.18.dev0 || >=0.20.dev0" pybtex = ">=0.24" pybtex-docutils = ">=1.0.0" -Sphinx = ">=2.1" +Sphinx = ">=3.5" [[package]] name = "sphinxcontrib-devhelp" version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2991,7 +2802,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3008,7 +2818,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-httpdomain" version = "1.8.1" description = "Sphinx domain for documenting HTTP APIs" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -3024,7 +2833,6 @@ Sphinx = ">=1.6" name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -3039,7 +2847,6 @@ Sphinx = ">=1.8" name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -3054,7 +2861,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-openapi" version = "0.8.3" description = "OpenAPI (fka Swagger) spec renderer for Sphinx" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3075,7 +2881,6 @@ sphinxcontrib-httpdomain = ">=1.5.0" name = "sphinxcontrib-qthelp" version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3092,7 +2897,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3109,7 +2913,6 @@ test = ["pytest"] name = "sqlalchemy" version = "2.0.25" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3198,7 +3001,6 @@ sqlcipher = ["sqlcipher3_binary"] name = "sqlalchemy-utils" version = "0.41.1" description = "Various utility functions for SQLAlchemy." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3227,7 +3029,6 @@ url = ["furl (>=0.4.1)"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -3245,27 +3046,25 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.32.0.post1" +version = "0.36.3" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.32.0.post1-py3-none-any.whl", hash = "sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09"}, - {file = "starlette-0.32.0.post1.tar.gz", hash = "sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02"}, + {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, + {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, ] [package.dependencies] anyio = ">=3.4.0,<5" [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -3277,7 +3076,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3289,7 +3087,6 @@ files = [ name = "toolz" version = "0.12.1" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3301,7 +3098,6 @@ files = [ name = "tornado" version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">= 3.8" files = [ @@ -3322,7 +3118,6 @@ files = [ name = "traitlets" version = "5.14.1" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3338,7 +3133,6 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, name = "typeguard" version = "4.1.5" description = "Run-time type checker for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3357,7 +3151,6 @@ test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] name = "typer" version = "0.9.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3377,21 +3170,19 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. [[package]] name = "types-pytz" -version = "2023.4.0.20240130" +version = "2024.1.0.20240203" description = "Typing stubs for pytz" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "types-pytz-2023.4.0.20240130.tar.gz", hash = "sha256:33676a90bf04b19f92c33eec8581136bea2f35ddd12759e579a624a006fd387a"}, - {file = "types_pytz-2023.4.0.20240130-py3-none-any.whl", hash = "sha256:6ce76a9f8fd22bd39b01a59c35bfa2db39b60d11a2f77145e97b730de7e64fe0"}, + {file = "types-pytz-2024.1.0.20240203.tar.gz", hash = "sha256:c93751ee20dfc6e054a0148f8f5227b9a00b79c90a4d3c9f464711a73179c89e"}, + {file = "types_pytz-2024.1.0.20240203-py3-none-any.whl", hash = "sha256:9679eef0365db3af91ef7722c199dbb75ee5c1b67e3c4dd7bfbeb1b8a71c21a3"}, ] [[package]] name = "types-toml" version = "0.10.8.7" description = "Typing stubs for toml" -category = "dev" optional = false python-versions = "*" files = [ @@ -3403,7 +3194,6 @@ files = [ name = "typing-extensions" version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3415,7 +3205,6 @@ files = [ name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -3431,7 +3220,6 @@ typing-extensions = ">=3.7.4" name = "tzdata" version = "2023.4" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -3443,7 +3231,6 @@ files = [ name = "urllib3" version = "2.2.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3459,14 +3246,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.23.2" +version = "0.27.0.post1" description = "The lightning-fast ASGI server." -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, - {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, + {file = "uvicorn-0.27.0.post1-py3-none-any.whl", hash = "sha256:4b85ba02b8a20429b9b205d015cbeb788a12da527f731811b643fd739ef90d5f"}, + {file = "uvicorn-0.27.0.post1.tar.gz", hash = "sha256:54898fcd80c13ff1cd28bf77b04ec9dbd8ff60c5259b499b4b12bb0917f22907"}, ] [package.dependencies] @@ -3477,7 +3263,7 @@ httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standar python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} @@ -3488,7 +3274,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "uvloop" version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -3533,7 +3318,6 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" name = "virtualenv" version = "20.25.0" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3554,7 +3338,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchfiles" version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3642,7 +3425,6 @@ anyio = ">=3.0.0" name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -3654,7 +3436,6 @@ files = [ name = "websockets" version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3736,7 +3517,6 @@ files = [ name = "wrapt" version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3816,7 +3596,6 @@ files = [ name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3831,4 +3610,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.12" -content-hash = "a6ba252d7245552ae323842f7c06ce2e2c6f6863fb17487f62eb904a8156c091" +content-hash = "416b785a80d0fd5793315d6edbe3889616e382e7b8549f62cdc63282217b7caf" diff --git a/pyproject.toml b/pyproject.toml index 0eb3a277..a2653373 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,23 +17,23 @@ documentation = "https://docs.ece.iiasa.ac.at/projects/ixmp4" [tool.poetry.dependencies] PyJWT = "^2.4.0" -SQLAlchemy = { extras = ["mypy"], version = "^2.0.22" } +SQLAlchemy = {extras = ["mypy"], version = "^2.0.25"} SQLAlchemy-Utils = "^0.41.1" -alembic = "^1.12.1" -dask = "^2023.10.1" -fastapi = "^0.108.0" -httpx = { extras = ["http2"], version = "^0.25.0" } +alembic = "^1.13.1" +dask = "^2024.1.1" +fastapi = "^0.109.0" +httpx = {extras = ["http2"], version = "^0.26.0"} openpyxl = "^3.0.9" -pandas = "^2.1.2" -pandera = "^0.17.0" -pydantic = "^2.4.0" -python = ">=3.10, <3.12" -python-dotenv = "^1.0.0" +pandas = "~2.1.2" +pandera = "^0.18.0" +pydantic = "^2.5.3" +python = ">=3.10, <3.13" +python-dotenv = "^1.0.1" requests = "^2.27.1" typer = "^0.9.0" toml = "^0.10.2" -psycopg = { extras = ["binary"], version = "^3.1.10" } -pydantic-settings = "^2.0.3" +psycopg = {extras = ["binary"], version = "^3.1.17"} +pydantic-settings = "^2.1.0" rich = "^13.7.0" [tool.poetry.group.docs] @@ -42,8 +42,8 @@ optional = true [tool.poetry.group.docs.dependencies] sphinx = "^7.2.6" sphinx-multiversion = "^0.2.4" -sphinx-rtd-theme = "^1.1.1" -sphinxcontrib-bibtex = "^2.5.0" +sphinx-rtd-theme = "^2.0.0" +sphinxcontrib-bibtex = "^2.6.2" sphinxcontrib-openapi = "^0.8.3" [tool.poetry.group.server] @@ -51,31 +51,29 @@ optional = true [tool.poetry.group.server.dependencies] gunicorn = "^21.2.0" -uvicorn = { extras = ["standard"], version = "^0.23.2" } +uvicorn = {extras = ["standard"], version = "^0.27.0.post1"} [tool.poetry.group.dev] optional = true [tool.poetry.group.dev.dependencies] -black = "^23.10.1" ptvsd = "^4.3.2" -pytest = "^7.4.3" +pytest = "^8.0.0" pytest-benchmark = "^4.0.0" pytest-cov = "^4.1.0" -pytest-lazy-fixture = "^0.6.3" snakeviz = "^2.1.1" types-toml = "^0.10.8.7" build = "^1.0.3" -ruff = "^0.1.3" -pre-commit = "^3.5.0" -mypy = "^1.6.1" -pandas-stubs = "^2.0.3.230814" +ruff = "^0.2.1" +pre-commit = "^3.6.0" +mypy = "^1.8.0" +pandas-stubs = "^2.1.4.231227" [tool.poetry.group.tutorial] optional = true [tool.poetry.group.tutorial.dependencies] -ipykernel = "^6.26.0" +ipykernel = "^6.29.0" [tool.poetry.scripts] ixmp4 = "ixmp4.__main__:app" @@ -101,9 +99,6 @@ module = ["pandas", "uvicorn.workers", "sqlalchemy_utils"] ignore_missing_imports = true [tool.ruff] -select = ["C9", "E", "F", "I", "W"] -ignore = ["B008"] -per-file-ignores = { "__init__.py" = ["F401"] } exclude = [ ".git", "__pycache__", @@ -116,7 +111,14 @@ exclude = [ ] line-length = 88 -[tool.ruff.mccabe] +[tool.ruff.lint] +select = ["C9", "E", "F", "I", "W"] +ignore = ["B008"] + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] + +[tool.ruff.lint.mccabe] max-complexity = 10 [tool.poetry-dynamic-versioning] diff --git a/tests/api/test_model.py b/tests/api/test_model.py index b3bb91f9..32e33241 100644 --- a/tests/api/test_model.py +++ b/tests/api/test_model.py @@ -5,7 +5,8 @@ @api_platforms -def test_index_model(test_mp): +def test_index_model(test_mp, request): + test_mp = request.getfixturevalue(test_mp) table_endpoint = "iamc/models/?table=True" _, _ = create_iamc_query_test_data(test_mp) diff --git a/tests/api/test_pagination.py b/tests/api/test_pagination.py index c63c7143..bb7e1a8e 100644 --- a/tests/api/test_pagination.py +++ b/tests/api/test_pagination.py @@ -1,6 +1,7 @@ import pytest -from ..utils import gen_obj_nums, generated_api_platforms +from ..conftest import gen_obj_nums +from ..utils import generated_api_platforms @generated_api_platforms @@ -30,7 +31,8 @@ ), ], ) -def test_pagination(generated_mp, endpoint, filters, total): +def test_pagination(generated_mp, endpoint, filters, total, request): + generated_mp = request.getfixturevalue(generated_mp) client = generated_mp.backend.client offset, limit = None, None while offset is None or offset + limit < total: diff --git a/tests/api/test_region.py b/tests/api/test_region.py index 7123389a..4f3e698c 100644 --- a/tests/api/test_region.py +++ b/tests/api/test_region.py @@ -5,7 +5,8 @@ @api_platforms -def test_index_region(test_mp): +def test_index_region(test_mp, request): + test_mp = request.getfixturevalue(test_mp) table_endpoint = "iamc/regions/?table=True" test_triple, _ = create_iamc_query_test_data(test_mp) diff --git a/tests/api/test_scenario.py b/tests/api/test_scenario.py index 9b05a98d..58b28220 100644 --- a/tests/api/test_scenario.py +++ b/tests/api/test_scenario.py @@ -5,7 +5,8 @@ @api_platforms -def test_index_scenario(test_mp): +def test_index_scenario(test_mp, request): + test_mp = request.getfixturevalue(test_mp) table_endpoint = "iamc/scenarios/?table=True" _, _ = create_iamc_query_test_data(test_mp) diff --git a/tests/api/test_unit.py b/tests/api/test_unit.py index 289c7331..7e4c7c2a 100644 --- a/tests/api/test_unit.py +++ b/tests/api/test_unit.py @@ -5,7 +5,8 @@ @api_platforms -def test_index_region(test_mp): +def test_index_region(test_mp, request): + test_mp = request.getfixturevalue(test_mp) table_endpoint = "iamc/units/?table=True" _, test_triple = create_iamc_query_test_data(test_mp) diff --git a/tests/conftest.py b/tests/conftest.py index 2cd0a9ff..a87f0cc2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,8 +13,6 @@ from ixmp4.data.backend.db import PostgresTestBackend from ixmp4.data.generator import MockDataGenerator -from .utils import gen_obj_nums - TEST_DATA_BIG = None try: TEST_DATA_BIG = pd.read_csv("./tests/test-data/iamc-test-data_annual_big.csv") @@ -26,6 +24,13 @@ except FileNotFoundError: TEST_DATA_BIG = None # skip benchmark tests +SKIP_PGSQL_TESTS = False +try: + mp = Platform(_backend=PostgresTestBackend()) + mp.backend.close() +except OperationalError: + SKIP_PGSQL_TESTS = True + @pytest.fixture(scope="function") def test_data_big(): @@ -106,13 +111,7 @@ def test_sqlite_mp(): @pytest.fixture def test_pgsql_mp(): - try: - mp = Platform(_backend=PostgresTestBackend()) - except OperationalError as e: - pytest.skip( - f"Cannot connect to PostgreSQL database service, skipping test: {e}" - ) - + mp = Platform(_backend=PostgresTestBackend()) yield mp mp.backend.close() @@ -135,14 +134,8 @@ def test_sqlite_mp_generated(): @pytest.fixture(scope="module") -def test_pgsql_mp_generated(): - try: - mp = Platform(_backend=PostgresTestBackend()) - except OperationalError as e: - pytest.skip( - f"Cannot connect to PostgreSQL database service, skipping test: {e}" - ) - +def test_pgsql_mp_generated(request): + mp = Platform(_backend=PostgresTestBackend()) generate_mock_data(mp) yield mp mp.backend.close() @@ -158,6 +151,16 @@ def test_api_pgsql_mp_generated(test_pgsql_mp_generated): return Platform(_backend=RestTestBackend(test_pgsql_mp_generated.backend)) +gen_obj_nums = dict( + num_models=10, + num_runs=30, + num_regions=100, + num_variables=200, + num_units=50, + num_datapoints=10_000, +) + + def generate_mock_data(mp): gen = MockDataGenerator(mp, **gen_obj_nums) gen.generate() diff --git a/tests/core/test_iamc.py b/tests/core/test_iamc.py index 5f1d2fd0..c5a6deef 100644 --- a/tests/core/test_iamc.py +++ b/tests/core/test_iamc.py @@ -7,12 +7,14 @@ @all_platforms -def test_run_annual_datapoints_raw(test_mp, test_data_annual): +def test_run_annual_datapoints_raw(test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) do_run_datapoints(test_mp, test_data_annual, True, DataPoint.Type.ANNUAL) @all_platforms -def test_run_annual_datapoints_iamc(test_mp, test_data_annual): +def test_run_annual_datapoints_iamc(test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) # convert to test data to standard IAMC format df = test_data_annual.rename(columns={"step_year": "year"}) do_run_datapoints(test_mp, df, False) @@ -20,50 +22,62 @@ def test_run_annual_datapoints_iamc(test_mp, test_data_annual): @all_platforms @pytest.mark.parametrize("_type", (DataPoint.Type.CATEGORICAL, DataPoint.Type.DATETIME)) -def test_run_inconsistent_annual_raises(test_mp, test_data_annual, _type): +def test_run_inconsistent_annual_raises(test_mp, test_data_annual, _type, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(SchemaError): do_run_datapoints(test_mp, test_data_annual, True, _type) @all_platforms -def test_run_categorical_datapoints_raw(test_mp, test_data_categorical): +def test_run_categorical_datapoints_raw(test_mp, test_data_categorical, request): + test_mp = request.getfixturevalue(test_mp) do_run_datapoints(test_mp, test_data_categorical, True, DataPoint.Type.CATEGORICAL) @all_platforms @pytest.mark.parametrize("_type", (DataPoint.Type.ANNUAL, DataPoint.Type.DATETIME)) -def test_run_inconsistent_categorical_raises(test_mp, test_data_categorical, _type): +def test_run_inconsistent_categorical_raises( + test_mp, test_data_categorical, _type, request +): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(SchemaError): do_run_datapoints(test_mp, test_data_categorical, True, _type) @all_platforms -def test_run_datetime_datapoints_raw(test_mp, test_data_datetime): +def test_run_datetime_datapoints_raw(test_mp, test_data_datetime, request): + test_mp = request.getfixturevalue(test_mp) do_run_datapoints(test_mp, test_data_datetime, True, DataPoint.Type.DATETIME) @all_platforms @pytest.mark.parametrize("_type", (DataPoint.Type.ANNUAL, DataPoint.Type.CATEGORICAL)) -def test_run_inconsistent_datetime_type_raises(test_mp, test_data_datetime, _type): +def test_run_inconsistent_datetime_type_raises( + test_mp, test_data_datetime, _type, request +): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(SchemaError): do_run_datapoints(test_mp, test_data_datetime, True, _type) @all_platforms -def test_unit_dimensionless_raw(test_mp, test_data_annual): +def test_unit_dimensionless_raw(test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) test_data_annual.loc[0, "unit"] = "" do_run_datapoints(test_mp, test_data_annual, True, DataPoint.Type.ANNUAL) @all_platforms -def test_unit_as_string_dimensionless_raises(test_mp, test_data_annual): +def test_unit_as_string_dimensionless_raises(test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) test_data_annual.loc[0, "unit"] = "dimensionless" with pytest.raises(ValueError, match="Unit name 'dimensionless' is reserved,"): do_run_datapoints(test_mp, test_data_annual, DataPoint.Type.ANNUAL) @all_platforms -def test_run_tabulate_with_filter_raw(test_mp, test_data_annual): +def test_run_tabulate_with_filter_raw(test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) # Filter run directly add_regions(test_mp, test_data_annual["region"].unique()) add_units(test_mp, test_data_annual["unit"].unique()) diff --git a/tests/core/test_indexset.py b/tests/core/test_indexset.py index fab4f3ca..46aabbed 100644 --- a/tests/core/test_indexset.py +++ b/tests/core/test_indexset.py @@ -35,7 +35,8 @@ def df_from_list(indexsets: list): @all_platforms class TestCoreIndexSet: - def test_create_indexset(self, test_mp): + def test_create_indexset(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") indexset_1 = run.optimization.indexsets.create("IndexSet 1") assert indexset_1.id == 1 @@ -47,7 +48,8 @@ def test_create_indexset(self, test_mp): with pytest.raises(IndexSet.NotUnique): _ = run.optimization.indexsets.create("IndexSet 1") - def test_get_indexset(self, test_mp): + def test_get_indexset(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") _ = run.optimization.indexsets.create("IndexSet 1") indexset = run.optimization.indexsets.get("IndexSet 1") @@ -57,7 +59,8 @@ def test_get_indexset(self, test_mp): with pytest.raises(IndexSet.NotFound): _ = run.optimization.indexsets.get("Foo") - def test_add_elements(self, test_mp): + def test_add_elements(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") test_elements = ["foo", "bar"] indexset_1 = run.optimization.indexsets.create("IndexSet 1") @@ -79,7 +82,8 @@ def test_add_elements(self, test_mp): assert indexset_3.elements != indexset_4.elements assert len(indexset_3.elements) == len(indexset_4.elements) - def test_list_indexsets(self, test_mp): + def test_list_indexsets(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") # Per default, list() lists only `default` version runs: run.set_as_default() @@ -97,7 +101,8 @@ def test_list_indexsets(self, test_mp): ] assert not (set(expected_id) ^ set(list_id)) - def test_tabulate_indexsets(self, test_mp): + def test_tabulate_indexsets(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") # Per default, tabulate() lists only `default` version runs: run.set_as_default() @@ -113,7 +118,8 @@ def test_tabulate_indexsets(self, test_mp): result = run.optimization.indexsets.tabulate(name="Indexset 2") pdt.assert_frame_equal(expected, result) - def test_indexset_docs(self, test_mp): + def test_indexset_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") indexset_1 = run.optimization.indexsets.create("IndexSet 1") docs = "Documentation of IndexSet 1" diff --git a/tests/core/test_meta.py b/tests/core/test_meta.py index e1a157af..d88e63a6 100644 --- a/tests/core/test_meta.py +++ b/tests/core/test_meta.py @@ -9,7 +9,8 @@ @all_platforms -def test_run_meta(test_mp): +def test_run_meta(test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.runs.create("Model 1", "Scenario 1") run1.set_as_default() @@ -110,8 +111,9 @@ def test_run_meta(test_mp): (np.float64(1.9), 1.9, np.float64(13.9), 13.9), ], ) -def test_run_meta_numpy(test_mp, npvalue1, pyvalue1, npvalue2, pyvalue2): +def test_run_meta_numpy(test_mp, npvalue1, pyvalue1, npvalue2, pyvalue2, request): """Test that numpy types are cast to simple types""" + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.runs.create("Model", "Scenario") run1.set_as_default() @@ -134,8 +136,9 @@ def test_run_meta_numpy(test_mp, npvalue1, pyvalue1, npvalue2, pyvalue2): @all_platforms @pytest.mark.parametrize("nonevalue", (None, np.nan)) -def test_run_meta_none(test_mp, nonevalue): +def test_run_meta_none(test_mp, nonevalue, request): """Test that None-values are handled correctly""" + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.runs.create("Model", "Scenario") run1.set_as_default() @@ -156,7 +159,8 @@ def test_run_meta_none(test_mp, nonevalue): @all_platforms -def test_platform_meta_empty(test_mp): +def test_platform_meta_empty(test_mp, request): """Test that an empty dataframe is returned if there are no scenarios""" + test_mp = request.getfixturevalue(test_mp) exp = pd.DataFrame([], columns=["model", "scenario", "version", "key", "value"]) pdt.assert_frame_equal(test_mp.meta.tabulate(), exp) diff --git a/tests/core/test_model.py b/tests/core/test_model.py index d211c022..4ba81ffb 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -21,19 +21,22 @@ def df_from_list(models): @all_platforms class TestCoreModel: - def test_retrieve_model(self, test_mp): + def test_retrieve_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model1 = test_mp.models.create("Model") model2 = test_mp.models.get("Model") assert model1.id == model2.id - def test_model_unqiue(self, test_mp): + def test_model_unqiue(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.models.create("Model") with pytest.raises(Model.NotUnique): test_mp.models.create("Model") - def test_list_model(self, test_mp): + def test_list_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) models = create_testcase_models(test_mp) model, _ = models @@ -45,7 +48,8 @@ def test_list_model(self, test_mp): b = [m.id for m in test_mp.models.list(name="Model")] assert not (set(a) ^ set(b)) - def test_tabulate_model(self, test_mp): + def test_tabulate_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) models = create_testcase_models(test_mp) model, _ = models @@ -57,7 +61,8 @@ def test_tabulate_model(self, test_mp): b = test_mp.models.tabulate(name="Model") assert_unordered_equality(a, b, check_dtype=False) - def test_retrieve_docs(self, test_mp): + def test_retrieve_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.models.create("Model") docs_model1 = test_mp.models.set_docs("Model", "Description of test Model") docs_model2 = test_mp.models.get_docs("Model") @@ -71,7 +76,8 @@ def test_retrieve_docs(self, test_mp): assert test_mp.models.get_docs("Model2") == model2.docs - def test_delete_docs(self, test_mp): + def test_delete_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model = test_mp.models.create("Model") model.docs = "Description of test Model" model.docs = None diff --git a/tests/core/test_region.py b/tests/core/test_region.py index 91a52a48..abb27619 100644 --- a/tests/core/test_region.py +++ b/tests/core/test_region.py @@ -21,7 +21,8 @@ def df_from_list(regions): @all_platforms class TestCoreRegion: - def test_delete_region(self, test_mp, test_data_annual): + def test_delete_region(self, test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) reg1 = test_mp.regions.create("Test 1", hierarchy="default") reg2 = test_mp.regions.create("Test 2", hierarchy="default") reg3 = test_mp.regions.create("Test 3", hierarchy="default") @@ -44,7 +45,8 @@ def test_delete_region(self, test_mp, test_data_annual): with pytest.raises(Region.DeletionPrevented): test_mp.regions.delete("World") - def test_region_has_hierarchy(self, test_mp): + def test_region_has_hierarchy(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(TypeError): test_mp.regions.create("Test") @@ -53,7 +55,8 @@ def test_region_has_hierarchy(self, test_mp): assert reg1.id == reg2.id - def test_get_region(self, test_mp): + def test_get_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) reg1 = test_mp.regions.create("Test", hierarchy="default") reg2 = test_mp.regions.get("Test") @@ -62,13 +65,15 @@ def test_get_region(self, test_mp): with pytest.raises(Region.NotFound): test_mp.regions.get("Does not exist") - def test_region_unique(self, test_mp): + def test_region_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.regions.create("Test", hierarchy="default") with pytest.raises(Region.NotUnique): test_mp.regions.create("Test", hierarchy="other") - def test_region_unknown(self, test_mp, test_data_annual): + def test_region_unknown(self, test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) add_regions(test_mp, test_data_annual["region"].unique()) add_units(test_mp, test_data_annual["unit"].unique()) @@ -78,7 +83,8 @@ def test_region_unknown(self, test_mp, test_data_annual): with pytest.raises(Region.NotFound): run.iamc.add(test_data_annual, type=DataPoint.Type.ANNUAL) - def test_list_region(self, test_mp): + def test_list_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) regions = create_testcase_regions(test_mp) reg, other = regions @@ -90,7 +96,8 @@ def test_list_region(self, test_mp): b = [r.id for r in test_mp.regions.list(hierarchy="other")] assert not (set(a) ^ set(b)) - def test_tabulate_region(self, test_mp): + def test_tabulate_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) regions = create_testcase_regions(test_mp) _, other = regions @@ -102,7 +109,8 @@ def test_tabulate_region(self, test_mp): b = test_mp.regions.tabulate(hierarchy="other") assert_unordered_equality(a, b, check_dtype=False) - def test_retrieve_docs(self, test_mp): + def test_retrieve_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.regions.create("Region", "Hierarchy") docs_region1 = test_mp.regions.set_docs("Region", "Description of test Region") docs_region2 = test_mp.regions.get_docs("Region") @@ -117,7 +125,8 @@ def test_retrieve_docs(self, test_mp): assert test_mp.regions.get_docs("Region2") == region2.docs - def test_delete_docs(self, test_mp): + def test_delete_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region = test_mp.regions.create("Region", "Hierarchy") region.docs = "Description of test region" region.docs = None diff --git a/tests/core/test_run.py b/tests/core/test_run.py index b79d5e85..15db84e8 100644 --- a/tests/core/test_run.py +++ b/tests/core/test_run.py @@ -20,12 +20,14 @@ def _expected_runs_table(*row_default): @all_platforms class TestCoreRun: - def test_run_notfound(self, test_mp): + def test_run_notfound(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) # no Run with that model and scenario name exists with pytest.raises(Run.NotFound): _ = test_mp.runs.get("Unknown Model", "Unknown Scenario", version=1) - def test_run_versions(self, test_mp): + def test_run_versions(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.runs.create("Model", "Scenario") run2 = test_mp.runs.create("Model", "Scenario") diff --git a/tests/core/test_scalar.py b/tests/core/test_scalar.py index fc70bea4..430b57d2 100644 --- a/tests/core/test_scalar.py +++ b/tests/core/test_scalar.py @@ -34,7 +34,8 @@ def df_from_list(scalars: list): @all_platforms class TestCoreScalar: - def test_create_scalar(self, test_mp): + def test_create_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") unit = test_mp.units.create("Test Unit") scalar_1 = run.optimization.scalars.create( @@ -61,7 +62,8 @@ def test_create_scalar(self, test_mp): scalar_3 = run.optimization.scalars.create("Scalar 3", value=1) assert scalar_3.unit.name == "dimensionless" - def test_get_scalar(self, test_mp): + def test_get_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") unit = test_mp.units.create("Test Unit") scalar = run.optimization.scalars.create("Scalar", value=10, unit=unit.name) @@ -74,7 +76,8 @@ def test_get_scalar(self, test_mp): with pytest.raises(Scalar.NotFound): _ = run.optimization.scalars.get("Foo") - def test_update_scalar(self, test_mp): + def test_update_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") unit = test_mp.units.create("Test Unit") unit2 = test_mp.units.create("Test Unit 2") @@ -96,7 +99,8 @@ def test_update_scalar(self, test_mp): assert scalar.value == result.value == 30 assert scalar.unit.id == result.unit.id == 1 - def test_list_scalars(self, test_mp): + def test_list_scalars(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") # Per default, list() lists only `default` version runs: run.set_as_default() @@ -116,7 +120,8 @@ def test_list_scalars(self, test_mp): ] assert not (set(expected_id) ^ set(list_id)) - def test_tabulate_scalars(self, test_mp): + def test_tabulate_scalars(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") # Per default, tabulate() lists only `default` version runs: run.set_as_default() @@ -131,7 +136,8 @@ def test_tabulate_scalars(self, test_mp): result = run.optimization.scalars.tabulate(name="Scalar 2") assert_unordered_equality(expected, result, check_dtype=False) - def test_scalar_docs(self, test_mp): + def test_scalar_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") unit = test_mp.units.create("Test Unit") scalar = run.optimization.scalars.create("Scalar 1", value=4, unit=unit.name) diff --git a/tests/core/test_scenario.py b/tests/core/test_scenario.py index bb06b9fb..b2151960 100644 --- a/tests/core/test_scenario.py +++ b/tests/core/test_scenario.py @@ -21,19 +21,22 @@ def df_from_list(scenarios): @all_platforms class TestCoreScenario: - def test_retrieve_scenario(self, test_mp): + def test_retrieve_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario1 = test_mp.scenarios.create("Scenario") scenario2 = test_mp.scenarios.get("Scenario") assert scenario1.id == scenario2.id - def test_scenario_unqiue(self, test_mp): + def test_scenario_unqiue(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.scenarios.create("Scenario") with pytest.raises(Scenario.NotUnique): test_mp.scenarios.create("Scenario") - def test_list_scenario(self, test_mp): + def test_list_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenarios = create_testcase_scenarios(test_mp) scenario, _ = scenarios @@ -45,7 +48,8 @@ def test_list_scenario(self, test_mp): b = [s.id for s in test_mp.scenarios.list(name="Scenario")] assert not (set(a) ^ set(b)) - def test_tabulate_scenario(self, test_mp): + def test_tabulate_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenarios = create_testcase_scenarios(test_mp) scenario, _ = scenarios @@ -57,7 +61,8 @@ def test_tabulate_scenario(self, test_mp): b = test_mp.scenarios.tabulate(name="Scenario") assert_unordered_equality(a, b, check_dtype=False) - def test_retrieve_docs(self, test_mp): + def test_retrieve_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.scenarios.create("Scenario") docs_scenario1 = test_mp.scenarios.set_docs( "Scenario", "Description of test Scenario" @@ -74,7 +79,8 @@ def test_retrieve_docs(self, test_mp): assert test_mp.scenarios.get_docs("Scenario2") == scenario2.docs - def test_delete_docs(self, test_mp): + def test_delete_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario = test_mp.scenarios.create("Scenario") scenario.docs = "Description of test Scenario" scenario.docs = None diff --git a/tests/core/test_unit.py b/tests/core/test_unit.py index 302121c2..2515923f 100644 --- a/tests/core/test_unit.py +++ b/tests/core/test_unit.py @@ -22,7 +22,8 @@ def df_from_list(units): @all_platforms class TestCoreUnit: - def test_delete_unit(self, test_mp, test_data_annual): + def test_delete_unit(self, test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.units.create("Test 1") unit2 = test_mp.units.create("Test 2") unit3 = test_mp.units.create("Test 3") @@ -45,25 +46,29 @@ def test_delete_unit(self, test_mp, test_data_annual): with pytest.raises(Unit.DeletionPrevented): test_mp.units.delete("EJ/yr") - def test_retrieve_unit(self, test_mp): + def test_retrieve_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.units.create("Test") unit2 = test_mp.units.get("Test") assert unit1.id == unit2.id - def test_unit_unqiue(self, test_mp): + def test_unit_unqiue(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.units.create("Test") with pytest.raises(Unit.NotUnique): test_mp.units.create("Test") - def test_unit_dimensionless(self, test_mp): + def test_unit_dimensionless(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.units.create("") unit2 = test_mp.units.get("") assert unit1.id == unit2.id - def test_unit_illegal_names(self, test_mp): + def test_unit_illegal_names(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(ValueError, match="Unit name 'dimensionless' is reserved,"): test_mp.units.create("dimensionless") @@ -72,7 +77,8 @@ def test_unit_illegal_names(self, test_mp): ): test_mp.units.create(" ") - def test_unit_unknown(self, test_mp, test_data_annual): + def test_unit_unknown(self, test_mp, test_data_annual, request): + test_mp = request.getfixturevalue(test_mp) add_regions(test_mp, test_data_annual["region"].unique()) add_units(test_mp, test_data_annual["unit"].unique()) @@ -82,7 +88,8 @@ def test_unit_unknown(self, test_mp, test_data_annual): with pytest.raises(Unit.NotFound): run.iamc.add(test_data_annual, type=DataPoint.Type.ANNUAL) - def test_list_unit(self, test_mp): + def test_list_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) units = create_testcase_units(test_mp) unit, _ = units @@ -94,7 +101,8 @@ def test_list_unit(self, test_mp): b = [u.id for u in test_mp.units.list(name="Test")] assert not (set(a) ^ set(b)) - def test_tabulate_unit(self, test_mp): + def test_tabulate_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) units = create_testcase_units(test_mp) unit, _ = units @@ -106,7 +114,8 @@ def test_tabulate_unit(self, test_mp): b = test_mp.units.tabulate(name="Test") assert_unordered_equality(a, b, check_dtype=False) - def test_retrieve_docs(self, test_mp): + def test_retrieve_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.units.create("Unit") docs_unit1 = test_mp.units.set_docs("Unit", "Description of test Unit") docs_unit2 = test_mp.units.get_docs("Unit") @@ -121,7 +130,8 @@ def test_retrieve_docs(self, test_mp): assert test_mp.units.get_docs("Unit2") == unit2.docs - def test_delete_docs(self, test_mp): + def test_delete_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit = test_mp.units.create("Unit") unit.docs = "Description of test Unit" unit.docs = None diff --git a/tests/core/test_variable.py b/tests/core/test_variable.py index cc9f95c9..56eee36d 100644 --- a/tests/core/test_variable.py +++ b/tests/core/test_variable.py @@ -39,7 +39,8 @@ def df_from_list(iamc_variables): @all_platforms class TestCoreVariable: - def test_retrieve_iamc_variable(self, test_mp): + def test_retrieve_iamc_variable(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) iamc_variable1 = test_mp.iamc.variables.create("IAMC Variable") test_mp.regions.create("Region", "default") test_mp.units.create("Unit") @@ -58,13 +59,15 @@ def test_retrieve_iamc_variable(self, test_mp): assert iamc_variable1.id == iamc_variable2.id - def test_iamc_variable_unqiue(self, test_mp): + def test_iamc_variable_unqiue(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.iamc.variables.create("IAMC Variable") with pytest.raises(Variable.NotUnique): test_mp.iamc.variables.create("IAMC Variable") - def test_list_iamc_variable(self, test_mp): + def test_list_iamc_variable(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) iamc_variables = create_testcase_iamc_variables(test_mp) iamc_variable, _ = iamc_variables @@ -76,7 +79,8 @@ def test_list_iamc_variable(self, test_mp): b = [v.id for v in test_mp.iamc.variables.list(name="IAMC Variable")] assert not (set(a) ^ set(b)) - def test_tabulate_iamc_variable(self, test_mp): + def test_tabulate_iamc_variable(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) iamc_variables = create_testcase_iamc_variables(test_mp) iamc_variable, _ = iamc_variables @@ -88,7 +92,8 @@ def test_tabulate_iamc_variable(self, test_mp): b = test_mp.iamc.variables.tabulate(name="IAMC Variable") assert_unordered_equality(a, b, check_dtype=False) - def test_retrieve_docs(self, test_mp): + def test_retrieve_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) _, iamc_variable2 = create_testcase_iamc_variables(test_mp) docs_iamc_variable1 = test_mp.iamc.variables.set_docs( "IAMC Variable", "Description of test IAMC Variable" @@ -103,7 +108,8 @@ def test_retrieve_docs(self, test_mp): assert test_mp.iamc.variables.get_docs("IAMC Variable 2") == iamc_variable2.docs - def test_delete_docs(self, test_mp): + def test_delete_docs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) iamc_variable, _ = create_testcase_iamc_variables(test_mp) iamc_variable.docs = "Description of test IAMC Variable" iamc_variable.docs = None diff --git a/tests/data/test_docs.py b/tests/data/test_docs.py index 8450583c..12f19021 100644 --- a/tests/data/test_docs.py +++ b/tests/data/test_docs.py @@ -7,14 +7,16 @@ @all_platforms class TestDataDocs: - def test_get_and_set_modeldocs(self, test_mp): + def test_get_and_set_modeldocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model = test_mp.backend.models.create("Model") docs_model = test_mp.backend.models.docs.set(model.id, "Description of Model") docs_model1 = test_mp.backend.models.docs.get(model.id) assert docs_model == docs_model1 - def test_change_empty_modeldocs(self, test_mp): + def test_change_empty_modeldocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model = test_mp.backend.models.create("Model") with pytest.raises(Docs.NotFound): @@ -32,7 +34,8 @@ def test_change_empty_modeldocs(self, test_mp): assert test_mp.backend.models.docs.get(model.id) == docs_model2 - def test_delete_modeldocs(self, test_mp): + def test_delete_modeldocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model = test_mp.backend.models.create("Model") docs_model = test_mp.backend.models.docs.set( model.id, "Description of test Model" @@ -45,7 +48,8 @@ def test_delete_modeldocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.models.docs.get(model.id) - def test_get_and_set_regiondocs(self, test_mp): + def test_get_and_set_regiondocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region = test_mp.backend.regions.create("Region", "Hierarchy") docs_region = test_mp.backend.regions.docs.set( region.id, "Description of test Region" @@ -54,7 +58,8 @@ def test_get_and_set_regiondocs(self, test_mp): assert docs_region == docs_region1 - def test_change_empty_regiondocs(self, test_mp): + def test_change_empty_regiondocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region = test_mp.backend.regions.create("Region", "Hierarchy") with pytest.raises(Docs.NotFound): @@ -72,7 +77,8 @@ def test_change_empty_regiondocs(self, test_mp): assert test_mp.backend.regions.docs.get(region.id) == docs_region2 - def test_delete_regiondocs(self, test_mp): + def test_delete_regiondocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region = test_mp.backend.regions.create("Region", "Hierarchy") docs_region = test_mp.backend.regions.docs.set( region.id, "Description of test region" @@ -85,7 +91,8 @@ def test_delete_regiondocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.regions.docs.get(region.id) - def test_get_and_set_scenariodocs(self, test_mp): + def test_get_and_set_scenariodocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario = test_mp.backend.scenarios.create("Scenario") docs_scenario = test_mp.backend.scenarios.docs.set( scenario.id, "Description of Scenario" @@ -93,7 +100,8 @@ def test_get_and_set_scenariodocs(self, test_mp): docs_scenario1 = test_mp.backend.scenarios.docs.get(scenario.id) assert docs_scenario == docs_scenario1 - def test_change_empty_scenariodocs(self, test_mp): + def test_change_empty_scenariodocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario = test_mp.backend.scenarios.create("Scenario") with pytest.raises(Docs.NotFound): @@ -111,7 +119,8 @@ def test_change_empty_scenariodocs(self, test_mp): assert test_mp.backend.scenarios.docs.get(scenario.id) == docs_scenario2 - def test_delete_scenariodocs(self, test_mp): + def test_delete_scenariodocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario = test_mp.backend.scenarios.create("Scenario") docs_scenario = test_mp.backend.scenarios.docs.set( scenario.id, "Description of test Scenario" @@ -124,14 +133,16 @@ def test_delete_scenariodocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.scenarios.docs.get(scenario.id) - def test_get_and_set_unitdocs(self, test_mp): + def test_get_and_set_unitdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit = test_mp.backend.units.create("Unit") docs_unit = test_mp.backend.units.docs.set(unit.id, "Description of test Unit") docs_unit1 = test_mp.backend.units.docs.get(unit.id) assert docs_unit == docs_unit1 - def test_change_empty_unitdocs(self, test_mp): + def test_change_empty_unitdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit = test_mp.backend.units.create("Unit") with pytest.raises(Docs.NotFound): @@ -147,7 +158,8 @@ def test_change_empty_unitdocs(self, test_mp): assert test_mp.backend.units.docs.get(unit.id) == docs_unit2 - def test_delete_unitdocs(self, test_mp): + def test_delete_unitdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit = test_mp.backend.units.create("Unit") docs_unit = test_mp.backend.units.docs.set(unit.id, "Description of test Unit") @@ -158,7 +170,8 @@ def test_delete_unitdocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.units.docs.get(unit.id) - def test_get_and_set_variabledocs(self, test_mp): + def test_get_and_set_variabledocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) variable = test_mp.backend.iamc.variables.create("Variable") docs_variable = test_mp.backend.iamc.variables.docs.set( variable.id, "Description of test Variable" @@ -167,7 +180,8 @@ def test_get_and_set_variabledocs(self, test_mp): assert docs_variable == docs_variables1 - def test_change_empty_variabledocs(self, test_mp): + def test_change_empty_variabledocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) variable = test_mp.backend.iamc.variables.create("Variable") with pytest.raises(Docs.NotFound): @@ -185,7 +199,8 @@ def test_change_empty_variabledocs(self, test_mp): assert test_mp.backend.iamc.variables.docs.get(variable.id) == docs_variable2 - def test_delete_variabledocs(self, test_mp): + def test_delete_variabledocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) variable = test_mp.backend.iamc.variables.create("Variable") docs_variable = test_mp.backend.iamc.variables.docs.set( variable.id, "Description of test Variable" @@ -198,7 +213,8 @@ def test_delete_variabledocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.iamc.variables.docs.get(variable.id) - def test_get_and_set_indexsetdocs(self, test_mp): + def test_get_and_set_indexsetdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") indexset = test_mp.backend.optimization.indexsets.create( run_id=run.id, name="IndexSet" @@ -210,7 +226,8 @@ def test_get_and_set_indexsetdocs(self, test_mp): assert docs_indexset == docs_indexset1 - def test_change_empty_indexsetdocs(self, test_mp): + def test_change_empty_indexsetdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") indexset = test_mp.backend.optimization.indexsets.create( run_id=run.id, name="IndexSet" @@ -237,7 +254,8 @@ def test_change_empty_indexsetdocs(self, test_mp): == docs_indexset2 ) - def test_delete_indexsetdocs(self, test_mp): + def test_delete_indexsetdocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") indexset = test_mp.backend.optimization.indexsets.create( run_id=run.id, name="IndexSet" @@ -256,7 +274,8 @@ def test_delete_indexsetdocs(self, test_mp): with pytest.raises(Docs.NotFound): test_mp.backend.optimization.indexsets.docs.get(indexset.id) - def test_get_and_set_scalardocs(self, test_mp): + def test_get_and_set_scalardocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") scalar = test_mp.backend.optimization.scalars.create( @@ -269,7 +288,8 @@ def test_get_and_set_scalardocs(self, test_mp): assert docs_scalar == docs_scalar1 - def test_change_empty_scalardocs(self, test_mp): + def test_change_empty_scalardocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") scalar = test_mp.backend.optimization.scalars.create( @@ -291,7 +311,8 @@ def test_change_empty_scalardocs(self, test_mp): assert test_mp.backend.optimization.scalars.docs.get(scalar.id) == docs_scalar2 - def test_delete_scalardocs(self, test_mp): + def test_delete_scalardocs(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") scalar = test_mp.backend.optimization.scalars.create( diff --git a/tests/data/test_iamc_datapoint.py b/tests/data/test_iamc_datapoint.py index 54d18cf0..e1b9ae78 100644 --- a/tests/data/test_iamc_datapoint.py +++ b/tests/data/test_iamc_datapoint.py @@ -27,7 +27,8 @@ ({"scenario": {"name__in": ["scen_1", "scen_2"]}}, None), ], ) -def test_filtering(test_mp, filter, exp_filter): +def test_filtering(test_mp, filter, exp_filter, request): + test_mp = request.getfixturevalue(test_mp) # preparing the data test_data_columns = ["region", "variable", "unit", "step_year", "value"] test_data = [ @@ -77,7 +78,8 @@ def test_filtering(test_mp, filter, exp_filter): {"run": {"default_only": "test"}}, ], ) -def test_invalid_filters(test_mp, filter): +def test_invalid_filters(test_mp, filter, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(BadFilterArguments): test_mp.backend.iamc.datapoints.tabulate(**filter) with pytest.raises(BadFilterArguments): diff --git a/tests/data/test_iamc_variable.py b/tests/data/test_iamc_variable.py index fc990258..45800ce9 100644 --- a/tests/data/test_iamc_variable.py +++ b/tests/data/test_iamc_variable.py @@ -7,23 +7,27 @@ @all_platforms class TestDataIamcVariable: - def test_create_iamc_variable(self, test_mp): + def test_create_iamc_variable(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) variable = test_mp.backend.iamc.variables.create("Variable") assert variable.name == "Variable" assert variable.created_at is not None assert variable.created_by == "@unknown" - def test_iamc_variable_unique(self, test_mp): + def test_iamc_variable_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.iamc.variables.create("Variable") with pytest.raises(Variable.NotUnique): test_mp.iamc.variables.create("Variable") - def test_iamc_variable_not_found(self, test_mp): + def test_iamc_variable_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(Variable.NotFound): test_mp.iamc.variables.get("Variable") - def test_filter_iamc_variable(self, test_mp): + def test_filter_iamc_variable(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1, run2 = create_filter_test_data(test_mp) res = test_mp.backend.iamc.variables.tabulate(unit={"name": "Unit 1"}) assert sorted(res["name"].tolist()) == ["Variable 1", "Variable 2"] diff --git a/tests/data/test_meta.py b/tests/data/test_meta.py index 3c33284c..e8e8c6c6 100644 --- a/tests/data/test_meta.py +++ b/tests/data/test_meta.py @@ -21,7 +21,8 @@ @all_platforms class TestDataMeta: - def test_create_get_entry(self, test_mp): + def test_create_get_entry(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") run.set_as_default() @@ -37,7 +38,8 @@ def test_create_get_entry(self, test_mp): assert entry.value == value assert entry.type == type - def test_entry_unique(self, test_mp): + def test_entry_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") test_mp.backend.meta.create(run.id, "Key", "Value") @@ -47,7 +49,8 @@ def test_entry_unique(self, test_mp): with pytest.raises(RunMetaEntry.NotUnique): test_mp.backend.meta.create(run.id, "Key", 1) - def test_entry_not_found(self, test_mp): + def test_entry_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(RunMetaEntry.NotFound): test_mp.backend.meta.get(-1, "Key") @@ -56,7 +59,8 @@ def test_entry_not_found(self, test_mp): with pytest.raises(RunMetaEntry.NotFound): test_mp.backend.meta.get(run.id, "Key") - def test_delete_entry(self, test_mp): + def test_delete_entry(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") entry = test_mp.backend.meta.create(run.id, "Key", "Value") test_mp.backend.meta.delete(entry.id) @@ -64,7 +68,8 @@ def test_delete_entry(self, test_mp): with pytest.raises(RunMetaEntry.NotFound): test_mp.backend.meta.get(run.id, "Key") - def test_list_entry(self, test_mp): + def test_list_entry(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") run.set_as_default() @@ -78,7 +83,8 @@ def test_list_entry(self, test_mp): assert entry.value == value assert entry.type == type - def test_tabulate_entry(self, test_mp): + def test_tabulate_entry(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") run.set_as_default() @@ -91,7 +97,8 @@ def test_tabulate_entry(self, test_mp): entries = test_mp.backend.meta.tabulate() assert_unordered_equality(entries, true_entries) - def test_tabulate_entries_with_run_filters(self, test_mp): + def test_tabulate_entries_with_run_filters(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.runs.create("Model", "Scenario") run1.set_as_default() run2 = test_mp.runs.create("Model 2", "Scenario 2") @@ -126,7 +133,8 @@ def test_tabulate_entries_with_run_filters(self, test_mp): true_entries2, ) - def test_tabulate_entries_with_key_filters(self, test_mp): + def test_tabulate_entries_with_key_filters(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") run.set_as_default() @@ -143,7 +151,8 @@ def test_tabulate_entries_with_key_filters(self, test_mp): assert_unordered_equality(entry, true_entry, check_dtype=False) - def test_entry_bulk_operations(self, test_mp): + def test_entry_bulk_operations(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.runs.create("Model", "Scenario") run.set_as_default() @@ -194,7 +203,8 @@ def test_entry_bulk_operations(self, test_mp): ret = test_mp.backend.meta.tabulate() assert ret.empty - def test_meta_bulk_exceptions(self, test_mp): + def test_meta_bulk_exceptions(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) entries = pd.DataFrame( [ ["Boolean", -9.9], diff --git a/tests/data/test_model.py b/tests/data/test_model.py index 918b9623..d5870a63 100644 --- a/tests/data/test_model.py +++ b/tests/data/test_model.py @@ -8,28 +8,33 @@ @all_platforms class TestDataModel: - def test_create_model(self, test_mp): + def test_create_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model = test_mp.backend.models.create("Model") assert model.name == "Model" assert model.created_at is not None assert model.created_by == "@unknown" - def test_model_unique(self, test_mp): + def test_model_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.models.create("Model") with pytest.raises(Model.NotUnique): test_mp.models.create("Model") - def test_get_model(self, test_mp): + def test_get_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) model1 = test_mp.backend.models.create("Model") model2 = test_mp.backend.models.get("Model") assert model1 == model2 - def test_model_not_found(self, test_mp): + def test_model_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(Model.NotFound): test_mp.models.get("Model") - def test_list_model(self, test_mp): + def test_list_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model 1", "Scenario") test_mp.runs.create("Model 2", "Scenario") @@ -39,7 +44,8 @@ def test_list_model(self, test_mp): assert models[1].id == 2 assert models[1].name == "Model 2" - def test_tabulate_model(self, test_mp): + def test_tabulate_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model 1", "Scenario") test_mp.runs.create("Model 2", "Scenario") @@ -56,12 +62,14 @@ def test_tabulate_model(self, test_mp): models.drop(columns=["created_at", "created_by"]), true_models ) - def test_map_model(self, test_mp): + def test_map_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model 1", "Scenario") test_mp.runs.create("Model 2", "Scenario") assert test_mp.backend.models.map() == {1: "Model 1", 2: "Model 2"} - def test_filter_model(self, test_mp): + def test_filter_model(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1, _ = create_filter_test_data(test_mp) res = test_mp.backend.models.tabulate(name__like="Model *") diff --git a/tests/data/test_optimization_indexset.py b/tests/data/test_optimization_indexset.py index 3e81d2cb..47f24b28 100644 --- a/tests/data/test_optimization_indexset.py +++ b/tests/data/test_optimization_indexset.py @@ -35,7 +35,8 @@ def df_from_list(indexsets: list): @all_platforms class TestDataOptimizationIndexSet: - def test_create_indexset(self, test_mp): + def test_create_indexset(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") indexset_1 = test_mp.backend.optimization.indexsets.create( run_id=run.id, name="Indexset" @@ -49,7 +50,8 @@ def test_create_indexset(self, test_mp): run_id=run.id, name="Indexset" ) - def test_get_indexset(self, test_mp): + def test_get_indexset(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") _ = test_mp.backend.optimization.indexsets.create( run_id=run.id, name="Indexset" @@ -62,7 +64,8 @@ def test_get_indexset(self, test_mp): assert indexset.run__id == 1 assert indexset.name == "Indexset" - def test_list_indexsets(self, test_mp): + def test_list_indexsets(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") # Per default, list() lists scalars for `default` version runs: test_mp.backend.runs.set_as_default_version(run.id) @@ -77,7 +80,8 @@ def test_list_indexsets(self, test_mp): ) assert [indexset_1, indexset_2] == test_mp.backend.optimization.indexsets.list() - def test_tabulate_indexsets(self, test_mp): + def test_tabulate_indexsets(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") # Per default, tabulate() lists scalars for `default` version runs: test_mp.backend.runs.set_as_default_version(run.id) @@ -110,7 +114,8 @@ def test_tabulate_indexsets(self, test_mp): expected, test_mp.backend.optimization.indexsets.tabulate(name="Indexset 1") ) - def test_add_elements(self, test_mp): + def test_add_elements(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_elements = ["foo", "bar"] run = test_mp.backend.runs.create("Model", "Scenario") indexset_1 = test_mp.backend.optimization.indexsets.create( diff --git a/tests/data/test_optimization_scalar.py b/tests/data/test_optimization_scalar.py index f29a36cb..36e6eeb4 100644 --- a/tests/data/test_optimization_scalar.py +++ b/tests/data/test_optimization_scalar.py @@ -35,7 +35,8 @@ def df_from_list(scalars: list): @all_platforms class TestDataOptimizationScalar: - def test_create_scalar(self, test_mp): + def test_create_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") unit2 = test_mp.backend.units.create("Unit 2") @@ -52,7 +53,8 @@ def test_create_scalar(self, test_mp): run_id=run.id, name="Scalar", value=2, unit_name=unit2.name ) - def test_get_scalar(self, test_mp): + def test_get_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") scalar = test_mp.backend.optimization.scalars.create( @@ -63,7 +65,8 @@ def test_get_scalar(self, test_mp): run_id=run.id, name="Scalar" ) - def test_update_scalar(self, test_mp): + def test_update_scalar(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") unit = test_mp.backend.units.create("Unit") unit2 = test_mp.backend.units.create("Unit 2") @@ -81,7 +84,8 @@ def test_update_scalar(self, test_mp): assert ret.unit__id == unit2.id assert ret.value == 20 - def test_list_scalars(self, test_mp): + def test_list_scalars(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") # Per default, list() lists scalars for `default` version runs: test_mp.backend.runs.set_as_default_version(run.id) @@ -96,7 +100,8 @@ def test_list_scalars(self, test_mp): assert [scalar_1] == test_mp.backend.optimization.scalars.list(name="Scalar") assert [scalar_1, scalar_2] == test_mp.backend.optimization.scalars.list() - def test_tabulate_scalars(self, test_mp): + def test_tabulate_scalars(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") # Per default, tabulate() lists scalars for `default` version runs: test_mp.backend.runs.set_as_default_version(run.id) diff --git a/tests/data/test_region.py b/tests/data/test_region.py index 59b74d77..513cc0db 100644 --- a/tests/data/test_region.py +++ b/tests/data/test_region.py @@ -8,19 +8,22 @@ @all_platforms class TestDataRegion: - def test_create_region(self, test_mp): + def test_create_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region1 = test_mp.backend.regions.create("Region", "Hierarchy") assert region1.name == "Region" assert region1.hierarchy == "Hierarchy" assert region1.created_at is not None assert region1.created_by == "@unknown" - def test_delete_region(self, test_mp): + def test_delete_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region1 = test_mp.backend.regions.create("Region", "Hierarchy") test_mp.backend.regions.delete(region1.id) assert test_mp.backend.regions.tabulate().empty - def test_region_unique(self, test_mp): + def test_region_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.regions.create("Region", "Hierarchy") with pytest.raises(Region.NotUnique): @@ -29,16 +32,19 @@ def test_region_unique(self, test_mp): with pytest.raises(Region.NotUnique): test_mp.regions.create("Region", "Another Hierarchy") - def test_get_region(self, test_mp): + def test_get_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region1 = test_mp.backend.regions.create("Region", "Hierarchy") region2 = test_mp.backend.regions.get("Region") assert region1 == region2 - def test_region_not_found(self, test_mp): + def test_region_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(Region.NotFound): test_mp.regions.get("Region") - def test_get_or_create_region(self, test_mp): + def test_get_or_create_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) region1 = test_mp.backend.regions.create("Region", "Hierarchy") region2 = test_mp.backend.regions.get_or_create("Region") assert region1.id == region2.id @@ -48,7 +54,8 @@ def test_get_or_create_region(self, test_mp): with pytest.raises(Region.NotUnique): test_mp.backend.regions.get_or_create("Other", hierarchy="Other Hierarchy") - def test_list_region(self, test_mp): + def test_list_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.regions.create("Region 1", "Hierarchy") test_mp.backend.regions.create("Region 2", "Hierarchy") @@ -60,7 +67,8 @@ def test_list_region(self, test_mp): assert regions[1].id == 2 assert regions[1].name == "Region 2" - def test_tabulate_region(self, test_mp): + def test_tabulate_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.regions.create("Region 1", "Hierarchy") test_mp.backend.regions.create("Region 2", "Hierarchy") @@ -77,7 +85,8 @@ def test_tabulate_region(self, test_mp): regions.drop(columns=["created_at", "created_by"]), true_regions ) - def test_filter_region(self, test_mp): + def test_filter_region(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1, run2 = create_filter_test_data(test_mp) res = test_mp.backend.regions.tabulate( diff --git a/tests/data/test_run.py b/tests/data/test_run.py index f7437fb2..c7d7c79e 100644 --- a/tests/data/test_run.py +++ b/tests/data/test_run.py @@ -8,14 +8,16 @@ @all_platforms class TestDataRun: - def test_create_run(self, test_mp): + def test_create_run(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.backend.runs.create("Model", "Scenario") assert run1.model.name == "Model" assert run1.scenario.name == "Scenario" assert run1.version == 1 assert not run1.is_default - def test_create_run_increment_version(self, test_mp): + def test_create_run_increment_version(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.runs.create("Model", "Scenario") run2 = test_mp.backend.runs.create("Model", "Scenario") assert run2.model.name == "Model" @@ -23,7 +25,8 @@ def test_create_run_increment_version(self, test_mp): assert run2.version == 2 assert not run2.is_default - def test_get_run_versions(self, test_mp): + def test_get_run_versions(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1a = test_mp.backend.runs.create("Model", "Scenario") run2a = test_mp.backend.runs.create("Model", "Scenario") test_mp.backend.runs.set_as_default_version(run2a.id) @@ -40,11 +43,13 @@ def test_get_run_versions(self, test_mp): run3b = test_mp.backend.runs.get("Model", "Scenario", 3) assert run3a.id == run3b.id - def test_get_run_no_default_version(self, test_mp): + def test_get_run_no_default_version(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(NoDefaultRunVersion): test_mp.backend.runs.get_default_version("Model", "Scenario") - def test_get_or_create_run(self, test_mp): + def test_get_or_create_run(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.backend.runs.create("Model", "Scenario") run2 = test_mp.backend.runs.get_or_create("Model", "Scenario") assert run1.id != run2.id @@ -55,7 +60,8 @@ def test_get_or_create_run(self, test_mp): run3 = test_mp.backend.runs.get_or_create("Model", "Scenario") assert run1.id == run3.id - def test_list_run(self, test_mp): + def test_list_run(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1 = test_mp.backend.runs.create("Model", "Scenario") test_mp.backend.runs.create("Model", "Scenario") @@ -72,7 +78,8 @@ def test_list_run(self, test_mp): assert run1.id == run.id - def test_tabulate_run(self, test_mp): + def test_tabulate_run(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run = test_mp.backend.runs.create("Model", "Scenario") test_mp.backend.runs.set_as_default_version(run.id) test_mp.backend.runs.create("Model", "Scenario") diff --git a/tests/data/test_scenario.py b/tests/data/test_scenario.py index 38ca86d7..f2270f69 100644 --- a/tests/data/test_scenario.py +++ b/tests/data/test_scenario.py @@ -8,28 +8,33 @@ @all_platforms class TestDataScenario: - def test_create_scenario(self, test_mp): + def test_create_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario = test_mp.backend.scenarios.create("Scenario") assert scenario.name == "Scenario" assert scenario.created_at is not None assert scenario.created_by == "@unknown" - def test_scenario_unique(self, test_mp): + def test_scenario_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.scenarios.create("Scenario") with pytest.raises(Scenario.NotUnique): test_mp.scenarios.create("Scenario") - def test_get_scenario(self, test_mp): + def test_get_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) scenario1 = test_mp.backend.scenarios.create("Scenario") scenario2 = test_mp.backend.scenarios.get("Scenario") assert scenario1 == scenario2 - def test_scenario_not_found(self, test_mp): + def test_scenario_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(Scenario.NotFound): test_mp.scenarios.get("Scenario") - def test_list_scenario(self, test_mp): + def test_list_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model", "Scenario 1") test_mp.runs.create("Model", "Scenario 2") @@ -40,7 +45,8 @@ def test_list_scenario(self, test_mp): assert scenarios[1].id == 2 assert scenarios[1].name == "Scenario 2" - def test_tabulate_scenario(self, test_mp): + def test_tabulate_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model", "Scenario 1") test_mp.runs.create("Model", "Scenario 2") @@ -57,13 +63,15 @@ def test_tabulate_scenario(self, test_mp): scenarios.drop(columns=["created_at", "created_by"]), true_scenarios ) - def test_map_scenario(self, test_mp): + def test_map_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.runs.create("Model", "Scenario 1") test_mp.runs.create("Model", "Scenario 2") assert test_mp.backend.scenarios.map() == {1: "Scenario 1", 2: "Scenario 2"} - def test_filter_scenario(self, test_mp): + def test_filter_scenario(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1, _ = create_filter_test_data(test_mp) res = test_mp.backend.scenarios.tabulate( diff --git a/tests/data/test_unit.py b/tests/data/test_unit.py index 1c148322..7a5efa79 100644 --- a/tests/data/test_unit.py +++ b/tests/data/test_unit.py @@ -8,19 +8,22 @@ @all_platforms class TestDataUnit: - def test_create_get_unit(self, test_mp): + def test_create_get_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.backend.units.create("Unit") assert unit1.name == "Unit" unit2 = test_mp.backend.units.get("Unit") assert unit1.id == unit2.id - def test_delete_unit(self, test_mp): + def test_delete_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.backend.units.create("Unit") test_mp.backend.units.delete(unit1.id) assert test_mp.backend.units.tabulate().empty - def test_get_or_create_unit(self, test_mp): + def test_get_or_create_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) unit1 = test_mp.backend.units.create("Unit") unit2 = test_mp.backend.units.get_or_create("Unit") assert unit1.id == unit2.id @@ -29,17 +32,20 @@ def test_get_or_create_unit(self, test_mp): assert unit3.name == "Another Unit" assert unit1.id != unit3.id - def test_unit_unique(self, test_mp): + def test_unit_unique(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.units.create("Unit") with pytest.raises(Unit.NotUnique): test_mp.backend.units.create("Unit") - def test_unit_not_found(self, test_mp): + def test_unit_not_found(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) with pytest.raises(Unit.NotFound): test_mp.backend.units.get("Unit") - def test_list_unit(self, test_mp): + def test_list_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.units.create("Unit 1") test_mp.backend.units.create("Unit 2") @@ -51,7 +57,8 @@ def test_list_unit(self, test_mp): assert units[1].id == 2 assert units[1].name == "Unit 2" - def test_tabulate_unit(self, test_mp): + def test_tabulate_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) test_mp.backend.units.create("Unit 1") test_mp.backend.units.create("Unit 2") @@ -68,7 +75,8 @@ def test_tabulate_unit(self, test_mp): units.drop(columns=["created_at", "created_by"]), true_units ) - def test_filter_unit(self, test_mp): + def test_filter_unit(self, test_mp, request): + test_mp = request.getfixturevalue(test_mp) run1, run2 = create_filter_test_data(test_mp) res = test_mp.backend.units.tabulate( iamc={ diff --git a/tests/test_auth.py b/tests/test_auth.py index 443beded..382be27f 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -220,10 +220,10 @@ def test_guards(user, truths, test_sqlite_mp): ["Other Model", private, None], ], ) -def test_filters(model, platform, access, test_mp, test_data_annual): +def test_filters(model, platform, access, test_mp, test_data_annual, request): user = User(username="User Carina", is_verified=True, groups=[6, 7]) - mp = test_mp + mp = request.getfixturevalue(test_mp) add_regions(mp, test_data_annual["region"].unique()) add_units(mp, test_data_annual["unit"].unique()) diff --git a/tests/test_benchmark_filters.py b/tests/test_benchmark_filters.py index d1313a28..be18808e 100644 --- a/tests/test_benchmark_filters.py +++ b/tests/test_benchmark_filters.py @@ -30,8 +30,11 @@ }, ], ) -def test_filter_datapoints_benchmark(generated_mp, profiled, benchmark, filters): +def test_filter_datapoints_benchmark( + generated_mp, profiled, benchmark, filters, request +): """Benchmarks a the filtration of `test_data_big`.""" + generated_mp = request.getfixturevalue(generated_mp) def run(): with profiled(): diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py index 43b62607..12a7f466 100644 --- a/tests/test_benchmarks.py +++ b/tests/test_benchmarks.py @@ -55,10 +55,12 @@ def tabulate_datapoints(test_mp, **kwargs): @all_platforms class TestBenchmarks: def test_add_datapoints_full_benchmark( - self, test_mp, profiled, benchmark, test_data_big + self, test_mp, profiled, benchmark, test_data_big, request ): """Benchmarks a full insert of `test_data_big`.""" + test_mp = request.getfixturevalue(test_mp) + def setup(): add_regions(test_mp, test_data_big["region"].unique()) add_units(test_mp, test_data_big["unit"].unique()) @@ -71,10 +73,12 @@ def run(mp): benchmark.pedantic(run, setup=setup) def test_add_datapoints_half_unchanged_benchmark( - self, test_mp, profiled, benchmark, test_data_big + self, test_mp, profiled, benchmark, test_data_big, request ): """Benchmarks a full insert of `test_data_big` on a half-filled database.""" + test_mp = request.getfixturevalue(test_mp) + def setup(): add_regions(test_mp, test_data_big["region"].unique()) add_units(test_mp, test_data_big["unit"].unique()) @@ -89,11 +93,13 @@ def run(mp): benchmark.pedantic(run, setup=setup) def test_add_datapoints_half_insert_half_update_benchmark( - self, test_mp, profiled, benchmark, test_data_big + self, test_mp, profiled, benchmark, test_data_big, request ): """Benchmarks a full insert of `test_data_big` with changed values on a half-filled database.""" + test_mp = request.getfixturevalue(test_mp) + def setup(): add_regions(test_mp, test_data_big["region"].unique()) add_units(test_mp, test_data_big["unit"].unique()) @@ -112,10 +118,12 @@ def run(mp, data): benchmark.pedantic(run, setup=setup) def test_remove_datapoints_benchmark( - self, test_mp, profiled, benchmark, test_data_big + self, test_mp, profiled, benchmark, test_data_big, request ): """Benchmarks a full removal of `test_data_big` from a filled database.""" + test_mp = request.getfixturevalue(test_mp) + def setup(): add_regions(test_mp, test_data_big["region"].unique()) add_units(test_mp, test_data_big["unit"].unique()) @@ -130,10 +138,12 @@ def run(mp, data): benchmark.pedantic(run, setup=setup) def test_tabulate_datapoints_benchmark( - self, test_mp, profiled, benchmark, test_data_big + self, test_mp, profiled, benchmark, test_data_big, request ): """Benchmarks a full retrieval of `test_data_big` from a filled database.""" + test_mp = request.getfixturevalue(test_mp) + def setup(): add_regions(test_mp, test_data_big["region"].unique()) add_units(test_mp, test_data_big["unit"].unique()) diff --git a/tests/utils.py b/tests/utils.py index 2ef2cdef..defc24e6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,10 +1,11 @@ import pandas as pd import pandas.testing as pdt import pytest -from pytest_lazyfixture import lazy_fixture from ixmp4 import DataPoint +from .conftest import SKIP_PGSQL_TESTS + def add_regions(mp, regions): for region in regions: @@ -27,56 +28,90 @@ def assert_unordered_equality(df1, df2, **kwargs): all_platforms = pytest.mark.parametrize( "test_mp", [ - lazy_fixture("test_sqlite_mp"), - lazy_fixture("test_pgsql_mp"), - lazy_fixture("test_api_sqlite_mp"), - lazy_fixture("test_api_pgsql_mp"), + "test_sqlite_mp", + pytest.param( + "test_pgsql_mp", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), + "test_api_sqlite_mp", + pytest.param( + "test_api_pgsql_mp", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), ], ) generated_platforms = pytest.mark.parametrize( "generated_mp", [ - lazy_fixture("test_sqlite_mp_generated"), - lazy_fixture("test_pgsql_mp_generated"), - lazy_fixture("test_api_sqlite_mp_generated"), - lazy_fixture("test_api_pgsql_mp_generated"), + "test_sqlite_mp_generated", + pytest.param( + "test_pgsql_mp_generated", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), + "test_api_sqlite_mp_generated", + pytest.param( + "test_api_pgsql_mp_generated", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), ], ) + generated_api_platforms = pytest.mark.parametrize( "generated_mp", [ - lazy_fixture("test_api_sqlite_mp_generated"), - lazy_fixture("test_api_pgsql_mp_generated"), + "test_api_sqlite_mp_generated", + pytest.param( + "test_api_pgsql_mp_generated", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), ], ) api_platforms = pytest.mark.parametrize( "test_mp", [ - lazy_fixture("test_api_sqlite_mp"), - lazy_fixture("test_api_pgsql_mp"), + "test_api_sqlite_mp", + pytest.param( + "test_api_pgsql_mp", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), ], ) database_platforms = pytest.mark.parametrize( "test_mp", [ - lazy_fixture("test_sqlite_mp"), - lazy_fixture("test_pgsql_mp"), + "test_sqlite_mp", + pytest.param( + "test_pgsql_mp", + marks=pytest.mark.skipif( + SKIP_PGSQL_TESTS, + reason="Cannot connect to PostgreSQL database service, skipping test", + ), + ), ], ) -gen_obj_nums = dict( - num_models=10, - num_runs=30, - num_regions=100, - num_variables=200, - num_units=50, - num_datapoints=10_000, -) - def create_filter_test_data(test_mp): for i in range(1, 7):