From fcff9c29a9e0f9a0dd220570cf4807044c2ac41b Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 19 Feb 2025 16:10:41 +0300 Subject: [PATCH 01/24] fix: drop py37_copytree --- airflow_dbt_python/hooks/localfs.py | 34 ++------------------- tests/hooks/test_localfs_hook.py | 47 +---------------------------- 2 files changed, 4 insertions(+), 77 deletions(-) diff --git a/airflow_dbt_python/hooks/localfs.py b/airflow_dbt_python/hooks/localfs.py index a1d1e8b..97597c5 100644 --- a/airflow_dbt_python/hooks/localfs.py +++ b/airflow_dbt_python/hooks/localfs.py @@ -6,7 +6,6 @@ from __future__ import annotations import shutil -import sys from functools import partial from pathlib import Path from typing import Optional @@ -127,33 +126,6 @@ def copy( copy_function = partial(self.copy_one, replace=replace) - if sys.version_info.major == 3 and sys.version_info.minor < 8: - py37_copytree(source, destination, replace) - else: - shutil.copytree( # type: ignore - source, destination, copy_function=copy_function, dirs_exist_ok=True - ) - - -def py37_copytree(source: URL, destination: URL, replace: bool = True): - """A (probably) poor attempt at replicating shutil.copytree for Python 3.7. - - shutil.copytree is available in Python 3.7, however it doesn't have the - dirs_exist_ok parameter, and we really need that. If the destination path doesn't - exist, we can use shutil.copytree, however if it does then we need to copy files - one by one and make any subdirectories ourselves. - """ - if destination.exists(): - for url in source: - if url.is_dir(): - continue - - target_url = destination / url.relative_to(source) - if target_url.exists() and not replace: - # shutil.copy replaces by default - continue - - target_url.parent.mkdir(exist_ok=True, parents=True) - shutil.copy(url, target_url) - else: - shutil.copytree(source, destination) + shutil.copytree( # type: ignore + source, destination, copy_function=copy_function, dirs_exist_ok=True + ) diff --git a/tests/hooks/test_localfs_hook.py b/tests/hooks/test_localfs_hook.py index 59b5bbb..4ec34b9 100644 --- a/tests/hooks/test_localfs_hook.py +++ b/tests/hooks/test_localfs_hook.py @@ -4,7 +4,7 @@ from pathlib import Path from zipfile import ZipFile -from airflow_dbt_python.hooks.localfs import DbtLocalFsRemoteHook, py37_copytree +from airflow_dbt_python.hooks.localfs import DbtLocalFsRemoteHook from airflow_dbt_python.utils.url import URL @@ -184,48 +184,3 @@ def test_upload_dbt_project_to_zip_file(tmpdir, test_files): remote.upload_dbt_project(test_files[0].parent.parent, zip_path) assert zip_path.exists() - - -def test_py37_copytree(test_files, tmpdir): - """The Python 3.7 workaround should produce the same results as copytree.""" - py37_dir = tmpdir / "py37_copytree_target" - assert not py37_dir.exists() - copytree_dir = tmpdir / "copytree_target" - assert not copytree_dir.exists() - - shutil.copytree(URL(test_files[0].parent.parent), URL(copytree_dir)) - py37_copytree(URL(test_files[0].parent.parent), URL(py37_dir)) - - for path in Path(copytree_dir).glob("**/*"): - if path.is_dir(): - continue - - py37_path = py37_dir / path.relative_to(copytree_dir) - assert py37_path.exists() - - -def test_py37_copytree_no_replace(test_files, tmpdir): - """The Python 3.7 workaround should produce the same results as copytree.""" - source = test_files[0].parent.parent - py37_copytree(URL(source), URL(source), replace=False) - - all_paths = [p for p in source.glob("**/*") if not p.is_dir()] - assert len(all_paths) == 4 - - -def test_py37_copytree_if_exists(test_files, tmpdir): - """The Python 3.7 workaround should produce the same results as copytree.""" - py37_dir = tmpdir / "py37_copytree_target" - py37_dir.mkdir() - - assert py37_dir.exists() - - source = test_files[0].parent.parent - py37_copytree(URL(source), URL(py37_dir)) - - for path in source.glob("**/*"): - if path.is_dir(): - continue - - py37_path = py37_dir / path.relative_to(source) - assert py37_path.exists() From 0fc61ece5a62f6dbc59005e0e9b2d1748f87f289 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 19 Feb 2025 16:21:57 +0300 Subject: [PATCH 02/24] fix: incorrect conn_id --- airflow_dbt_python/hooks/dbt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index 20273c3..bc085ea 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -168,7 +168,7 @@ def download_dbt_profiles( supported for remotes that require it. """ scheme = urlparse(str(profiles_dir)).scheme - remote = self.get_remote(scheme, self.project_conn_id) + remote = self.get_remote(scheme, self.profiles_conn_id) return remote.download_dbt_profiles(profiles_dir, destination) From ad97caa63d82eac639b2ec3cb26ac17714bb7d8e Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 19 Feb 2025 16:09:45 +0300 Subject: [PATCH 03/24] fix: use functools.cache for get_remote --- airflow_dbt_python/hooks/dbt.py | 8 +------- airflow_dbt_python/hooks/remote.py | 2 ++ tests/hooks/dbt/test_dbt_hook_base.py | 15 +++++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index bc085ea..8f8aafc 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -135,7 +135,6 @@ def __init__( profiles_conn_id: Optional[str] = None, **kwargs, ): - self.remotes: DbtRemoteHooksDict = {} self.dbt_conn_id = dbt_conn_id self.project_conn_id = project_conn_id self.profiles_conn_id = profiles_conn_id @@ -150,12 +149,7 @@ def get_remote(self, scheme: str, conn_id: Optional[str]) -> DbtRemoteHook: """ from .remote import get_remote - try: - return self.remotes[(scheme, conn_id)] - except KeyError: - remote = get_remote(scheme, conn_id) - self.remotes[(scheme, conn_id)] = remote - return remote + return get_remote(scheme, conn_id) def download_dbt_profiles( self, diff --git a/airflow_dbt_python/hooks/remote.py b/airflow_dbt_python/hooks/remote.py index 79c21b2..86790ff 100644 --- a/airflow_dbt_python/hooks/remote.py +++ b/airflow_dbt_python/hooks/remote.py @@ -6,6 +6,7 @@ """ from abc import ABC, abstractmethod +from functools import cache from pathlib import Path from typing import Optional, Type @@ -139,6 +140,7 @@ def upload_dbt_project( source_url.unlink() +@cache def get_remote(scheme: str, conn_id: Optional[str] = None) -> DbtRemoteHook: """Get a DbtRemoteHook as long as the scheme is supported. diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 29a9de7..515edff 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -89,13 +89,14 @@ def download_dbt_project(self, *args, **kwargs): return args, kwargs -def test_dbt_hook_download_dbt_profiles(): +def test_dbt_hook_download_dbt_profiles(mocker): """Test dbt hook calls remote correctly. We ignore types as we are monkey patching a FakeRemote for testing. """ hook = DbtHook() - hook.remotes[("", None)] = FakeRemote() # type: ignore + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock.return_value = FakeRemote() args, kwargs = hook.download_dbt_profiles("/path/to/profiles", "/path/to/store") # type: ignore @@ -103,13 +104,14 @@ def test_dbt_hook_download_dbt_profiles(): assert kwargs == {} -def test_dbt_hook_upload_dbt_project(): +def test_dbt_hook_upload_dbt_project(mocker): """Test dbt hook calls remote correctly. We ignore types as we are monkey patching a FakeRemote for testing. """ hook = DbtHook() - hook.remotes[("", None)] = FakeRemote() # type: ignore + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock.return_value = FakeRemote() args, kwargs = hook.upload_dbt_project( # type: ignore "/path/to/profiles", "/path/to/store", replace=True, delete_before=True @@ -119,10 +121,11 @@ def test_dbt_hook_upload_dbt_project(): assert kwargs == {"replace": True, "delete_before": True} -def test_dbt_hook_download_dbt_project(): +def test_dbt_hook_download_dbt_project(mocker): """Test dbt hook calls remote correctly.""" hook = DbtHook(project_conn_id="conn_id") - hook.remotes[("", "conn_id")] = FakeRemote() # type: ignore + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock.return_value = FakeRemote() args, kwargs = hook.download_dbt_project("/path/to/profiles", "/path/to/store") # type: ignore From c4a87f4e1a7e56483b6e72170759ccad6e2fca67 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 25 Feb 2025 20:12:43 +0300 Subject: [PATCH 04/24] fix: duplicate log lines --- airflow_dbt_python/hooks/dbt.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index 8f8aafc..73b43f7 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -248,7 +248,7 @@ def run_dbt_task( ) requires_profile = isinstance(task, (CleanTask, DepsTask)) - self.setup_dbt_logging(task, config.debug) + self.setup_dbt_logging(config.debug) if runtime_config is not None and not requires_profile: # The deps command installs the dependencies, which means they @@ -385,7 +385,7 @@ def prepare_directory( return new_project_dir, new_profiles_dir - def setup_dbt_logging(self, task: BaseTask, debug: Optional[bool]): + def setup_dbt_logging(self, debug: Optional[bool]): """Setup dbt logging. Starting with dbt v1, dbt initializes two loggers: default_file and @@ -401,6 +401,7 @@ def setup_dbt_logging(self, task: BaseTask, debug: Optional[bool]): configured_file = logging.getLogger("configured_file") file_log = logging.getLogger("file_log") stdout_log = logging.getLogger("stdout_log") + stdout_log.handlers.clear() stdout_log.propagate = True if not debug: From 1a76ada8670a33d00b1a140294ac8e53e8946d32 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 25 Feb 2025 17:36:55 +0300 Subject: [PATCH 05/24] fix: poetry deprecation warnings --- pyproject.toml | 99 ++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 75978d4..d011e68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,11 @@ -[tool.poetry] +[project] name = "airflow-dbt-python" version = "2.2.0" description = "A collection of Airflow operators, hooks, and utilities to execute dbt commands" -authors = ["Tomás Farías Santana "] +authors = [{ name = "Tomás Farías Santana", email = "tomas@tomasfarias.dev" }] license = "MIT" readme = "README.md" -repository = "https://github.com/tomasfarias/airflow-dbt-python" +requires-python = ">=3.9,<3.13" classifiers = [ "Development Status :: 5 - Production/Stable", @@ -19,25 +19,56 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] -[tool.poetry.requires-plugins] -poetry-plugin-export = ">=1.8" +dependencies = [ + "apache-airflow>=2.8", + "contextlib-chdir==1.0.2;python_version<'3.11'", + "dbt-core>=1.8.0,<2.0.0", +] -[tool.poetry.dependencies] -python = ">=3.9,<3.13" # Airflow providers require this upper boundary +[project.url] +repository = "https://github.com/tomasfarias/airflow-dbt-python" + +[build-system] +requires = ["poetry-core>=1.2.0"] +build-backend = "poetry.core.masonry.api" -apache-airflow = { version = ">=2.8" } -apache-airflow-providers-amazon = { version = ">=3.0.0", optional = true } -apache-airflow-providers-ssh = { version = ">=3.0.0", optional = true } -connexion = { version = "<3.0" } # https://github.com/apache/airflow/issues/35217 -dulwich = { version = ">=0.21", optional = true } -contextlib-chdir = { version = "==1.0.2", python = "<3.11" } +[project.optional-dependencies] +airflow-providers = [ + "apache-airflow-providers-amazon>=3.0.0", + "apache-airflow-providers-ssh>=3.0.0", +] +adapters = [ + "dbt-bigquery>=1.8.0,<2.0.0", + "dbt-redshift>=1.8.0,<2.0.0", + "dbt-postgres>=1.8.0,<2.0.0", + "dbt-snowflake>=1.8.0,<2.0.0", + "dbt-spark>=1.8.0,<2.0.0", +] +bigquery = [ + "dbt-bigquery>=1.8.0,<2.0.0", +] +git = [ + "apache-airflow-providers-ssh>=3.0.0", + "dulwich>=0.21", +] +postgres = [ + "dbt-postgres>=1.8.0,<2.0.0", +] +redshift = [ + "dbt-redshift>=1.8.0,<2.0.0", +] +s3 = [ + "apache-airflow-providers-amazon>=3.0.0", +] +snowflake = [ + "dbt-snowflake>=1.8.0,<2.0.0", +] +spark = [ + "dbt-spark>=1.8.0,<2.0.0", +] -dbt-core = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-bigquery = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-postgres = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-redshift = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-snowflake = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-spark = { version = ">=1.8.0,<2.0.0", optional = true } +[tool.poetry.requires-plugins] +poetry-plugin-export = ">=1.8" [tool.poetry.group.dev] optional = true @@ -65,40 +96,12 @@ types-PyYAML = ">=6.0.7" optional = true [tool.poetry.group.docs.dependencies] -Sphinx = [ - { python = ">=3.9", version = "7.4.7" }, -] +Sphinx = "7.4.7" sphinx-rtd-theme = "3.0.2" sphinx-copybutton = "0.5.2" attrs = ">=22" zipp = ">=3.19.1" -[tool.poetry.group.adapters] -optional = true - -[tool.poetry.group.adapters.dependencies] -dbt-bigquery = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-postgres = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-redshift = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-snowflake = { version = ">=1.8.0,<2.0.0", optional = true } -dbt-spark = { version = ">=1.8.0,<2.0.0", optional = true } - -[tool.poetry.extras] -airflow-providers = ["apache-airflow-providers-amazon", "apache-airflow-providers-ssh"] -adapters = ["dbt-bigquery", "dbt-redshift", "dbt-postgres", "dbt-snowflake", "dbt-spark"] -bigquery = ["dbt-bigquery"] -docs = ["Sphinx", "sphinx-rtd-theme", "sphinx-copybutton"] -git = ["apache-airflow-providers-ssh", "dulwich"] -postgres = ["dbt-postgres"] -redshift = ["dbt-redshift"] -s3 = ["apache-airflow-providers-amazon"] -snowflake = ["dbt-snowflake"] -spark = ["dbt-spark"] - -[build-system] -requires = ["poetry-core>=1.2.0"] -build-backend = "poetry.core.masonry.api" - [tool.black] line-length = 88 target-version = ["py39", "py310", "py311", "py312"] From e2700fae73b3b20ce49e17041d8245e19d717a4e Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Thu, 27 Feb 2025 18:00:05 +0300 Subject: [PATCH 06/24] fix: move remote hooks --- .../hooks/{remote.py => remote/__init__.py} | 10 +++++----- airflow_dbt_python/hooks/{ => remote}/git.py | 4 ++-- airflow_dbt_python/hooks/{ => remote}/localfs.py | 4 ++-- airflow_dbt_python/hooks/{ => remote}/s3.py | 6 +++--- docs/reference/hooks.rst | 6 +++--- tests/hooks/dbt/test_dbt_hook_base.py | 4 ++-- tests/hooks/test_git_hook.py | 2 +- tests/hooks/test_localfs_hook.py | 3 +-- tests/hooks/test_s3_hook.py | 2 +- tests/operators/test_dbt_build.py | 2 +- tests/operators/test_dbt_clean.py | 2 +- tests/operators/test_dbt_deps.py | 2 +- tests/operators/test_dbt_docs_generate.py | 2 +- tests/operators/test_dbt_run.py | 2 +- tests/operators/test_dbt_seed.py | 2 +- tests/operators/test_dbt_test.py | 2 +- 16 files changed, 27 insertions(+), 28 deletions(-) rename airflow_dbt_python/hooks/{remote.py => remote/__init__.py} (96%) rename airflow_dbt_python/hooks/{ => remote}/git.py (99%) rename airflow_dbt_python/hooks/{ => remote}/localfs.py (99%) rename airflow_dbt_python/hooks/{ => remote}/s3.py (98%) diff --git a/airflow_dbt_python/hooks/remote.py b/airflow_dbt_python/hooks/remote/__init__.py similarity index 96% rename from airflow_dbt_python/hooks/remote.py rename to airflow_dbt_python/hooks/remote/__init__.py index 86790ff..049951c 100644 --- a/airflow_dbt_python/hooks/remote.py +++ b/airflow_dbt_python/hooks/remote/__init__.py @@ -33,7 +33,7 @@ class DbtRemoteHook(ABC, LoggingMixin): """ @abstractmethod - def download( + def _download( self, source: URL, destination: URL, @@ -44,7 +44,7 @@ def download( return NotImplemented @abstractmethod - def upload( + def _upload( self, source: URL, destination: URL, @@ -72,7 +72,7 @@ def download_dbt_project(self, source: URLLike, destination: URLLike) -> Path: if source_url.is_archive(): destination_url = destination_url / source_url.name - self.download(source_url, destination_url) + self._download(source_url, destination_url) if destination_url.exists() and destination_url.is_archive(): destination_url.extract() @@ -104,7 +104,7 @@ def download_dbt_profiles(self, source: URLLike, destination: URLLike) -> Path: if destination_url.is_dir() or destination_url.name != "profiles.yml": destination_url = destination_url / "profiles.yml" - self.download(source_url, destination_url) + self._download(source_url, destination_url) return destination_url.path @@ -134,7 +134,7 @@ def upload_dbt_project( source_url.archive(zip_url) source_url = zip_url - self.upload(source_url, destination_url, replace, delete_before) + self._upload(source_url, destination_url, replace, delete_before) if destination_url.is_archive(): source_url.unlink() diff --git a/airflow_dbt_python/hooks/git.py b/airflow_dbt_python/hooks/remote/git.py similarity index 99% rename from airflow_dbt_python/hooks/git.py rename to airflow_dbt_python/hooks/remote/git.py index 92e19ae..fb20826 100644 --- a/airflow_dbt_python/hooks/git.py +++ b/airflow_dbt_python/hooks/remote/git.py @@ -63,7 +63,7 @@ def __init__( **kwargs, ) - def upload( + def _upload( self, source: URL, destination: URL, @@ -130,7 +130,7 @@ def update_refs(refs): generate_pack_data=repo.generate_pack_data, ) - def download( + def _download( self, source: URL, destination: URL, diff --git a/airflow_dbt_python/hooks/localfs.py b/airflow_dbt_python/hooks/remote/localfs.py similarity index 99% rename from airflow_dbt_python/hooks/localfs.py rename to airflow_dbt_python/hooks/remote/localfs.py index 97597c5..a98bcf7 100644 --- a/airflow_dbt_python/hooks/localfs.py +++ b/airflow_dbt_python/hooks/remote/localfs.py @@ -52,7 +52,7 @@ def get_url(self, url: Optional[URL]) -> URL: return URL(self.basepath) / url - def download( + def _download( self, source: URL, destination: URL, @@ -70,7 +70,7 @@ def download( else: self.copy_one(source, destination, replace) - def upload( + def _upload( self, source: URL, destination: URL, diff --git a/airflow_dbt_python/hooks/s3.py b/airflow_dbt_python/hooks/remote/s3.py similarity index 98% rename from airflow_dbt_python/hooks/s3.py rename to airflow_dbt_python/hooks/remote/s3.py index e08619e..2acb271 100644 --- a/airflow_dbt_python/hooks/s3.py +++ b/airflow_dbt_python/hooks/remote/s3.py @@ -26,7 +26,7 @@ def __init__(self, *args, **kwargs): """Initialize a dbt remote for AWS S3.""" super().__init__(*args, **kwargs) - def upload( + def _upload( self, source: URL, destination: URL, @@ -110,7 +110,7 @@ def load_file_handle_replace_error( return success - def download( + def _download( self, source: URL, destination: URL, @@ -188,7 +188,7 @@ def download_s3_object( except IsADirectoryError: # Uploading files manually via the AWS UI to S3 can cause files - # with empty names to appear. When we attemp to download it, we build + # with empty names to appear. When we attempt to download it, we build # a relative path that is equal to the parent directory that already # exists. self.log.warning("A file with no name was found in S3 at %s", s3_object) diff --git a/docs/reference/hooks.rst b/docs/reference/hooks.rst index b946a52..2aaed4c 100644 --- a/docs/reference/hooks.rst +++ b/docs/reference/hooks.rst @@ -19,17 +19,17 @@ The DbtRemoteHook interface *dbt* git remote ^^^^^^^^^^^^^^^^ -.. automodule:: airflow_dbt_python.hooks.git +.. automodule:: airflow_dbt_python.hooks.remote.git :members: *dbt* localfs remote ^^^^^^^^^^^^^^^^^^^^ -.. automodule:: airflow_dbt_python.hooks.localfs +.. automodule:: airflow_dbt_python.hooks.remote.localfs :members: *dbt* S3 remote ^^^^^^^^^^^^^^^^ -.. automodule:: airflow_dbt_python.hooks.s3 +.. automodule:: airflow_dbt_python.hooks.remote.s3 :members: diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 515edff..80139e6 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -11,7 +11,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_remote = pytest.mark.skipif( @@ -20,7 +20,7 @@ condition = False try: - from airflow_dbt_python.hooks.git import DbtGitRemoteHook + from airflow_dbt_python.hooks.remote.git import DbtGitRemoteHook except ImportError: condition = True no_git_remote = pytest.mark.skipif( diff --git a/tests/hooks/test_git_hook.py b/tests/hooks/test_git_hook.py index 1ce8716..6009c3a 100644 --- a/tests/hooks/test_git_hook.py +++ b/tests/hooks/test_git_hook.py @@ -9,7 +9,7 @@ from dulwich.repo import Repo from dulwich.server import DictBackend, TCPGitServer -from airflow_dbt_python.hooks.git import DbtGitRemoteHook +from airflow_dbt_python.hooks.remote.git import DbtGitRemoteHook from airflow_dbt_python.utils.url import URL JAFFLE_SHOP = os.getenv("GIT_TEST_REPO", "tomasfarias/jaffle_shop") diff --git a/tests/hooks/test_localfs_hook.py b/tests/hooks/test_localfs_hook.py index 4ec34b9..763cbda 100644 --- a/tests/hooks/test_localfs_hook.py +++ b/tests/hooks/test_localfs_hook.py @@ -4,8 +4,7 @@ from pathlib import Path from zipfile import ZipFile -from airflow_dbt_python.hooks.localfs import DbtLocalFsRemoteHook -from airflow_dbt_python.utils.url import URL +from airflow_dbt_python.hooks.remote.localfs import DbtLocalFsRemoteHook def test_download_dbt_profiles(tmpdir, profiles_file): diff --git a/tests/hooks/test_s3_hook.py b/tests/hooks/test_s3_hook.py index 271bead..e649b7f 100644 --- a/tests/hooks/test_s3_hook.py +++ b/tests/hooks/test_s3_hook.py @@ -7,7 +7,7 @@ import pytest try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: pytest.skip( "S3 Remote not available, consider installing amazon extras", diff --git a/tests/operators/test_dbt_build.py b/tests/operators/test_dbt_build.py index d8ad047..8ccc812 100644 --- a/tests/operators/test_dbt_build.py +++ b/tests/operators/test_dbt_build.py @@ -12,7 +12,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_remote = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_clean.py b/tests/operators/test_dbt_clean.py index 62a22ca..a4e55a1 100644 --- a/tests/operators/test_dbt_clean.py +++ b/tests/operators/test_dbt_clean.py @@ -7,7 +7,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_deps.py b/tests/operators/test_dbt_deps.py index 76595ee..de5675c 100644 --- a/tests/operators/test_dbt_deps.py +++ b/tests/operators/test_dbt_deps.py @@ -12,7 +12,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_docs_generate.py b/tests/operators/test_dbt_docs_generate.py index 2c46394..9509f40 100644 --- a/tests/operators/test_dbt_docs_generate.py +++ b/tests/operators/test_dbt_docs_generate.py @@ -7,7 +7,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_run.py b/tests/operators/test_dbt_run.py index 88e5399..b1fd64e 100644 --- a/tests/operators/test_dbt_run.py +++ b/tests/operators/test_dbt_run.py @@ -12,7 +12,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_seed.py b/tests/operators/test_dbt_seed.py index 961f222..109db97 100644 --- a/tests/operators/test_dbt_seed.py +++ b/tests/operators/test_dbt_seed.py @@ -12,7 +12,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( diff --git a/tests/operators/test_dbt_test.py b/tests/operators/test_dbt_test.py index d7dc912..cff6520 100644 --- a/tests/operators/test_dbt_test.py +++ b/tests/operators/test_dbt_test.py @@ -10,7 +10,7 @@ condition = False try: - from airflow_dbt_python.hooks.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( From f30c9f0e428fd22b9f08e94b58ca85bd7bd8f086 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Fri, 28 Feb 2025 17:00:56 +0300 Subject: [PATCH 07/24] fix: profiles_dir must be used if specified. close #133 --- airflow_dbt_python/hooks/dbt.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index 73b43f7..106ec22 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -367,23 +367,22 @@ def prepare_directory( project_dir, tmp_dir, ) - new_project_dir = str(project_dir_path) + "/" - - if (project_dir_path / "profiles.yml").exists(): - # We may have downloaded the profiles.yml file together - # with the project. - return new_project_dir, new_project_dir if profiles_dir is not None: profiles_file_path = self.download_dbt_profiles( profiles_dir, tmp_dir, ) - new_profiles_dir = str(profiles_file_path.parent) + "/" + profiles_dir_path = profiles_file_path.parent + elif (project_dir_path / "profiles.yml").exists(): + profiles_dir_path = project_dir_path else: - new_profiles_dir = None + profiles_dir_path = None - return new_project_dir, new_profiles_dir + return ( + str(project_dir_path) + os.sep, + str(profiles_dir_path) + os.sep if profiles_dir_path is not None else None, + ) def setup_dbt_logging(self, debug: Optional[bool]): """Setup dbt logging. From ef78d193dee074abe7521833632b1432765fd8f4 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 26 Feb 2025 11:09:44 +0300 Subject: [PATCH 08/24] fix: add missing config args --- airflow_dbt_python/utils/configs.py | 14 +++++++++++--- tests/hooks/dbt/test_dbt_hook_base.py | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/airflow_dbt_python/utils/configs.py b/airflow_dbt_python/utils/configs.py index 55569b5..b1c366b 100644 --- a/airflow_dbt_python/utils/configs.py +++ b/airflow_dbt_python/utils/configs.py @@ -140,8 +140,6 @@ class BaseConfig: default=None, repr=False ) - require_resource_names_without_spaces: bool = False - add_package: Optional[Package] = None dry_run: bool = False lock: bool = False @@ -149,11 +147,21 @@ class BaseConfig: upgrade: bool = False require_model_names_without_spaces: bool = False - source_freshness_run_project_hooks: bool = False exclude_resource_types: list[str] = dataclasses.field( default_factory=list, repr=False ) + # legacy behaviors - https://github.com/dbt-labs/dbt-core/blob/main/docs/guides/behavior-change-flags.md + require_batched_execution_for_custom_microbatch_strategy: bool = False + require_explicit_package_overrides_for_builtin_materializations: bool = True + require_resource_names_without_spaces: bool = False + source_freshness_run_project_hooks: bool = False + skip_nodes_if_on_run_start_fails: bool = False + state_modified_compare_more_unrendered_values: bool = False + state_modified_compare_vars: bool = False + require_yaml_configuration_for_mf_time_spines: bool = False + require_nested_cumulative_type_params: bool = False + def __post_init__(self): """Post initialization actions for a dbt configuration.""" self.vars = parse_yaml_args(self.vars) diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 80139e6..47234c2 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -144,7 +144,7 @@ def test_dbt_hook_get_dbt_target_from_connection(airflow_conns, database): assert conn_id in extra_target assert extra_target[conn_id]["user"] == database.user assert extra_target[conn_id]["password"] == database.password - assert extra_target[conn_id]["dbname"] == database.dbname + assert extra_target[conn_id]["database"] == database.dbname @pytest.mark.parametrize("conn_id", ["non_existent", None]) @@ -192,7 +192,7 @@ def test_dbt_hook_get_target_from_empty_connection(no_user_airflow_conn, databas assert extra_target is not None assert no_user_airflow_conn in extra_target assert extra_target[no_user_airflow_conn].get("user") is None - assert extra_target[no_user_airflow_conn]["dbname"] == database.dbname + assert extra_target[no_user_airflow_conn]["database"] == database.dbname class FakeConnection: @@ -231,7 +231,7 @@ def hook_with_conn_parameters(conn_params, conn_extra_params): "type": "postgres", "host": "localhost", "schema": "test", - "user": "user", + "login": "user", "port": 5432, "extra_param": 123, }, From c0542ef667f5ceb8755056f12dabaae635a29d6b Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 19 Feb 2025 15:51:36 +0300 Subject: [PATCH 09/24] feat: adapter specific hooks. close #147 --- .github/workflows/ci.yaml | 3 +- airflow_dbt_python/hooks/dbt.py | 205 +++++++++++++++---- airflow_dbt_python/utils/configs.py | 3 +- tests/conftest.py | 66 +++++- tests/profiles/bigquery_sa_file.json | 8 + tests/profiles/bigquery_sa_file.yml | 9 + tests/profiles/bigquery_sa_json.json | 19 ++ tests/profiles/bigquery_sa_json.yml | 21 ++ tests/profiles/postgres.json | 20 ++ tests/profiles/postgres.yml | 20 ++ tests/profiles/redshift.json | 15 ++ tests/profiles/redshift.yml | 18 ++ tests/profiles/redshift_iam.json | 19 ++ tests/profiles/redshift_iam.yml | 24 +++ tests/profiles/snowflake.json | 18 ++ tests/profiles/snowflake.yml | 24 +++ tests/profiles/snowflake_external_oauth.json | 20 ++ tests/profiles/snowflake_external_oauth.yml | 26 +++ tests/profiles/snowflake_jwt.json | 19 ++ tests/profiles/snowflake_jwt.yml | 26 +++ tests/profiles/snowflake_mfa.json | 19 ++ tests/profiles/snowflake_mfa.yml | 25 +++ tests/profiles/snowflake_oauth.json | 20 ++ tests/profiles/snowflake_oauth.yml | 26 +++ tests/profiles/snowflake_sso.json | 18 ++ tests/profiles/snowflake_sso.yml | 24 +++ tests/profiles/spark_http.json | 18 ++ tests/profiles/spark_http.yml | 19 ++ tests/profiles/spark_odbc.json | 17 ++ tests/profiles/spark_odbc.yml | 19 ++ tests/profiles/spark_session.json | 12 ++ tests/profiles/spark_session.yml | 10 + tests/profiles/spark_thrift.json | 16 ++ tests/profiles/spark_thrift.yml | 17 ++ tests/utils/test_configs.py | 43 ++++ 35 files changed, 839 insertions(+), 47 deletions(-) create mode 100644 tests/profiles/bigquery_sa_file.json create mode 100644 tests/profiles/bigquery_sa_file.yml create mode 100644 tests/profiles/bigquery_sa_json.json create mode 100644 tests/profiles/bigquery_sa_json.yml create mode 100644 tests/profiles/postgres.json create mode 100644 tests/profiles/postgres.yml create mode 100644 tests/profiles/redshift.json create mode 100644 tests/profiles/redshift.yml create mode 100644 tests/profiles/redshift_iam.json create mode 100644 tests/profiles/redshift_iam.yml create mode 100644 tests/profiles/snowflake.json create mode 100644 tests/profiles/snowflake.yml create mode 100644 tests/profiles/snowflake_external_oauth.json create mode 100644 tests/profiles/snowflake_external_oauth.yml create mode 100644 tests/profiles/snowflake_jwt.json create mode 100644 tests/profiles/snowflake_jwt.yml create mode 100644 tests/profiles/snowflake_mfa.json create mode 100644 tests/profiles/snowflake_mfa.yml create mode 100644 tests/profiles/snowflake_oauth.json create mode 100644 tests/profiles/snowflake_oauth.yml create mode 100644 tests/profiles/snowflake_sso.json create mode 100644 tests/profiles/snowflake_sso.yml create mode 100644 tests/profiles/spark_http.json create mode 100644 tests/profiles/spark_http.yml create mode 100644 tests/profiles/spark_odbc.json create mode 100644 tests/profiles/spark_odbc.yml create mode 100644 tests/profiles/spark_session.json create mode 100644 tests/profiles/spark_session.yml create mode 100644 tests/profiles/spark_thrift.json create mode 100644 tests/profiles/spark_thrift.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a83084f..a00c027 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -85,9 +85,8 @@ jobs: poetry env use ${{ matrix.python-version }} poetry add "apache-airflow~=${{ matrix.airflow-version }}.0" \ "dbt-core~=${{ matrix.dbt-version }}.0" \ - "dbt-postgres~=${{ matrix.dbt-version }}.0" \ --python ${{ matrix.python-version }} - poetry install -E postgres --with dev + poetry install -E adapters --with dev poetry run airflow db migrate poetry run airflow connections create-default-connections diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index 106ec22..f65243d 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -4,13 +4,17 @@ import json import logging +import os +import re import sys from contextlib import contextmanager +from copy import copy from pathlib import Path from tempfile import TemporaryDirectory from typing import ( TYPE_CHECKING, Any, + Callable, Dict, Iterable, Iterator, @@ -69,6 +73,7 @@ class DbtConnectionParam(NamedTuple): name: str store_override_name: Optional[str] = None default: Optional[Any] = None + depends_on: Callable[[Connection], bool] = lambda x: True @property def override_name(self): @@ -119,9 +124,8 @@ class DbtHook(BaseHook): conn_params: list[Union[DbtConnectionParam, str]] = [ DbtConnectionParam("conn_type", "type"), "host", - DbtConnectionParam("conn_id", "dbname"), "schema", - DbtConnectionParam("login", "user"), + "login", "password", "port", ] @@ -240,8 +244,6 @@ def run_dbt_task( nearest_project_dir = get_nearest_project_dir(config.project_dir) with chdir_ctx(nearest_project_dir): - self.ensure_profiles(config) - with adapter_management(): task, runtime_config = config.create_dbt_task( extra_target, write_perf_info @@ -412,19 +414,6 @@ def setup_dbt_logging(self, debug: Optional[bool]): configured_file.setLevel("INFO") configured_file.propagate = False - def ensure_profiles(self, config: BaseConfig): - """Ensure a profiles file exists.""" - if config.profiles_dir is not None: - # We expect one to exist given that we have passed a profiles_dir. - return - - profiles_path = Path.home() / ".dbt/profiles.yml" - config.profiles_dir = str(profiles_path.parent) - if not profiles_path.exists(): - profiles_path.parent.mkdir(exist_ok=True) - with profiles_path.open("w", encoding="utf-8") as f: - f.write("flags:\n send_anonymous_usage_stats: false\n") - def get_dbt_target_from_connection( self, target: Optional[str] ) -> Optional[dict[str, Any]]: @@ -454,11 +443,14 @@ def get_dbt_target_from_connection( ) return None - details = self.get_dbt_details_from_connection(conn) + db_hook_class = self.get_db_hook_class(conn) + + details = db_hook_class.get_dbt_details_from_connection(conn) return {conn_id: details} - def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: + @classmethod + def get_dbt_details_from_connection(cls, conn: Connection) -> dict[str, Any]: """Extract dbt connection details from Airflow Connection. dbt connection details may be present as Airflow Connection attributes or in the @@ -476,8 +468,10 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: A dictionary of dbt connection details. """ dbt_details = {} - for param in self.conn_params: + for param in cls.conn_params: if isinstance(param, DbtConnectionParam): + if not param.depends_on(conn): + continue key = param.override_name value = getattr(conn, param.name, param.default) else: @@ -491,11 +485,13 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: extra = conn.extra_dejson - if not self.conn_extra_params: + if not cls.conn_extra_params: return {**dbt_details, **extra} - for param in self.conn_extra_params: + for param in cls.conn_extra_params: if isinstance(param, DbtConnectionParam): + if not param.depends_on(conn): + continue key = param.override_name value = extra.get(param.name, param.default) else: @@ -509,6 +505,21 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: return dbt_details + @classmethod + def get_db_hook_class(cls, conn: Connection) -> type[DbtHook]: + """Get a dbt hook class depend on Airflow connection type.""" + known_dbt_hooks = ( + DbtPostgresHook, + DbtRedshiftHook, + DbtSnowflakeHook, + DbtBigQueryHook, + DbtSparkHook, + ) + for hook in known_dbt_hooks: + if hook.conn_type == conn.conn_type: + return hook + return DbtHook + class DbtPostgresHook(DbtHook): """A hook to interact with dbt using a Postgres connection.""" @@ -516,24 +527,53 @@ class DbtPostgresHook(DbtHook): conn_type = "postgres" hook_name = "dbt Postgres Hook" conn_params = [ - DbtConnectionParam("conn_type", "type", "postgres"), + DbtConnectionParam("conn_type", "type", conn_type), "host", - "schema", + DbtConnectionParam("schema", default="public"), DbtConnectionParam("login", "user"), "password", - "port", + DbtConnectionParam("port", default=5432), ] conn_extra_params = [ - "dbname", - "threads", - "keepalives_idle", + DbtConnectionParam("dbname", "database", "postgres"), "connect_timeout", - "retries", - "search_path", "role", + "search_path", + "keepalives_idle", "sslmode", + "sslcert", + "sslkey", + "sslrootcert", + "retries", ] + @classmethod + def get_dbt_details_from_connection(cls, conn: Connection) -> dict[str, Any]: + """Extract dbt connection details from Airflow Connection. + + dbt connection details may be present as Airflow Connection attributes or in the + Connection's extras. This class' conn_params and conn_extra_params will be used + to fetch required attributes from attributes and extras respectively. If + conn_extra_params is empty, we merge parameters with all extras. + + Subclasses may override this class attributes to narrow down the connection + details for a specific dbt target (like Postgres, or Redshift). + + Args: + conn: The Airflow Connection to extract dbt connection details from. + + Returns: + A dictionary of dbt connection details. + """ + if "options" in conn.extra_dejson: + conn = copy(conn) + extra_dejson = conn.extra_dejson + options = extra_dejson.pop("options") + for k, v in re.findall(r"-c (\w+)=(.*)$", options): + extra_dejson[k] = v + conn.extra = json.dumps(extra_dejson) + return super().get_dbt_details_from_connection(conn) + class DbtRedshiftHook(DbtPostgresHook): """A hook to interact with dbt using a Redshift connection.""" @@ -541,11 +581,15 @@ class DbtRedshiftHook(DbtPostgresHook): conn_type = "redshift" hook_name = "dbt Redshift Hook" conn_extra_params = DbtPostgresHook.conn_extra_params + [ - "ra3_node", + "method", + "cluster_id", "iam_profile", - "iam_duration_secons", "autocreate", "db_groups", + "ra3_node", + "connect_timeout", + "role", + "region", ] @@ -555,22 +599,101 @@ class DbtSnowflakeHook(DbtHook): conn_type = "snowflake" hook_name = "dbt Snowflake Hook" conn_params = [ - DbtConnectionParam("conn_type", "type", "postgres"), + DbtConnectionParam("conn_type", "type", conn_type), "host", "schema", - DbtConnectionParam("login", "user"), - "password", + DbtConnectionParam( + "login", + "user", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") != "oauth", + ), + DbtConnectionParam( + "login", + "oauth_client_id", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", + ), + DbtConnectionParam( + "password", + depends_on=lambda x: not any( + ( + *(k in x.extra_dejson for k in ("private_key_file", "private_key_content")), + x.extra_dejson.get("authenticator", "") == "oauth", + ), + ), + ), + DbtConnectionParam( + "password", + "private_key_passphrase", + depends_on=lambda x: any( + k in x.extra_dejson for k in ("private_key_file", "private_key_content") + ), + ), + DbtConnectionParam( + "password", + "oauth_client_secret", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", + ), ] conn_extra_params = [ - "account", - "role", - "database", "warehouse", - "threads", - "client_session_keep_alive", + "role", + "authenticator", "query_tag", - "connect_retries", + "client_session_keep_alive", "connect_timeout", "retry_on_database_errors", "retry_all", + "reuse_connections", + "account", + "database", + DbtConnectionParam("refresh_token", "token"), + DbtConnectionParam("private_key_file", "private_key_path"), + DbtConnectionParam("private_key_content", "private_key"), + ] + + +class DbtBigQueryHook(DbtHook): + """A hook to interact with dbt using a BigQuery connection.""" + + conn_type = "bigquery" + hook_name = "dbt BigQuery Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "schema", + ] + conn_extra_params = [ + DbtConnectionParam("keyfile_path", "keyfile"), + DbtConnectionParam("keyfile_dict", "keyfile_json"), + "method", + "database", + "schema", + "refresh_token", + "client_id", + "client_secret", + "token_uri", + "OPTIONAL_CONFIG", + ] + + +class DbtSparkHook(DbtHook): + """A hook to interact with dbt using a Spark connection.""" + + conn_type = "spark" + hook_name = "dbt Spark Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "host", + "port", + "schema", + DbtConnectionParam("login", "user"), + DbtConnectionParam( + "password", + depends_on=lambda x: x.extra_dejson.get("method", "") == "thrift", + ), + DbtConnectionParam( + "password", + "token", + depends_on=lambda x: x.extra_dejson.get("method", "") != "thrift", + ), ] + conn_extra_params = [] diff --git a/airflow_dbt_python/utils/configs.py b/airflow_dbt_python/utils/configs.py index b1c366b..5278ee8 100644 --- a/airflow_dbt_python/utils/configs.py +++ b/airflow_dbt_python/utils/configs.py @@ -282,8 +282,7 @@ def _runtime_initialize(): task._flattened_nodes.append(task.manifest.sources[uid]) else: raise DbtException( - f"Node selection returned {uid}, expected a node or a " - f"source" + f"Node selection returned {uid}, expected a node or a source" ) task.num_nodes = len( [n for n in task._flattened_nodes if not n.is_ephemeral_model] diff --git a/tests/conftest.py b/tests/conftest.py index a354828..cd9f0b5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,8 +4,12 @@ seed files, dbt configuration files, and temporary directories for everything. """ +from __future__ import annotations + +import json import shutil -from typing import List +from pathlib import Path +from typing import TYPE_CHECKING, Generator, List import boto3 import pytest @@ -16,6 +20,10 @@ from airflow_dbt_python.hooks.dbt import DbtHook +if TYPE_CHECKING: + from _pytest.fixtures import SubRequest + + PROFILES = """ flags: send_anonymous_usage_stats: false @@ -209,7 +217,7 @@ def airflow_conns(database): connections are set for now as our testing database is postgres. """ uris = ( - f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public?dbname={database.dbname}", + f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public?database={database.dbname}", f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public", ) ids = ( @@ -240,6 +248,60 @@ def airflow_conns(database): session.close() +@pytest.fixture(scope="session") +def private_key() -> tuple[str, str]: + """Generate a private key for testing.""" + import secrets + import string + + from cryptography.hazmat.primitives import serialization + from cryptography.hazmat.primitives.asymmetric import rsa + + password_length = 12 + characters = string.ascii_letters + string.digits + string.punctuation + password = "".join(secrets.choice(characters) for _ in range(password_length)) + + private_key = rsa.generate_private_key( + public_exponent=65537, + key_size=2048, + ) + pem_private_key = private_key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.BestAvailableEncryption( + password.encode(encoding="utf-8") + ), + ) + return pem_private_key.decode(encoding="utf-8"), password + + +@pytest.fixture +def profile_conn_id(request: SubRequest) -> Generator[str, None, None]: + """Create an Airflow connection by conn_id.""" + conn_id = request.param + session = settings.Session() + existing = session.query(Connection).filter_by(conn_id=conn_id).first() + if existing is not None: + # Connections may exist from previous test run. + session.delete(existing) + session.commit() + + conn_json_path = Path(__file__).parent / "profiles" / f"{conn_id}.json" + conn_kwargs = json.loads(conn_json_path.read_text()) + conn = Connection(conn_id=conn_id, **conn_kwargs) + + session.add(conn) + + session.commit() + + yield conn_id + + session.delete(conn) + + session.commit() + session.close() + + @pytest.fixture(scope="session") def dbt_project_dir(tmp_path_factory): """A temporary directory to store dbt test files.""" diff --git a/tests/profiles/bigquery_sa_file.json b/tests/profiles/bigquery_sa_file.json new file mode 100644 index 0000000..55fe609 --- /dev/null +++ b/tests/profiles/bigquery_sa_file.json @@ -0,0 +1,8 @@ +{ + "conn_type": "gcpbigquery", + "schema": "DBT_DATASET_NAME", + "extra": { + "project": "GCP_PROJECT_ID", + "key_path": "/PATH/TO/BIGQUERY/keyfile.json" + } +} diff --git a/tests/profiles/bigquery_sa_file.yml b/tests/profiles/bigquery_sa_file.yml new file mode 100644 index 0000000..a011c02 --- /dev/null +++ b/tests/profiles/bigquery_sa_file.yml @@ -0,0 +1,9 @@ +default: + target: bigquery_sa_file + outputs: + bigquery_sa_file: + type: bigquery + method: service-account + project: GCP_PROJECT_ID + dataset: DBT_DATASET_NAME + keyfile: /PATH/TO/BIGQUERY/keyfile.json diff --git a/tests/profiles/bigquery_sa_json.json b/tests/profiles/bigquery_sa_json.json new file mode 100644 index 0000000..867c5e3 --- /dev/null +++ b/tests/profiles/bigquery_sa_json.json @@ -0,0 +1,19 @@ +{ + "conn_type": "gcpbigquery", + "schema": "DBT_DATASET_NAME", + "extra": { + "project": "GCP_PROJECT_ID", + "keyfile_dict": { + "auth_provider_x509_cert_url": "xxx", + "auth_uri": "xxx", + "client_email": "xxx", + "client_id": "xxx", + "client_x509_cert_url": "xxx", + "private_key": "xxx", + "private_key_id": "xxx", + "project_id": "xxx", + "token_uri": "xxx", + "type": "xxx" + } + } +} diff --git a/tests/profiles/bigquery_sa_json.yml b/tests/profiles/bigquery_sa_json.yml new file mode 100644 index 0000000..b5589af --- /dev/null +++ b/tests/profiles/bigquery_sa_json.yml @@ -0,0 +1,21 @@ +default: + target: bigquery_sa_json + outputs: + bigquery_sa_json: + type: bigquery + method: service-account-json + project: GCP_PROJECT_ID + dataset: DBT_DATASET_NAME + + # These fields come from the service account json keyfile + keyfile_json: + type: xxx + project_id: xxx + private_key_id: xxx + private_key: xxx + client_email: xxx + client_id: xxx + auth_uri: xxx + token_uri: xxx + auth_provider_x509_cert_url: xxx + client_x509_cert_url: xxx diff --git a/tests/profiles/postgres.json b/tests/profiles/postgres.json new file mode 100644 index 0000000..5f16577 --- /dev/null +++ b/tests/profiles/postgres.json @@ -0,0 +1,20 @@ +{ + "conn_type": "postgres", + "host": "hostname", + "port": 5432, + "login": "my_username", + "password": "my_password", + "schema": "dbt_schema", + "extra": { + "dbname": "database_name", + "role": "my_role", + "sslmode": "require", + "sslcert": "postgresql.crt", + "sslkey": "postgresql.key", + "sslrootcert": "ca.crt", + "retries": 2, + "keepalives_idle": 10, + "connect_timeout": 20, + "options": "-c search_path=some path" + } +} diff --git a/tests/profiles/postgres.yml b/tests/profiles/postgres.yml new file mode 100644 index 0000000..48df944 --- /dev/null +++ b/tests/profiles/postgres.yml @@ -0,0 +1,20 @@ +default: + target: postgres + outputs: + postgres: + type: postgres + host: hostname + user: my_username + password: my_password + port: 5432 + dbname: database_name + schema: dbt_schema + keepalives_idle: 10 + connect_timeout: 20 + retries: 2 + search_path: "some path" + role: my_role + sslmode: require + sslcert: postgresql.crt + sslkey: postgresql.key + sslrootcert: ca.crt diff --git a/tests/profiles/redshift.json b/tests/profiles/redshift.json new file mode 100644 index 0000000..f05645c --- /dev/null +++ b/tests/profiles/redshift.json @@ -0,0 +1,15 @@ +{ + "conn_type": "redshift", + "host": "hostname.region.redshift.amazonaws.com", + "port": 5439, + "login": "username", + "password": "password1", + "schema": "analytics_schema", + "extra": { + "dbname": "analytics", + "sslmode": "prefer", + "role": "my_role", + "ra3_node": true, + "connect_timeout": 1 + } +} diff --git a/tests/profiles/redshift.yml b/tests/profiles/redshift.yml new file mode 100644 index 0000000..9b261c5 --- /dev/null +++ b/tests/profiles/redshift.yml @@ -0,0 +1,18 @@ +default: + target: redshift + outputs: + redshift: + type: redshift + host: hostname.region.redshift.amazonaws.com + user: username + password: password1 + dbname: analytics + schema: analytics_schema + port: 5439 + + # Optional Redshift configs: + sslmode: prefer + role: my_role + ra3_node: true + autocommit: true + connect_timeout: 1 diff --git a/tests/profiles/redshift_iam.json b/tests/profiles/redshift_iam.json new file mode 100644 index 0000000..b1964da --- /dev/null +++ b/tests/profiles/redshift_iam.json @@ -0,0 +1,19 @@ +{ + "conn_type": "redshift", + "host": "hostname.region.redshift.amazonaws.com", + "port": 5439, + "login": "alice", + "schema": "analytics_schema", + "extra": { + "dbname": "analytics", + "region": "us-east-1", + "iam_profile": "analyst", + "autocreate": true, + "db_groups": ["ANALYSTS"], + "cluster_id": "CLUSTER_ID", + "sslmode": "prefer", + "role": "my_role", + "ra3_node": true, + "connect_timeout": 2 + } +} diff --git a/tests/profiles/redshift_iam.yml b/tests/profiles/redshift_iam.yml new file mode 100644 index 0000000..7169897 --- /dev/null +++ b/tests/profiles/redshift_iam.yml @@ -0,0 +1,24 @@ +default: + target: redshift_iam + outputs: + redshift_iam: + type: redshift + method: iam + cluster_id: CLUSTER_ID + host: hostname.region.redshift.amazonaws.com + user: alice + iam_profile: analyst + region: us-east-1 + dbname: analytics + schema: analytics_schema + port: 5439 + + # Optional Redshift configs: + connect_timeout: 2 + retries: 1 + role: my_role + sslmode: prefer + ra3_node: true + autocommit: true + autocreate: true + db_groups: ['ANALYSTS'] diff --git a/tests/profiles/snowflake.json b/tests/profiles/snowflake.json new file mode 100644 index 0000000..f8cc385 --- /dev/null +++ b/tests/profiles/snowflake.json @@ -0,0 +1,18 @@ +{ + "conn_type": "snowflake", + "login": "test_user", + "password": "test_password", + "schema": "test_schema", + "extra": { + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true + } +} diff --git a/tests/profiles/snowflake.yml b/tests/profiles/snowflake.yml new file mode 100644 index 0000000..1728a88 --- /dev/null +++ b/tests/profiles/snowflake.yml @@ -0,0 +1,24 @@ +default: + target: snowflake + outputs: + snowflake: + type: snowflake + account: test_account.us-east-1 + + # User/password auth + user: test_user + password: test_password + + role: test_role + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/snowflake_external_oauth.json b/tests/profiles/snowflake_external_oauth.json new file mode 100644 index 0000000..ec4b212 --- /dev/null +++ b/tests/profiles/snowflake_external_oauth.json @@ -0,0 +1,20 @@ +{ + "conn_type": "snowflake", + "schema": "test_schema", + "login": "test_user", + "password": "OKTA_PASSWORD", + "extra": { + "authenticator": "https://dev-390798.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7", + "username": "OKTA_USERNAME", + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true + } +} diff --git a/tests/profiles/snowflake_external_oauth.yml b/tests/profiles/snowflake_external_oauth.yml new file mode 100644 index 0000000..b5a45d2 --- /dev/null +++ b/tests/profiles/snowflake_external_oauth.yml @@ -0,0 +1,26 @@ +default: + target: snowflake_external_oauth + outputs: + snowflake_external_oauth: + type: snowflake + account: test_account.us-east-1 + user: test_user + + # SSO config -- The three following fields are REQUIRED + authenticator: https://dev-390798.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7 + username: OKTA_USERNAME + password: OKTA_PASSWORD + + role: test_role + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/snowflake_jwt.json b/tests/profiles/snowflake_jwt.json new file mode 100644 index 0000000..14c0f25 --- /dev/null +++ b/tests/profiles/snowflake_jwt.json @@ -0,0 +1,19 @@ +{ + "conn_type": "snowflake", + "login": "test_user", + "password": "test_password", + "schema": "test_schema", + "extra": { + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true, + "private_key_file": "path/to/private.key" + } +} diff --git a/tests/profiles/snowflake_jwt.yml b/tests/profiles/snowflake_jwt.yml new file mode 100644 index 0000000..0843cc8 --- /dev/null +++ b/tests/profiles/snowflake_jwt.yml @@ -0,0 +1,26 @@ +default: + target: snowflake_jwt + outputs: + snowflake_jwt: + type: snowflake + account: test_account.us-east-1 + user: test_user + role: test_role + + # Keypair config + private_key_path: path/to/private.key + # or private_key instead of private_key_path + private_key_passphrase: test_password + + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/snowflake_mfa.json b/tests/profiles/snowflake_mfa.json new file mode 100644 index 0000000..0bbe9fc --- /dev/null +++ b/tests/profiles/snowflake_mfa.json @@ -0,0 +1,19 @@ +{ + "conn_type": "snowflake", + "login": "test_user", + "password": "test_password", + "schema": "test_schema", + "extra": { + "authenticator": "username_password_mfa", + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true + } +} diff --git a/tests/profiles/snowflake_mfa.yml b/tests/profiles/snowflake_mfa.yml new file mode 100644 index 0000000..26dbbe7 --- /dev/null +++ b/tests/profiles/snowflake_mfa.yml @@ -0,0 +1,25 @@ +default: + target: snowflake_mfa + outputs: + snowflake_mfa: + type: snowflake + account: test_account.us-east-1 + + # User/password auth + user: test_user + password: test_password + authenticator: username_password_mfa + + role: test_role + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/snowflake_oauth.json b/tests/profiles/snowflake_oauth.json new file mode 100644 index 0000000..fe1bf32 --- /dev/null +++ b/tests/profiles/snowflake_oauth.json @@ -0,0 +1,20 @@ +{ + "conn_type": "snowflake", + "schema": "test_schema", + "login": "my_oauth_client_id", + "password": "my_oauth_client_secret", + "extra": { + "authenticator": "oauth", + "refresh_token": "oauth_refresh_token", + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true + } +} diff --git a/tests/profiles/snowflake_oauth.yml b/tests/profiles/snowflake_oauth.yml new file mode 100644 index 0000000..32ed928 --- /dev/null +++ b/tests/profiles/snowflake_oauth.yml @@ -0,0 +1,26 @@ +default: + target: snowflake_oauth + outputs: + snowflake_oauth: + type: snowflake + account: test_account.us-east-1 + + # The following fields are retrieved from the Snowflake configuration + authenticator: oauth + oauth_client_id: my_oauth_client_id + oauth_client_secret: my_oauth_client_secret + token: oauth_refresh_token + + role: test_role + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/snowflake_sso.json b/tests/profiles/snowflake_sso.json new file mode 100644 index 0000000..7a11065 --- /dev/null +++ b/tests/profiles/snowflake_sso.json @@ -0,0 +1,18 @@ +{ + "conn_type": "snowflake", + "login": "test_user", + "schema": "test_schema", + "extra": { + "authenticator": "externalbrowser", + "account": "test_account.us-east-1", + "warehouse": "test_wh", + "database": "test_db", + "role": "test_role", + "client_session_keep_alive": true, + "query_tag": "some_tag", + "connect_timeout": 12, + "retry_on_database_errors": true, + "retry_all": true, + "reuse_connections": true + } +} diff --git a/tests/profiles/snowflake_sso.yml b/tests/profiles/snowflake_sso.yml new file mode 100644 index 0000000..10882b6 --- /dev/null +++ b/tests/profiles/snowflake_sso.yml @@ -0,0 +1,24 @@ +default: + target: snowflake_sso + outputs: + snowflake_sso: + type: snowflake + account: test_account.us-east-1 + user: test_user + role: test_role + + # SSO config + authenticator: externalbrowser + + database: test_db + warehouse: test_wh + schema: test_schema + client_session_keep_alive: True + query_tag: "some_tag" + + # optional + connect_retries: 1 + connect_timeout: 12 + retry_on_database_errors: True + retry_all: True + reuse_connections: True diff --git a/tests/profiles/spark_http.json b/tests/profiles/spark_http.json new file mode 100644 index 0000000..7f47614 --- /dev/null +++ b/tests/profiles/spark_http.json @@ -0,0 +1,18 @@ +{ + "conn_type": "spark_connect", + "host": "yourorg.sparkhost.com", + "port": 443, + "login": "username", + "password": "abc123", + "schema": "schema_name", + "extra": { + "method": "http", + "cluster": "cluster_id", + "organization": "my_org_id", + "connect_timeout": 60, + "connect_retries": 5, + "server_side_parameters": { + "spark.driver.memory": "4g" + } + } +} diff --git a/tests/profiles/spark_http.yml b/tests/profiles/spark_http.yml new file mode 100644 index 0000000..e773fc3 --- /dev/null +++ b/tests/profiles/spark_http.yml @@ -0,0 +1,19 @@ +default: + target: spark_http + outputs: + spark_http: + type: spark + method: http + schema: schema_name + host: yourorg.sparkhost.com + organization: my_org_id + token: abc123 + cluster: cluster_id + + # optional + port: 443 + user: username + connect_timeout: 60 + connect_retries: 5 + server_side_parameters: + "spark.driver.memory": "4g" diff --git a/tests/profiles/spark_odbc.json b/tests/profiles/spark_odbc.json new file mode 100644 index 0000000..19334e7 --- /dev/null +++ b/tests/profiles/spark_odbc.json @@ -0,0 +1,17 @@ +{ + "conn_type": "spark_connect", + "host": "yourorg.sparkhost.com", + "port": 444, + "login": "username", + "password": "abc123", + "schema": "schema_name", + "extra": { + "method": "odbc", + "driver": "/path/to/driver", + "endpoint": "endpoint_id", + "organization": "my_org_id", + "server_side_parameters": { + "spark.driver.memory": "4g" + } + } +} diff --git a/tests/profiles/spark_odbc.yml b/tests/profiles/spark_odbc.yml new file mode 100644 index 0000000..85889f4 --- /dev/null +++ b/tests/profiles/spark_odbc.yml @@ -0,0 +1,19 @@ +default: + target: spark_odbc + outputs: + spark_odbc: + type: spark + method: odbc + driver: /path/to/driver + schema: schema_name + host: yourorg.sparkhost.com + organization: my_org_id + token: abc123 + + endpoint: endpoint_id + + # optional + port: 444 + user: username + server_side_parameters: + "spark.driver.memory": "4g" diff --git a/tests/profiles/spark_session.json b/tests/profiles/spark_session.json new file mode 100644 index 0000000..dd841f1 --- /dev/null +++ b/tests/profiles/spark_session.json @@ -0,0 +1,12 @@ +{ + "conn_type": "spark_connect", + "host": "NA", + "port": 443, + "schema": "schema_name", + "extra": { + "method": "session", + "server_side_parameters": { + "spark.driver.memory": "4g" + } + } +} diff --git a/tests/profiles/spark_session.yml b/tests/profiles/spark_session.yml new file mode 100644 index 0000000..b8e26d6 --- /dev/null +++ b/tests/profiles/spark_session.yml @@ -0,0 +1,10 @@ +default: + target: spark_session + outputs: + spark_session: + type: spark + method: session + schema: schema_name + host: NA # not used, but required by `dbt-core` + server_side_parameters: + "spark.driver.memory": "4g" diff --git a/tests/profiles/spark_thrift.json b/tests/profiles/spark_thrift.json new file mode 100644 index 0000000..351c849 --- /dev/null +++ b/tests/profiles/spark_thrift.json @@ -0,0 +1,16 @@ +{ + "conn_type": "spark_connect", + "host": "yourorg.sparkhost.com", + "port": 10001, + "login": "username", + "schema": "schema_name", + "extra": { + "method": "thrift", + "auth": "KERBEROS", + "kerberos_service_name": "hive", + "use_ssl": true, + "server_side_parameters": { + "spark.driver.memory": "4g" + } + } +} diff --git a/tests/profiles/spark_thrift.yml b/tests/profiles/spark_thrift.yml new file mode 100644 index 0000000..25e654a --- /dev/null +++ b/tests/profiles/spark_thrift.yml @@ -0,0 +1,17 @@ +default: + target: spark_thrift + outputs: + spark_thrift: + type: spark + method: thrift + schema: schema_name + host: yourorg.sparkhost.com + + # optional + port: 10001 + user: username + auth: KERBEROS + kerberos_service_name: hive + use_ssl: true + server_side_parameters: + "spark.driver.memory": "4g" diff --git a/tests/utils/test_configs.py b/tests/utils/test_configs.py index e56fe8a..f06ea2c 100644 --- a/tests/utils/test_configs.py +++ b/tests/utils/test_configs.py @@ -1,9 +1,11 @@ """Unit test module for dbt task configuration utilities.""" import os +from pathlib import Path from unittest.mock import patch import pytest +from dbt import flags from dbt.exceptions import DbtProfileError, EnvVarMissingError from dbt.task.build import BuildTask from dbt.task.compile import CompileTask @@ -11,6 +13,7 @@ from dbt.task.deps import DepsTask from dbt.task.run import RunTask +from airflow_dbt_python.hooks.dbt import DbtHook from airflow_dbt_python.utils.configs import ( BaseConfig, BuildTaskConfig, @@ -313,6 +316,46 @@ def test_base_config_create_dbt_profile_with_extra_target( assert target["type"] == "postgres" +profiles = sorted( + f.stem for f in Path(__file__).parent.parent.joinpath("profiles").glob("*.json") +) + + +@pytest.mark.parametrize( + "profile_conn_id", profiles, ids=profiles, indirect=["profile_conn_id"] +) +def test_create_db_specific_dbt_profile_with_extra_target( + profile_conn_id, dbt_project_file +): + """Test Airflow connections that they can be used in both Airflow and dbt.""" + # Profile from Airflow connection + config = BaseConfig( + target=profile_conn_id, + project_dir=dbt_project_file.parent, + profiles_dir=None, + ) + flags.set_from_args(config, {}) + + hook = DbtHook(dbt_conn_id=profile_conn_id) + extra_target = hook.get_dbt_target_from_connection(profile_conn_id) + profile_from_conn = config.create_dbt_profile(extra_target) + + profiles = Path(__file__).parent.parent / "profiles" + yaml_profile = profiles / f"{profile_conn_id}.yml" + yaml_profile_data = yaml_profile.read_text() + + profile_file = dbt_project_file.parent / "profiles.yml" + profile_file.write_text(yaml_profile_data) + + # Profile from Yaml + config = BaseConfig( + project_dir=dbt_project_file.parent, + profiles_dir=dbt_project_file.parent, + ) + profile_from_yaml = config.create_dbt_profile() + assert profile_from_conn == profile_from_yaml + + def test_base_config_create_dbt_profile_with_extra_target_no_profile( hook, dbt_project_file, airflow_conns ): From 20566d9421250f855e56a49cea38bdbcf8eea003 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Thu, 27 Feb 2025 19:26:13 +0300 Subject: [PATCH 10/24] feat: separate hook to get extra target based on Airflow connection --- airflow_dbt_python/hooks/dbt.py | 361 ++------------------------ airflow_dbt_python/hooks/target.py | 351 +++++++++++++++++++++++++ airflow_dbt_python/operators/dbt.py | 4 +- airflow_dbt_python/utils/configs.py | 6 +- tests/conftest.py | 8 +- tests/dags/test_dbt_dags.py | 14 +- tests/hooks/dbt/test_dbt_hook_base.py | 44 ++-- tests/hooks/dbt/test_dbt_run.py | 10 +- tests/hooks/dbt/test_dbt_seed.py | 7 +- tests/operators/test_dbt_run.py | 12 +- tests/operators/test_dbt_seed.py | 12 +- tests/utils/test_configs.py | 45 ++-- 12 files changed, 455 insertions(+), 419 deletions(-) create mode 100644 airflow_dbt_python/hooks/target.py diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index f65243d..59fb038 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -5,29 +5,25 @@ import json import logging import os -import re import sys +from abc import ABC from contextlib import contextmanager -from copy import copy from pathlib import Path from tempfile import TemporaryDirectory from typing import ( TYPE_CHECKING, Any, - Callable, Dict, Iterable, Iterator, NamedTuple, Optional, Tuple, - Union, ) from urllib.parse import urlparse from airflow.exceptions import AirflowException -from airflow.hooks.base import BaseHook -from airflow.models.connection import Connection +from airflow.utils.log.logging_mixin import LoggingMixin if sys.version_info >= (3, 11): from contextlib import chdir as chdir_ctx @@ -36,9 +32,9 @@ if TYPE_CHECKING: from dbt.contracts.results import RunResult - from dbt.task.base import BaseTask from airflow_dbt_python.hooks.remote import DbtRemoteHook + from airflow_dbt_python.hooks.target import DbtConnectionHook from airflow_dbt_python.utils.configs import BaseConfig from airflow_dbt_python.utils.url import URLLike @@ -59,36 +55,6 @@ class DbtTaskResult(NamedTuple): artifacts: dict[str, Any] -class DbtConnectionParam(NamedTuple): - """A tuple indicating connection parameters relevant to dbt. - - Attributes: - name: The name of the connection parameter. This name will be used to get the - parameter from an Airflow Connection or its extras. - store_override_name: A new name for the connection parameter. If not None, this - is the name used in a dbt profiles. - default: A default value if the parameter is not found. - """ - - name: str - store_override_name: Optional[str] = None - default: Optional[Any] = None - depends_on: Callable[[Connection], bool] = lambda x: True - - @property - def override_name(self): - """Returns the override_name if defined, otherwise defaults to name. - - >>> DbtConnectionParam("login", "user").override_name - 'user' - >>> DbtConnectionParam("port").override_name - 'port' - """ - if self.store_override_name is None: - return self.name - return self.store_override_name - - class DbtTemporaryDirectory(TemporaryDirectory): """A wrapper on TemporaryDirectory for older versions of Python. @@ -110,31 +76,16 @@ def __init__(self, suffix=None, prefix=None, dir=None, ignore_cleanup_errors=Tru ) -class DbtHook(BaseHook): +class DbtHook(ABC, LoggingMixin): """A hook to interact with dbt. Allows for running dbt tasks and provides required configurations for each task. """ - conn_name_attr = "dbt_conn_id" - default_conn_name = "dbt_default" - conn_type = "dbt" - hook_name = "dbt Hook" - - conn_params: list[Union[DbtConnectionParam, str]] = [ - DbtConnectionParam("conn_type", "type"), - "host", - "schema", - "login", - "password", - "port", - ] - conn_extra_params: list[Union[DbtConnectionParam, str]] = [] - def __init__( self, *args, - dbt_conn_id: Optional[str] = default_conn_name, + dbt_conn_id: Optional[str] = None, project_conn_id: Optional[str] = None, profiles_conn_id: Optional[str] = None, **kwargs, @@ -144,7 +95,15 @@ def __init__( self.profiles_conn_id = profiles_conn_id super().__init__(*args, **kwargs) - def get_remote(self, scheme: str, conn_id: Optional[str]) -> DbtRemoteHook: + @staticmethod + def get_dbt_target_hook(conn_id: str) -> DbtConnectionHook: + """Get a hook to get a dbt profile based on the Airflow connection.""" + from .target import DbtConnectionHook + + return DbtConnectionHook.get_db_conn_hook(conn_id) + + @staticmethod + def get_remote(scheme: str, conn_id: Optional[str]) -> DbtRemoteHook: """Get a remote to interact with dbt files. RemoteHooks are defined by the scheme we are looking for and an optional @@ -229,8 +188,14 @@ def run_dbt_task( from dbt.task.deps import DepsTask from dbt.tracking import track_run + if self.dbt_conn_id: + kwargs["target"] = self.dbt_conn_id + target_hook = self.get_dbt_target_hook(self.dbt_conn_id) + extra_target = target_hook.get_dbt_target_from_connection() + else: + extra_target = None + config = self.get_dbt_task_config(command, **kwargs) - extra_target = self.get_dbt_target_from_connection(config.target) with self.dbt_directory( config, @@ -413,287 +378,3 @@ def setup_dbt_logging(self, debug: Optional[bool]): file_log.propagate = False configured_file.setLevel("INFO") configured_file.propagate = False - - def get_dbt_target_from_connection( - self, target: Optional[str] - ) -> Optional[dict[str, Any]]: - """Return a dictionary of connection details to use as a dbt target. - - The connection details are fetched from an Airflow connection identified by - target or self.dbt_conn_id. - - Args: - target: The target name to use as an Airflow connection ID. If ommitted, we - will use self.dbt_conn_id. - - Returns: - A dictionary with a configuration for a dbt target, or None if a matching - Airflow connection is not found for given dbt target. - """ - conn_id = target or self.dbt_conn_id - - if conn_id is None: - return None - - try: - conn = self.get_connection(conn_id) - except AirflowException: - self.log.debug( - "No Airflow connection matching dbt target %s was found.", target - ) - return None - - db_hook_class = self.get_db_hook_class(conn) - - details = db_hook_class.get_dbt_details_from_connection(conn) - - return {conn_id: details} - - @classmethod - def get_dbt_details_from_connection(cls, conn: Connection) -> dict[str, Any]: - """Extract dbt connection details from Airflow Connection. - - dbt connection details may be present as Airflow Connection attributes or in the - Connection's extras. This class' conn_params and conn_extra_params will be used - to fetch required attributes from attributes and extras respectively. If - conn_extra_params is empty, we merge parameters with all extras. - - Subclasses may override this class attributes to narrow down the connection - details for a specific dbt target (like Postgres, or Redshift). - - Args: - conn: The Airflow Connection to extract dbt connection details from. - - Returns: - A dictionary of dbt connection details. - """ - dbt_details = {} - for param in cls.conn_params: - if isinstance(param, DbtConnectionParam): - if not param.depends_on(conn): - continue - key = param.override_name - value = getattr(conn, param.name, param.default) - else: - key = param - value = getattr(conn, key, None) - - if value is None: - continue - - dbt_details[key] = value - - extra = conn.extra_dejson - - if not cls.conn_extra_params: - return {**dbt_details, **extra} - - for param in cls.conn_extra_params: - if isinstance(param, DbtConnectionParam): - if not param.depends_on(conn): - continue - key = param.override_name - value = extra.get(param.name, param.default) - else: - key = param - value = extra.get(key, None) - - if value is None: - continue - - dbt_details[key] = value - - return dbt_details - - @classmethod - def get_db_hook_class(cls, conn: Connection) -> type[DbtHook]: - """Get a dbt hook class depend on Airflow connection type.""" - known_dbt_hooks = ( - DbtPostgresHook, - DbtRedshiftHook, - DbtSnowflakeHook, - DbtBigQueryHook, - DbtSparkHook, - ) - for hook in known_dbt_hooks: - if hook.conn_type == conn.conn_type: - return hook - return DbtHook - - -class DbtPostgresHook(DbtHook): - """A hook to interact with dbt using a Postgres connection.""" - - conn_type = "postgres" - hook_name = "dbt Postgres Hook" - conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), - "host", - DbtConnectionParam("schema", default="public"), - DbtConnectionParam("login", "user"), - "password", - DbtConnectionParam("port", default=5432), - ] - conn_extra_params = [ - DbtConnectionParam("dbname", "database", "postgres"), - "connect_timeout", - "role", - "search_path", - "keepalives_idle", - "sslmode", - "sslcert", - "sslkey", - "sslrootcert", - "retries", - ] - - @classmethod - def get_dbt_details_from_connection(cls, conn: Connection) -> dict[str, Any]: - """Extract dbt connection details from Airflow Connection. - - dbt connection details may be present as Airflow Connection attributes or in the - Connection's extras. This class' conn_params and conn_extra_params will be used - to fetch required attributes from attributes and extras respectively. If - conn_extra_params is empty, we merge parameters with all extras. - - Subclasses may override this class attributes to narrow down the connection - details for a specific dbt target (like Postgres, or Redshift). - - Args: - conn: The Airflow Connection to extract dbt connection details from. - - Returns: - A dictionary of dbt connection details. - """ - if "options" in conn.extra_dejson: - conn = copy(conn) - extra_dejson = conn.extra_dejson - options = extra_dejson.pop("options") - for k, v in re.findall(r"-c (\w+)=(.*)$", options): - extra_dejson[k] = v - conn.extra = json.dumps(extra_dejson) - return super().get_dbt_details_from_connection(conn) - - -class DbtRedshiftHook(DbtPostgresHook): - """A hook to interact with dbt using a Redshift connection.""" - - conn_type = "redshift" - hook_name = "dbt Redshift Hook" - conn_extra_params = DbtPostgresHook.conn_extra_params + [ - "method", - "cluster_id", - "iam_profile", - "autocreate", - "db_groups", - "ra3_node", - "connect_timeout", - "role", - "region", - ] - - -class DbtSnowflakeHook(DbtHook): - """A hook to interact with dbt using a Snowflake connection.""" - - conn_type = "snowflake" - hook_name = "dbt Snowflake Hook" - conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), - "host", - "schema", - DbtConnectionParam( - "login", - "user", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") != "oauth", - ), - DbtConnectionParam( - "login", - "oauth_client_id", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", - ), - DbtConnectionParam( - "password", - depends_on=lambda x: not any( - ( - *(k in x.extra_dejson for k in ("private_key_file", "private_key_content")), - x.extra_dejson.get("authenticator", "") == "oauth", - ), - ), - ), - DbtConnectionParam( - "password", - "private_key_passphrase", - depends_on=lambda x: any( - k in x.extra_dejson for k in ("private_key_file", "private_key_content") - ), - ), - DbtConnectionParam( - "password", - "oauth_client_secret", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", - ), - ] - conn_extra_params = [ - "warehouse", - "role", - "authenticator", - "query_tag", - "client_session_keep_alive", - "connect_timeout", - "retry_on_database_errors", - "retry_all", - "reuse_connections", - "account", - "database", - DbtConnectionParam("refresh_token", "token"), - DbtConnectionParam("private_key_file", "private_key_path"), - DbtConnectionParam("private_key_content", "private_key"), - ] - - -class DbtBigQueryHook(DbtHook): - """A hook to interact with dbt using a BigQuery connection.""" - - conn_type = "bigquery" - hook_name = "dbt BigQuery Hook" - conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), - "schema", - ] - conn_extra_params = [ - DbtConnectionParam("keyfile_path", "keyfile"), - DbtConnectionParam("keyfile_dict", "keyfile_json"), - "method", - "database", - "schema", - "refresh_token", - "client_id", - "client_secret", - "token_uri", - "OPTIONAL_CONFIG", - ] - - -class DbtSparkHook(DbtHook): - """A hook to interact with dbt using a Spark connection.""" - - conn_type = "spark" - hook_name = "dbt Spark Hook" - conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), - "host", - "port", - "schema", - DbtConnectionParam("login", "user"), - DbtConnectionParam( - "password", - depends_on=lambda x: x.extra_dejson.get("method", "") == "thrift", - ), - DbtConnectionParam( - "password", - "token", - depends_on=lambda x: x.extra_dejson.get("method", "") != "thrift", - ), - ] - conn_extra_params = [] diff --git a/airflow_dbt_python/hooks/target.py b/airflow_dbt_python/hooks/target.py new file mode 100644 index 0000000..dba9148 --- /dev/null +++ b/airflow_dbt_python/hooks/target.py @@ -0,0 +1,351 @@ +"""Provides a hook to get a dbt profile based on the Airflow connection.""" + +from __future__ import annotations + +import json +import re +import warnings +from abc import ABC, ABCMeta +from copy import copy +from typing import ( + Any, + Callable, + ClassVar, + NamedTuple, + Optional, + Union, +) + +from airflow.hooks.base import BaseHook +from airflow.models.connection import Connection + + +class DbtConnectionParam(NamedTuple): + """A tuple indicating connection parameters relevant to dbt. + + Attributes: + name: The name of the connection parameter. This name will be used to get the + parameter from an Airflow Connection or its extras. + store_override_name: A new name for the connection parameter. If not None, this + is the name used in a dbt profiles. + default: A default value if the parameter is not found. + """ + + name: str + store_override_name: Optional[str] = None + default: Optional[Any] = None + depends_on: Callable[[Connection], bool] = lambda x: True + + @property + def override_name(self): + """Returns the override_name if defined, otherwise defaults to name. + + >>> DbtConnectionParam("login", "user").override_name + 'user' + >>> DbtConnectionParam("port").override_name + 'port' + """ + if self.store_override_name is None: + return self.name + return self.store_override_name + + +class DbtConnectionHookMeta(ABCMeta): + """A hook metaclass to collect all subclasses of DbtConnectionHook.""" + + _dbt_hooks_by_conn_type: ClassVar[dict[str, DbtConnectionHookMeta]] = {} + conn_type: str + + def __new__(cls, name, bases, attrs, **kwargs) -> DbtConnectionHookMeta: + """Adds each DbtConnectionHook subclass to the dict based on its conn_type.""" + new_hook_cls = super().__new__(cls, name, bases, attrs) + if new_hook_cls.conn_type in cls._dbt_hooks_by_conn_type: + warnings.warn( + f"The connection type `{new_hook_cls.conn_type}`" + f" has been overwritten by `{new_hook_cls}`", + UserWarning, + stacklevel=1, + ) + + cls._dbt_hooks_by_conn_type[new_hook_cls.conn_type] = new_hook_cls + return new_hook_cls + + +class DbtConnectionHook(BaseHook, ABC, metaclass=DbtConnectionHookMeta): + """A hook to get a dbt profile based on the Airflow connection.""" + + conn_type = "dbt" + hook_name = "dbt Hook" + + conn_params: list[Union[DbtConnectionParam, str]] = [ + DbtConnectionParam("conn_type", "type"), + "host", + "schema", + "login", + "password", + "port", + ] + conn_extra_params: list[Union[DbtConnectionParam, str]] = [] + + def __init__( + self, + *args, + conn: Connection, + **kwargs, + ): + super().__init__(*args, **kwargs) + self.conn = conn + + @classmethod + def get_db_conn_hook(cls, conn_id: str) -> DbtConnectionHook: + """Get a dbt hook class depend on Airflow connection type.""" + conn = cls.get_connection(conn_id) + + if hook_cls := cls._dbt_hooks_by_conn_type.get(conn.conn_type): + return hook_cls(conn=conn) + raise KeyError( + f"There are no DbtConnectionHook subclasses with conn_type={conn.conn_type}" + ) + + def get_dbt_target_from_connection(self) -> Optional[dict[str, Any]]: + """Return a dictionary of connection details to use as a dbt target. + + The connection details are fetched from an Airflow connection identified by + self.dbt_conn_id. + + Returns: + A dictionary with a configuration for a dbt target, or None if a matching + Airflow connection is not found for given dbt target. + """ + details = self.get_dbt_details_from_connection(self.conn) + + return {self.conn.conn_id: details} + + def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: + """Extract dbt connection details from Airflow Connection. + + dbt connection details may be present as Airflow Connection attributes or in the + Connection's extras. This class' conn_params and conn_extra_params will be used + to fetch required attributes from attributes and extras respectively. If + conn_extra_params is empty, we merge parameters with all extras. + + Subclasses may override this class attributes to narrow down the connection + details for a specific dbt target (like Postgres, or Redshift). + + Returns: + A dictionary of dbt connection details. + """ + dbt_details = {} + for param in self.conn_params: + if isinstance(param, DbtConnectionParam): + if not param.depends_on(conn): + continue + key = param.override_name + value = getattr(conn, param.name, param.default) + else: + key = param + value = getattr(conn, key, None) + + if value is None: + continue + + dbt_details[key] = value + + extra = conn.extra_dejson + + if not self.conn_extra_params: + return {**dbt_details, **extra} + + for param in self.conn_extra_params: + if isinstance(param, DbtConnectionParam): + if not param.depends_on(conn): + continue + key = param.override_name + value = extra.get(param.name, param.default) + else: + key = param + value = extra.get(key, None) + + if value is None: + continue + + dbt_details[key] = value + + return dbt_details + + +class DbtPostgresHook(DbtConnectionHook): + """A hook to interact with dbt using a Postgres connection.""" + + conn_type = "postgres" + hook_name = "dbt Postgres Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "host", + DbtConnectionParam("schema", default="public"), + DbtConnectionParam("login", "user"), + "password", + DbtConnectionParam("port", default=5432), + ] + conn_extra_params = [ + DbtConnectionParam("dbname", "database", "postgres"), + "connect_timeout", + "role", + "search_path", + "keepalives_idle", + "sslmode", + "sslcert", + "sslkey", + "sslrootcert", + "retries", + ] + + def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: + """Extract dbt connection details from Airflow Connection. + + dbt connection details may be present as Airflow Connection attributes or in the + Connection's extras. This class' conn_params and conn_extra_params will be used + to fetch required attributes from attributes and extras respectively. If + conn_extra_params is empty, we merge parameters with all extras. + + Subclasses may override this class attributes to narrow down the connection + details for a specific dbt target (like Postgres, or Redshift). + + Returns: + A dictionary of dbt connection details. + """ + if "options" in conn.extra_dejson: + conn = copy(conn) + extra_dejson = conn.extra_dejson + options = extra_dejson.pop("options") + for k, v in re.findall(r"-c (\w+)=(.*)$", options): + extra_dejson[k] = v + conn.extra = json.dumps(extra_dejson) + return super().get_dbt_details_from_connection(conn) + + +class DbtRedshiftHook(DbtPostgresHook): + """A hook to interact with dbt using a Redshift connection.""" + + conn_type = "redshift" + hook_name = "dbt Redshift Hook" + conn_extra_params = DbtPostgresHook.conn_extra_params + [ + "method", + "cluster_id", + "iam_profile", + "autocreate", + "db_groups", + "ra3_node", + "connect_timeout", + "role", + "region", + ] + + +class DbtSnowflakeHook(DbtConnectionHook): + """A hook to interact with dbt using a Snowflake connection.""" + + conn_type = "snowflake" + hook_name = "dbt Snowflake Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "host", + "schema", + DbtConnectionParam( + "login", + "user", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") != "oauth", + ), + DbtConnectionParam( + "login", + "oauth_client_id", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", + ), + DbtConnectionParam( + "password", + depends_on=lambda x: not any( + ( + *( + k in x.extra_dejson + for k in ("private_key_file", "private_key_content") + ), + x.extra_dejson.get("authenticator", "") == "oauth", + ), + ), + ), + DbtConnectionParam( + "password", + "private_key_passphrase", + depends_on=lambda x: any( + k in x.extra_dejson for k in ("private_key_file", "private_key_content") + ), + ), + DbtConnectionParam( + "password", + "oauth_client_secret", + depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", + ), + ] + conn_extra_params = [ + "warehouse", + "role", + "authenticator", + "query_tag", + "client_session_keep_alive", + "connect_timeout", + "retry_on_database_errors", + "retry_all", + "reuse_connections", + "account", + "database", + DbtConnectionParam("refresh_token", "token"), + DbtConnectionParam("private_key_file", "private_key_path"), + DbtConnectionParam("private_key_content", "private_key"), + ] + + +class DbtBigQueryHook(DbtConnectionHook): + """A hook to interact with dbt using a BigQuery connection.""" + + conn_type = "bigquery" + hook_name = "dbt BigQuery Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "schema", + ] + conn_extra_params = [ + DbtConnectionParam("keyfile_path", "keyfile"), + DbtConnectionParam("keyfile_dict", "keyfile_json"), + "method", + "database", + "schema", + "refresh_token", + "client_id", + "client_secret", + "token_uri", + "OPTIONAL_CONFIG", + ] + + +class DbtSparkHook(DbtConnectionHook): + """A hook to interact with dbt using a Spark connection.""" + + conn_type = "spark" + hook_name = "dbt Spark Hook" + conn_params = [ + DbtConnectionParam("conn_type", "type", conn_type), + "host", + "port", + "schema", + DbtConnectionParam("login", "user"), + DbtConnectionParam( + "password", + depends_on=lambda x: x.extra_dejson.get("method", "") == "thrift", + ), + DbtConnectionParam( + "password", + "token", + depends_on=lambda x: x.extra_dejson.get("method", "") != "thrift", + ), + ] + conn_extra_params = [] diff --git a/airflow_dbt_python/operators/dbt.py b/airflow_dbt_python/operators/dbt.py index abe74e4..b00de28 100644 --- a/airflow_dbt_python/operators/dbt.py +++ b/airflow_dbt_python/operators/dbt.py @@ -99,7 +99,7 @@ def __init__( send_anonymous_usage_stats: Optional[bool] = None, no_send_anonymous_usage_stats: Optional[bool] = None, # Extra features configuration - dbt_conn_id: Optional[str] = "dbt_conn_id", + dbt_conn_id: Optional[str] = None, profiles_conn_id: Optional[str] = None, project_conn_id: Optional[str] = None, do_xcom_push_artifacts: Optional[list[str]] = None, @@ -305,7 +305,7 @@ def command(self) -> str: class DbtSeedOperator(DbtBaseOperator): """Executes a dbt seed command. - The seed command loads csv files into the the given target. The + The seed command loads csv files into the given target. The documentation for the dbt command can be found here: https://docs.getdbt.com/reference/commands/seed. """ diff --git a/airflow_dbt_python/utils/configs.py b/airflow_dbt_python/utils/configs.py index 5278ee8..eb0614d 100644 --- a/airflow_dbt_python/utils/configs.py +++ b/airflow_dbt_python/utils/configs.py @@ -457,10 +457,10 @@ def create_dbt_profile( raw_profiles = {} if extra_targets: - profile = raw_profiles.setdefault(self.profile_name, {}) - outputs = profile.setdefault("outputs", {}) + raw_profile = raw_profiles.setdefault(self.profile_name, {}) + outputs = raw_profile.setdefault("outputs", {}) outputs.setdefault("target", self.target) - profile["outputs"] = {**outputs, **extra_targets} + raw_profile["outputs"] = {**outputs, **extra_targets} profile = Profile.from_raw_profile_info( raw_profile=raw_profiles.get( diff --git a/tests/conftest.py b/tests/conftest.py index cd9f0b5..b0ac3b4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -217,13 +217,9 @@ def airflow_conns(database): connections are set for now as our testing database is postgres. """ uris = ( - f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public?database={database.dbname}", - f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public", - ) - ids = ( - "dbt_test_postgres_1", - database.dbname, + f"postgres://{database.user}:{database.password}@{database.host}:{database.port}/public?dbname={database.dbname}", ) + ids = ("dbt_test_postgres_1",) session = settings.Session() connections = [] diff --git a/tests/dags/test_dbt_dags.py b/tests/dags/test_dbt_dags.py index 3ce3768..3716673 100644 --- a/tests/dags/test_dbt_dags.py +++ b/tests/dags/test_dbt_dags.py @@ -59,7 +59,7 @@ def clear_dagruns(): session.query(DagRun).delete() session.commit() # We delete any serialized DAGs too for reproducible test runs. - session.query(SerializedDagModel) + session.query(SerializedDagModel).delete() session.commit() @@ -317,7 +317,7 @@ def target_connection_dag( ) as dag: dbt_seed = DbtSeedOperator( task_id="dbt_seed", - target=connection, + dbt_conn_id=connection, project_dir=dbt_project_file.parent, profiles_dir=None, do_xcom_push_artifacts=["run_results.json"], @@ -325,7 +325,7 @@ def target_connection_dag( dbt_run = DbtRunOperator( task_id="dbt_run", - target=connection, + dbt_conn_id=connection, project_dir=dbt_project_file.parent, profiles_dir=None, do_xcom_push_artifacts=["run_results.json"], @@ -334,7 +334,7 @@ def target_connection_dag( dbt_test = DbtTestOperator( task_id="dbt_test", - target=connection, + dbt_conn_id=connection, project_dir=dbt_project_file.parent, profiles_dir=None, do_xcom_push_artifacts=["run_results.json"], @@ -366,7 +366,7 @@ def test_dbt_operators_in_connection_dag( assert ti.state == TaskInstanceState.SUCCESS if isinstance(ti.task, DbtBaseOperator): - assert ti.task.target == "integration_test_conn" + assert ti.task.dbt_conn_id == "integration_test_conn" assert ti.task.project_dir == dbt_project_file.parent results = ti.xcom_pull( @@ -471,14 +471,14 @@ def test_example_dbt_project_in_github_dag(dagbag, connection, clear_dagruns): for task_id in ("dbt_seed", "dbt_run", "dbt_test"): ti = dagrun.get_task_instance(task_id=task_id) ti.task = dag.get_task(task_id=task_id) - ti.task.target = connection + ti.task.dbt_conn_id = connection ti.run(ignore_ti_state=True) assert ti.state == TaskInstanceState.SUCCESS if isinstance(ti.task, DbtBaseOperator): - assert ti.task.target == "integration_test_conn" + assert ti.task.dbt_conn_id == "integration_test_conn" assert ( ti.task.project_dir == "https://github.com/dbt-labs/jaffle-shop-classic" ) diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 47234c2..c8d110c 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -4,9 +4,11 @@ from pathlib import Path import pytest +from airflow.exceptions import AirflowNotFoundException from airflow_dbt_python.hooks.dbt import DbtHook -from airflow_dbt_python.hooks.localfs import DbtLocalFsRemoteHook +from airflow_dbt_python.hooks.remote.localfs import DbtLocalFsRemoteHook +from airflow_dbt_python.hooks.target import DbtConnectionHook, DbtPostgresHook from airflow_dbt_python.utils.configs import RunTaskConfig condition = False @@ -135,10 +137,9 @@ def test_dbt_hook_download_dbt_project(mocker): def test_dbt_hook_get_dbt_target_from_connection(airflow_conns, database): """Test fetching Airflow connections.""" - hook = DbtHook() - for conn_id in airflow_conns: - extra_target = hook.get_dbt_target_from_connection(conn_id) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=conn_id) + extra_target = hook.get_dbt_target_from_connection() assert extra_target is not None assert conn_id in extra_target @@ -150,8 +151,8 @@ def test_dbt_hook_get_dbt_target_from_connection(airflow_conns, database): @pytest.mark.parametrize("conn_id", ["non_existent", None]) def test_dbt_hook_get_target_from_connection_non_existent(conn_id): """Test None is returned when Airflow connections do not exist.""" - hook = DbtHook() - assert hook.get_dbt_target_from_connection(conn_id) is None + with pytest.raises(AirflowNotFoundException): + DbtConnectionHook.get_db_conn_hook(conn_id=conn_id) @pytest.fixture @@ -185,9 +186,8 @@ def no_user_airflow_conn(database): def test_dbt_hook_get_target_from_empty_connection(no_user_airflow_conn, database): """Test fetching Airflow connections.""" - hook = DbtHook() - - extra_target = hook.get_dbt_target_from_connection(no_user_airflow_conn) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=no_user_airflow_conn) + extra_target = hook.get_dbt_target_from_connection() assert extra_target is not None assert no_user_airflow_conn in extra_target @@ -204,21 +204,22 @@ def __init__(self, extras, **kwargs): self.extra_dejson = extras -def hook_with_conn_parameters(conn_params, conn_extra_params): +def hook_cls_with_conn_parameters(conn_params, conn_extra_params): """Create a hook with connection parameters for testing.""" - hook = DbtHook() - hook.conn_params = conn_params - hook.conn_extra_params = conn_extra_params - + hook = type( + "FakeDbtConnectionHook", + (DbtConnectionHook,), + {"conn_params": conn_params, "conn_extra_params": conn_extra_params}, + ) return hook @pytest.mark.parametrize( - "hook,fake_conn,expected", + "hook_cls,fake_conn,expected", ( - (DbtHook(), FakeConnection({}), {}), + (DbtConnectionHook, FakeConnection({}), {}), ( - DbtHook(), + DbtConnectionHook, FakeConnection( {"extra_param": 123}, conn_type="postgres", @@ -237,7 +238,7 @@ def hook_with_conn_parameters(conn_params, conn_extra_params): }, ), ( - hook_with_conn_parameters([], []), + hook_cls_with_conn_parameters([], []), FakeConnection( {"extra_param": 123, "extra_param_2": 456}, conn_type="postgres", @@ -252,7 +253,7 @@ def hook_with_conn_parameters(conn_params, conn_extra_params): }, ), ( - hook_with_conn_parameters( + hook_cls_with_conn_parameters( ["custom_param"], ["custom_extra", "custom_extra_1"] ), FakeConnection( @@ -272,9 +273,10 @@ def hook_with_conn_parameters(conn_params, conn_extra_params): ), ), ) -def test_dbt_details_from_connection(hook, fake_conn, expected): +def test_dbt_details_from_connection(hook_cls, fake_conn, expected): """Assert dbt connection details are read from a fake Airflow Connection.""" - dbt_details = hook.get_dbt_details_from_connection(fake_conn) + hook = hook_cls(conn=fake_conn) + dbt_details = hook.get_dbt_details_from_connection(hook.conn) assert dbt_details == expected diff --git a/tests/hooks/dbt/test_dbt_run.py b/tests/hooks/dbt/test_dbt_run.py index 00d8c21..4d2354b 100644 --- a/tests/hooks/dbt/test_dbt_run.py +++ b/tests/hooks/dbt/test_dbt_run.py @@ -7,6 +7,8 @@ from dbt.contracts.results import RunStatus from dbt.exceptions import DbtProfileError +from airflow_dbt_python.hooks.dbt import DbtHook + def test_dbt_run_task(hook, profiles_file, dbt_project_file, model_files): """Test a dbt run task.""" @@ -190,15 +192,15 @@ def test_dbt_run_task_compiled( def test_dbt_run_with_airflow_connection( - hook, dbt_project_file, model_files, airflow_conns, profiles_file + dbt_project_file, model_files, airflow_conns, profiles_file ): """Pulling a target from an Airflow connection.""" for conn_id in airflow_conns: + hook = DbtHook(dbt_conn_id=conn_id) result = hook.run_dbt_task( "run", project_dir=dbt_project_file.parent, profiles_dir=profiles_file.parent, - target=conn_id, select=[str(m.stem) for m in model_files], ) @@ -213,18 +215,18 @@ def test_dbt_run_with_airflow_connection( def test_dbt_run_with_airflow_connection_and_no_profiles( - hook, dbt_project_file, model_files, airflow_conns + dbt_project_file, model_files, airflow_conns ): """Using an Airflow connection in place of a profiles file. We omit the profiles_file hook as it should not be needed. """ for conn_id in airflow_conns: + hook = DbtHook(dbt_conn_id=conn_id) result = hook.run_dbt_task( "run", project_dir=dbt_project_file.parent, profiles_dir=None, - target=conn_id, select=[str(m.stem) for m in model_files], ) diff --git a/tests/hooks/dbt/test_dbt_seed.py b/tests/hooks/dbt/test_dbt_seed.py index cc426c3..cb41e15 100644 --- a/tests/hooks/dbt/test_dbt_seed.py +++ b/tests/hooks/dbt/test_dbt_seed.py @@ -181,12 +181,11 @@ def test_dbt_seed_with_airflow_connection( ): """Pulling a target from an Airflow connection.""" for conn_id in airflow_conns: - hook = DbtHook() + hook = DbtHook(dbt_conn_id=conn_id) result = hook.run_dbt_task( "seed", project_dir=dbt_project_file.parent, profiles_dir=profiles_file.parent, - target=conn_id, select=[str(s.stem) for s in seed_files], ) @@ -200,18 +199,18 @@ def test_dbt_seed_with_airflow_connection( def test_dbt_seed_with_airflow_connection_and_no_profiles( - hook, dbt_project_file, seed_files, airflow_conns + dbt_project_file, seed_files, airflow_conns ): """Using an Airflow connection in place of a profiles file. We omit the profiles_file hook as it should not be needed. """ for conn_id in airflow_conns: + hook = DbtHook(dbt_conn_id=conn_id) result = hook.run_dbt_task( "seed", project_dir=dbt_project_file.parent, profiles_dir=None, - target=conn_id, select=[str(s.stem) for s in seed_files], ) diff --git a/tests/operators/test_dbt_run.py b/tests/operators/test_dbt_run.py index b1fd64e..3b8151b 100644 --- a/tests/operators/test_dbt_run.py +++ b/tests/operators/test_dbt_run.py @@ -351,7 +351,7 @@ def test_dbt_run_models_with_airflow_connection( task_id="dbt_task", project_dir=dbt_project_file.parent, models=[str(m.stem) for m in model_files], - target=conn_id, + dbt_conn_id=conn_id, ) execution_results = op.execute({}) @@ -359,7 +359,7 @@ def test_dbt_run_models_with_airflow_connection( assert run_result["status"] == RunStatus.Success assert op.profiles_dir is None - assert op.target == conn_id + assert op.dbt_conn_id == conn_id def test_dbt_run_with_airflow_connection_and_profile( @@ -370,14 +370,16 @@ def test_dbt_run_with_airflow_connection_and_profile( An Airflow connection target should still be usable even in the presence of profiles file, and vice-versa. """ - all_targets = airflow_conns + ("test",) + all_airflow_conns = airflow_conns + (None,) + target = "test" - for target in all_targets: + for conn_id in all_airflow_conns: op = DbtRunOperator( task_id="dbt_task", project_dir=dbt_project_file.parent, profiles_dir=profiles_file.parent, select=[str(m.stem) for m in model_files], + dbt_conn_id=conn_id, target=target, ) @@ -386,4 +388,4 @@ def test_dbt_run_with_airflow_connection_and_profile( assert run_result["status"] == RunStatus.Success assert op.profiles_dir == profiles_file.parent - assert op.target == target + assert execution_results["args"]["target"] == conn_id or target diff --git a/tests/operators/test_dbt_seed.py b/tests/operators/test_dbt_seed.py index 109db97..1a40d43 100644 --- a/tests/operators/test_dbt_seed.py +++ b/tests/operators/test_dbt_seed.py @@ -287,7 +287,7 @@ def test_dbt_seed_with_airflow_connection(dbt_project_file, seed_files, airflow_ task_id="dbt_task", project_dir=dbt_project_file.parent, select=[str(m.stem) for m in seed_files], - target=conn_id, + dbt_conn_id=conn_id, ) execution_results = op.execute({}) @@ -295,7 +295,7 @@ def test_dbt_seed_with_airflow_connection(dbt_project_file, seed_files, airflow_ assert run_result["status"] == RunStatus.Success assert op.profiles_dir is None - assert op.target == conn_id + assert op.dbt_conn_id == conn_id def test_dbt_seed_with_airflow_connection_and_profile( @@ -306,14 +306,16 @@ def test_dbt_seed_with_airflow_connection_and_profile( An Airflow connection target should still be usable even in the presence of profiles file, and vice-versa. """ - all_targets = airflow_conns + ("test",) + all_airflow_conns = airflow_conns + (None,) + target = "test" - for target in all_targets: + for conn_id in all_airflow_conns: op = DbtSeedOperator( task_id="dbt_task", project_dir=dbt_project_file.parent, profiles_dir=profiles_file.parent, select=[str(m.stem) for m in seed_files], + dbt_conn_id=conn_id, target=target, ) @@ -322,4 +324,4 @@ def test_dbt_seed_with_airflow_connection_and_profile( assert run_result["status"] == RunStatus.Success assert op.profiles_dir == profiles_file.parent - assert op.target == target + assert execution_results["args"]["target"] == conn_id or target diff --git a/tests/utils/test_configs.py b/tests/utils/test_configs.py index f06ea2c..d46bcd6 100644 --- a/tests/utils/test_configs.py +++ b/tests/utils/test_configs.py @@ -13,7 +13,7 @@ from dbt.task.deps import DepsTask from dbt.task.run import RunTask -from airflow_dbt_python.hooks.dbt import DbtHook +from airflow_dbt_python.hooks.target import DbtConnectionHook from airflow_dbt_python.utils.configs import ( BaseConfig, BuildTaskConfig, @@ -40,7 +40,7 @@ def test_task_config_enum(): assert ConfigFactory.from_str("seed").value == SeedTaskConfig -def test_compile_task_minimal_config(hook, profiles_file, dbt_project_file): +def test_compile_task_minimal_config(profiles_file, dbt_project_file): """Test the creation of a CompileTask from arguments.""" cfg = CompileTaskConfig( profiles_dir=profiles_file.parent, project_dir=dbt_project_file.parent @@ -74,7 +74,7 @@ def test_deps_task_minimal_config(profiles_file, dbt_project_file): assert isinstance(task, DepsTask) -def test_run_task_minimal_config(hook, profiles_file, dbt_project_file): +def test_run_task_minimal_config(profiles_file, dbt_project_file): """Test the creation of a RunTask from arguments.""" cfg = RunTaskConfig( profiles_dir=profiles_file.parent, project_dir=dbt_project_file.parent @@ -145,7 +145,7 @@ def test_config_vars(vars, expected): assert config.vars == expected -def test_build_task_minimal_config(hook, profiles_file, dbt_project_file): +def test_build_task_minimal_config(profiles_file, dbt_project_file): """Test the creation of a BuildTask from arguments.""" cfg = BuildTaskConfig( profiles_dir=profiles_file.parent, project_dir=dbt_project_file.parent @@ -157,7 +157,7 @@ def test_build_task_minimal_config(hook, profiles_file, dbt_project_file): assert isinstance(task, BuildTask) -def test_build_task_minimal_config_generic(hook, profiles_file, dbt_project_file): +def test_build_task_minimal_config_generic(profiles_file, dbt_project_file): """Test the creation of a BuildTask from arguments with generic = True.""" cfg = BuildTaskConfig( profiles_dir=profiles_file.parent, @@ -172,7 +172,7 @@ def test_build_task_minimal_config_generic(hook, profiles_file, dbt_project_file assert isinstance(task, BuildTask) -def test_build_task_minimal_config_singular(hook, profiles_file, dbt_project_file): +def test_build_task_minimal_config_singular(profiles_file, dbt_project_file): """Test the creation of a BuildTask from arguments with singular = True.""" cfg = BuildTaskConfig( profiles_dir=profiles_file.parent, @@ -227,7 +227,7 @@ def test_parse_yaml_args(vars, expected): ], ) def test_base_config_profile_name_property( - profile_name, expected, hook, profiles_file, dbt_project_file + profile_name, expected, profiles_file, dbt_project_file ): """Test the profile_name property.""" config = BaseConfig( @@ -237,7 +237,7 @@ def test_base_config_profile_name_property( assert config.profile_name == expected -def test_base_config_partial_project_property(hook, profiles_file, dbt_project_file): +def test_base_config_partial_project_property(profiles_file, dbt_project_file): """Test the partial_project property.""" config = BaseConfig(project_dir=dbt_project_file.parent) @@ -245,7 +245,7 @@ def test_base_config_partial_project_property(hook, profiles_file, dbt_project_f assert config.partial_project.project_dict["profile"] == "default" -def test_base_config_create_dbt_profile(hook, profiles_file, dbt_project_file): +def test_base_config_create_dbt_profile(profiles_file, dbt_project_file): """Test the create_dbt_profile with real project file.""" config = BaseConfig( project_dir=dbt_project_file.parent, @@ -296,7 +296,7 @@ def test_base_config_create_dbt_profile_with_env_vars( def test_base_config_create_dbt_profile_with_extra_target( - hook, profiles_file, dbt_project_file, airflow_conns + profiles_file, dbt_project_file, airflow_conns ): """Test the create_dbt_profile with additional targets.""" for conn_id in airflow_conns: @@ -305,7 +305,8 @@ def test_base_config_create_dbt_profile_with_extra_target( project_dir=dbt_project_file.parent, profiles_dir=profiles_file.parent, ) - extra_target = hook.get_dbt_target_from_connection(conn_id) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=conn_id) + extra_target = hook.get_dbt_target_from_connection() profile = config.create_dbt_profile(extra_target) assert profile.profile_name == "default" @@ -336,8 +337,8 @@ def test_create_db_specific_dbt_profile_with_extra_target( ) flags.set_from_args(config, {}) - hook = DbtHook(dbt_conn_id=profile_conn_id) - extra_target = hook.get_dbt_target_from_connection(profile_conn_id) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=profile_conn_id) + extra_target = hook.get_dbt_target_from_connection() profile_from_conn = config.create_dbt_profile(extra_target) profiles = Path(__file__).parent.parent / "profiles" @@ -357,14 +358,15 @@ def test_create_db_specific_dbt_profile_with_extra_target( def test_base_config_create_dbt_profile_with_extra_target_no_profile( - hook, dbt_project_file, airflow_conns + dbt_project_file, airflow_conns ): """Test the create_dbt_profile with no project file.""" for conn_id in airflow_conns: config = BaseConfig( target=conn_id, project_dir=dbt_project_file.parent, profiles_dir=None ) - extra_target = hook.get_dbt_target_from_connection(conn_id) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=conn_id) + extra_target = hook.get_dbt_target_from_connection() profile = config.create_dbt_profile(extra_target) assert profile.profile_name == "default" @@ -375,7 +377,7 @@ def test_base_config_create_dbt_profile_with_extra_target_no_profile( assert target["type"] == "postgres" -def test_base_config_create_dbt_profile_fails_with_no_profile(hook, dbt_project_file): +def test_base_config_create_dbt_profile_fails_with_no_profile(dbt_project_file): """Test the create_dbt_profile with no profile and no extra targets.""" config = BaseConfig(project_dir=dbt_project_file.parent, profiles_dir=None) @@ -388,7 +390,7 @@ def test_base_config_create_dbt_profile_fails_with_no_profile(hook, dbt_project_ [("non-existent", None), ("default", "non-existent")], ) def test_base_config_create_dbt_profile_fails( - profile_name, target, hook, dbt_project_file, profiles_file + profile_name, target, dbt_project_file, profiles_file ): """Test the create_dbt_profile with no profile and no extra targets.""" config = BaseConfig( @@ -402,9 +404,7 @@ def test_base_config_create_dbt_profile_fails( config.create_dbt_profile() -def test_base_config_create_dbt_project_and_profile( - hook, profiles_file, dbt_project_file -): +def test_base_config_create_dbt_project_and_profile(profiles_file, dbt_project_file): """Test the create_dbt_project_and_profile with real project file.""" config = BaseConfig( project_dir=dbt_project_file.parent, @@ -425,7 +425,7 @@ def test_base_config_create_dbt_project_and_profile( def test_base_config_create_dbt_project_and_profile_with_no_profile( - hook, dbt_project_file, airflow_conns + dbt_project_file, airflow_conns ): """Test the create_dbt_project_and_profile with real project file.""" config = BaseConfig( @@ -439,7 +439,8 @@ def test_base_config_create_dbt_project_and_profile_with_no_profile( for conn_id in airflow_conns: config.target = conn_id - extra_target = hook.get_dbt_target_from_connection(conn_id) + hook = DbtConnectionHook.get_db_conn_hook(conn_id=conn_id) + extra_target = hook.get_dbt_target_from_connection() project, profile = config.create_dbt_project_and_profile(extra_target) assert project.model_paths == ["models"] From c33df562de3417906e14ddbbcd2ad7256d37ff9e Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Fri, 28 Feb 2025 16:01:52 +0300 Subject: [PATCH 11/24] fix: fixed conn_type. close #142 --- airflow_dbt_python/hooks/target.py | 63 +++++++++++++++++++-------- tests/hooks/dbt/test_dbt_hook_base.py | 6 ++- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/airflow_dbt_python/hooks/target.py b/airflow_dbt_python/hooks/target.py index dba9148..6da8a95 100644 --- a/airflow_dbt_python/hooks/target.py +++ b/airflow_dbt_python/hooks/target.py @@ -54,20 +54,20 @@ class DbtConnectionHookMeta(ABCMeta): """A hook metaclass to collect all subclasses of DbtConnectionHook.""" _dbt_hooks_by_conn_type: ClassVar[dict[str, DbtConnectionHookMeta]] = {} - conn_type: str + airflow_conn_types: tuple[str, ...] def __new__(cls, name, bases, attrs, **kwargs) -> DbtConnectionHookMeta: """Adds each DbtConnectionHook subclass to the dict based on its conn_type.""" new_hook_cls = super().__new__(cls, name, bases, attrs) - if new_hook_cls.conn_type in cls._dbt_hooks_by_conn_type: - warnings.warn( - f"The connection type `{new_hook_cls.conn_type}`" - f" has been overwritten by `{new_hook_cls}`", - UserWarning, - stacklevel=1, - ) - - cls._dbt_hooks_by_conn_type[new_hook_cls.conn_type] = new_hook_cls + for airflow_conn_type in new_hook_cls.airflow_conn_types: + if airflow_conn_type in cls._dbt_hooks_by_conn_type: + warnings.warn( + f"The connection type `{airflow_conn_type}`" + f" has been overwritten by `{new_hook_cls}`", + UserWarning, + stacklevel=1, + ) + cls._dbt_hooks_by_conn_type[airflow_conn_type] = new_hook_cls return new_hook_cls @@ -76,6 +76,7 @@ class DbtConnectionHook(BaseHook, ABC, metaclass=DbtConnectionHookMeta): conn_type = "dbt" hook_name = "dbt Hook" + airflow_conn_types: tuple[str, ...] = () conn_params: list[Union[DbtConnectionParam, str]] = [ DbtConnectionParam("conn_type", "type"), @@ -135,7 +136,7 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: Returns: A dictionary of dbt connection details. """ - dbt_details = {} + dbt_details = {"type": self.conn_type} for param in self.conn_params: if isinstance(param, DbtConnectionParam): if not param.depends_on(conn): @@ -179,8 +180,9 @@ class DbtPostgresHook(DbtConnectionHook): conn_type = "postgres" hook_name = "dbt Postgres Hook" + airflow_conn_types: tuple[str, ...] = (conn_type, "gcpcloudsql") + conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), "host", DbtConnectionParam("schema", default="public"), DbtConnectionParam("login", "user"), @@ -229,8 +231,15 @@ class DbtRedshiftHook(DbtPostgresHook): conn_type = "redshift" hook_name = "dbt Redshift Hook" + airflow_conn_types = (conn_type,) + conn_extra_params = DbtPostgresHook.conn_extra_params + [ "method", + DbtConnectionParam( + "method", + default="iam", + depends_on=lambda x: x.extra_dejson.get("iam_profile") is not None, + ), "cluster_id", "iam_profile", "autocreate", @@ -247,8 +256,9 @@ class DbtSnowflakeHook(DbtConnectionHook): conn_type = "snowflake" hook_name = "dbt Snowflake Hook" + airflow_conn_types = (conn_type,) + conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), "host", "schema", DbtConnectionParam( @@ -309,21 +319,38 @@ class DbtBigQueryHook(DbtConnectionHook): conn_type = "bigquery" hook_name = "dbt BigQuery Hook" + airflow_conn_types = ("gcpbigquery", "google_cloud_platform") + conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), "schema", ] conn_extra_params = [ - DbtConnectionParam("keyfile_path", "keyfile"), + DbtConnectionParam("method", default="oauth"), + DbtConnectionParam( + "method", + default="oauth-secrets", + depends_on=lambda x: x.extra_dejson.get("refresh_token") is not None, + ), + DbtConnectionParam( + "method", + default="service-account-json", + depends_on=lambda x: x.extra_dejson.get("keyfile_dict") is not None, + ), + DbtConnectionParam( + "method", + default="service-account", + depends_on=lambda x: x.extra_dejson.get("key_path") is not None, + ), + DbtConnectionParam("key_path", "keyfile"), DbtConnectionParam("keyfile_dict", "keyfile_json"), "method", - "database", + DbtConnectionParam("project", "database"), "schema", "refresh_token", "client_id", "client_secret", "token_uri", - "OPTIONAL_CONFIG", + "scopes", ] @@ -332,8 +359,8 @@ class DbtSparkHook(DbtConnectionHook): conn_type = "spark" hook_name = "dbt Spark Hook" + airflow_conn_types = ("spark_connect",) conn_params = [ - DbtConnectionParam("conn_type", "type", conn_type), "host", "port", "schema", diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index c8d110c..219d9cd 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -217,7 +217,7 @@ def hook_cls_with_conn_parameters(conn_params, conn_extra_params): @pytest.mark.parametrize( "hook_cls,fake_conn,expected", ( - (DbtConnectionHook, FakeConnection({}), {}), + (DbtConnectionHook, FakeConnection({}), {"type": "dbt"}), ( DbtConnectionHook, FakeConnection( @@ -248,6 +248,7 @@ def hook_cls_with_conn_parameters(conn_params, conn_extra_params): login="user", ), { + "type": "dbt", "extra_param": 123, "extra_param_2": 456, }, @@ -258,6 +259,7 @@ def hook_cls_with_conn_parameters(conn_params, conn_extra_params): ), FakeConnection( { + "type": "dbt", "custom_extra": "extra", "extra_param": 123, "extra_param_2": 456, @@ -269,7 +271,7 @@ def hook_cls_with_conn_parameters(conn_params, conn_extra_params): port=5432, login="user", ), - {"custom_param": "test", "custom_extra": "extra"}, + {"custom_param": "test", "custom_extra": "extra", "type": "dbt"}, ), ), ) From 4d6edc7e4c95076b165bd158ffa246c9c6bcb3f1 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Fri, 28 Feb 2025 18:14:39 +0300 Subject: [PATCH 12/24] fix: support branches for DbtGitRemoteHook. close #122 --- airflow_dbt_python/hooks/remote/git.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/airflow_dbt_python/hooks/remote/git.py b/airflow_dbt_python/hooks/remote/git.py index fb20826..e75f618 100644 --- a/airflow_dbt_python/hooks/remote/git.py +++ b/airflow_dbt_python/hooks/remote/git.py @@ -7,7 +7,7 @@ from dulwich.client import HttpGitClient, SSHGitClient, TCPGitClient from dulwich.contrib.paramiko_vendor import ParamikoSSHVendor from dulwich.objectspec import parse_reftuples -from dulwich.porcelain import Error, active_branch, check_diverged +from dulwich.porcelain import Error, active_branch, branch_create, check_diverged from dulwich.protocol import ZERO_SHA from dulwich.repo import Repo @@ -83,7 +83,11 @@ def _upload( f"Cannot upload archive to remote git repository: {source}" ) + client, path, branch = self.get_git_client_path(destination) + repo = Repo(str(source)) + if branch: + branch_create(repo, branch, force=True) for f in source: if self.upload_filter(f) is False: @@ -122,8 +126,6 @@ def update_refs(refs): remote_changed_refs[rh] = localsha return new_refs - client, path = self.get_git_client_path(destination) - client.send_pack( path, update_refs, @@ -152,11 +154,13 @@ def _download( f"Cannot download archive from remote git repository: {source}" ) - client, path = self.get_git_client_path(source) + client, path, branch = self.get_git_client_path(source) - client.clone(path, str(destination), mkdir=not destination.exists()) + client.clone( + path, str(destination), mkdir=not destination.exists(), branch=branch + ) - def get_git_client_path(self, url: URL) -> Tuple[GitClients, str]: + def get_git_client_path(self, url: URL) -> Tuple[GitClients, str, Optional[str]]: """Initialize a dulwich git client according to given URL's scheme.""" if url.scheme == "git": client: GitClients = TCPGitClient(url.hostname, url.port) @@ -210,4 +214,7 @@ def get_git_client_path(self, url: URL) -> Tuple[GitClients, str]: else: raise ValueError(f"Unsupported scheme: {url.scheme}") - return client, path + path, *remain = path.split("@", maxsplit=1) + branch = remain[0] if remain else None + + return client, path, branch From e415caaa03eecad5360492a30f3cf8be3543fe9d Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Fri, 28 Feb 2025 18:27:33 +0300 Subject: [PATCH 13/24] feat: add GCS remote hook. close #139 --- airflow_dbt_python/hooks/remote/__init__.py | 4 + airflow_dbt_python/hooks/remote/gcs.py | 234 +++++++++++ pyproject.toml | 7 + tests/conftest.py | 69 +++- tests/hooks/test_gcs_hook.py | 429 ++++++++++++++++++++ 5 files changed, 739 insertions(+), 4 deletions(-) create mode 100644 airflow_dbt_python/hooks/remote/gcs.py create mode 100644 tests/hooks/test_gcs_hook.py diff --git a/airflow_dbt_python/hooks/remote/__init__.py b/airflow_dbt_python/hooks/remote/__init__.py index 049951c..711529f 100644 --- a/airflow_dbt_python/hooks/remote/__init__.py +++ b/airflow_dbt_python/hooks/remote/__init__.py @@ -151,6 +151,10 @@ def get_remote(scheme: str, conn_id: Optional[str] = None) -> DbtRemoteHook: from .s3 import DbtS3RemoteHook remote_cls: Type[DbtRemoteHook] = DbtS3RemoteHook + elif scheme == "gs": + from .gcs import DbtGCSRemoteHook + + remote_cls = DbtGCSRemoteHook elif scheme in ("https", "git", "git+ssh", "ssh", "http"): from .git import DbtGitRemoteHook diff --git a/airflow_dbt_python/hooks/remote/gcs.py b/airflow_dbt_python/hooks/remote/gcs.py new file mode 100644 index 0000000..36e56cc --- /dev/null +++ b/airflow_dbt_python/hooks/remote/gcs.py @@ -0,0 +1,234 @@ +"""An implementation for an GCS remote for dbt.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Iterable, Optional + +from airflow.providers.common.compat.lineage.hook import get_hook_lineage_collector +from airflow.providers.google.cloud.hooks.gcs import GCSHook, _parse_gcs_url +from google.cloud.storage import Blob + +from airflow_dbt_python.hooks.remote import DbtRemoteHook +from airflow_dbt_python.utils.url import URL, URLLike + + +class DbtGCSRemoteHook(GCSHook, DbtRemoteHook): + """A dbt remote implementation for GCS. + + This concrete remote class implements the DbtRemote interface by using GCS as a + storage for uploading and downloading dbt files to and from. + The DbtGCSRemoteHook subclasses Airflow's GCSHook to interact with GCS. + A connection id may be passed to set the connection to use with GCS. + """ + + conn_type = "gcs" + hook_name = "dbt GCS Remote" + + def __init__(self, *args, **kwargs): + """Initialize a dbt remote for GCS.""" + super().__init__(*args, **kwargs) + + def _upload( + self, + source: URL, + destination: URL, + replace: bool = False, + delete_before: bool = False, + ) -> None: + """Upload one or more files under source URL to GCS. + + Args: + source: A local URL where to fetch the file/s to push. + destination: An GCS URL where the file should be uploaded. The bucket + name and key prefix will be extracted by calling GCSHook.parse_gcs_url. + replace: Whether to replace existing GCS keys or not. + delete_before: Whether to delete the contents of destination before pushing. + """ + self.log.info("Uploading to GCS from %s to %s", source, destination) + self.log.debug("All files: %s", [s for s in source]) + + bucket_name, key = _parse_gcs_url(str(destination)) + + if delete_before: + keys = self.list(bucket_name, prefix=key) + for _key in keys: + self.delete(bucket_name, _key) + + base_key = URL(f"gs://{bucket_name}/{key}") + for file_url in source: + self.log.debug("Uploading: %s", file_url) + + if file_url.is_dir(): + continue + + gcs_key = base_key / file_url.relative_to(source) + + self.load_file_handle_replace_error( + file_url=file_url, + key=str(gcs_key), + replace=replace, + ) + + def load_file_handle_replace_error( + self, + file_url: URLLike, + key: str, + bucket_name: Optional[str] = None, + replace: bool = False, + encrypt: bool = False, + gzip: bool = False, + ) -> bool: + """Calls GCSHook.load_file but handles ValueError when replacing existing keys. + + Will also log a warning whenever attempting to replace an existing key with + replace = False. + + Returns: + True if no ValueError was raised, False otherwise. + """ + success = True + + if bucket_name is None: + # We can't call load_file with bucket_name=None as it checks for the + # presence of the parameter to decide whether setting a bucket_name is + # required. By passing bucket_name=None, the parameter is set, and + # 'None' will be used as the bucket name. + bucket_name, key = _parse_gcs_url(str(key)) + + self.log.info("Loading file %s to GCS: %s", file_url, key) + try: + self.load_file( + str(file_url), + key, + bucket_name=bucket_name, + replace=replace, + encrypt=encrypt, + gzip=gzip, + ) + except ValueError: + success = False + self.log.warning("Failed to load %s: key already exists in GCS.", key) + + return success + + def _download( + self, + source: URL, + destination: URL, + replace: bool = False, + delete_before: bool = False, + ): + """Download one or more files from a destination URL in GCS. + + Lists all GCS keys that have source as a prefix to find what to download. + + Args: + source: An GCS URL to a key prefix containing objects to download. + destination: A destination URL where to download the objects to. The + existing sub-directory hierarchy in GCS will be preserved. + replace: Indicates whether to replace existing files when downloading. + This flag is kept here to comply with the DbtRemote interface but its + ignored as files downloaded from GCS always overwrite local files. + delete_before: Delete destination directory before download. + """ + gcs_object_keys = self.iter_url(source) + + if destination.exists() and delete_before is True: + for _file in destination: + _file.unlink() + + if destination.is_dir(): + destination.rmdir() + + for gcs_object_key in gcs_object_keys: + self.log.info("GCSObjectKey: %s", gcs_object_key) + self.log.info("Source: %s", source) + + bucket_name, object_name = _parse_gcs_url(str(gcs_object_key)) + gcs_object = self.get_key(object_name, bucket_name) + gcs_object_url = URL(gcs_object_key) + + if source != gcs_object_url and gcs_object_url.is_relative_to(source): + gcs_object_url = gcs_object_url.relative_to(source) + + if gcs_object_url.suffix == "" and str(gcs_object_url).endswith("/"): + # Empty GCS files may also be confused with unwanted directories. + self.log.warning( + "A file with no name was found in GCS at %s", gcs_object + ) + continue + + if destination.is_dir(): + destination_url = destination / gcs_object_url.path + else: + destination_url = destination + + destination_url.parent.mkdir(parents=True, exist_ok=True) + + gcs_object.download_to_filename(str(destination_url)) + + def iter_url(self, source: URL) -> Iterable[URL]: + """Iterate over an GCS key given by a URL.""" + bucket_name, key_prefix = _parse_gcs_url(str(source)) + + for key in self.list(bucket_name=bucket_name, prefix=key_prefix): + if key.endswith("//"): + # Sometimes, GCS files with empty names can appear, usually when using + # the UI. These empty GCS files may also be confused with directories. + continue + yield URL.from_parts(scheme="gs", netloc=bucket_name, path=key) + + def get_key(self, key: str, bucket_name: str) -> Blob: + """Get Blob object by key and bucket name.""" + return self._get_blob(bucket_name, key) + + def check_for_key(self, key: str, bucket_name: str) -> bool: + """Checking if the key exists in the bucket.""" + client = self.get_conn() + bucket = client.bucket(bucket_name) + blob = bucket.blob(blob_name=key) + return blob.exists() + + def load_file( + self, + filename: Path | str, + key: str, + bucket_name: str | None = None, + replace: bool = False, + encrypt: bool = False, + gzip: bool = False, + ) -> None: + """Load a local file to GCS. + + :param filename: path to the file to load. + :param key: GCS key that will point to the file + :param bucket_name: Name of the bucket in which to store the file + :param replace: A flag to decide whether or not to overwrite the key + if it already exists. If replace is False and the key exists, an + error will be raised. + :param encrypt: If True, the file will be encrypted on the server-side + by GCS and will be stored in an encrypted form while at rest in GCS. + :param gzip: If True, the file will be compressed locally + """ + filename = str(filename) + if not replace and self.check_for_key(key, bucket_name): + raise ValueError(f"The key {key} already exists.") + + metadata = {} + if encrypt: + raise NotImplementedError("Encrypt is not implemented in GCSHook.") + + self.upload( + bucket_name=bucket_name, + object_name=key, + filename=filename, + gzip=gzip, + metadata=metadata, + ) + get_hook_lineage_collector().add_input_asset( + context=self, scheme="file", asset_kwargs={"path": filename} + ) + get_hook_lineage_collector().add_output_asset( + context=self, scheme="gs", asset_kwargs={"bucket": bucket_name, "key": key} + ) diff --git a/pyproject.toml b/pyproject.toml index d011e68..aa49773 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ build-backend = "poetry.core.masonry.api" [project.optional-dependencies] airflow-providers = [ "apache-airflow-providers-amazon>=3.0.0", + "apache-airflow-providers-google>=11.0.0", "apache-airflow-providers-ssh>=3.0.0", ] adapters = [ @@ -47,6 +48,9 @@ adapters = [ bigquery = [ "dbt-bigquery>=1.8.0,<2.0.0", ] +gcs = [ + "apache-airflow-providers-google>=11.0.0", +] git = [ "apache-airflow-providers-ssh>=3.0.0", "dulwich>=0.21", @@ -75,6 +79,7 @@ optional = true [tool.poetry.group.dev.dependencies] apache-airflow-providers-amazon = ">=3.0.0" +apache-airflow-providers-google = ">=11.0.0" apache-airflow-providers-ssh = ">=3.0.0" black = ">=22" boto3-stubs = { extras = ["s3"], version = ">=1.26.8" } @@ -91,6 +96,8 @@ pytest-postgresql = ">=5" ruff = ">=0.0.254" types-freezegun = ">=1.1.6" types-PyYAML = ">=6.0.7" +pytest-mock = "^3.14.0" +mock-gcp = {git = "https://github.com/millin/mock-gcp.git", rev = "0d972df9b6cce164b49f09ec4417a4eb77beb960"} [tool.poetry.group.docs] optional = true diff --git a/tests/conftest.py b/tests/conftest.py index b0ac3b4..38e19a4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,11 +10,13 @@ import shutil from pathlib import Path from typing import TYPE_CHECKING, Generator, List +from unittest.mock import patch import boto3 import pytest from airflow import settings from airflow.models.connection import Connection +from mockgcp.storage.client import MockClient as MockStorageClient from moto import mock_aws from pytest_postgresql.janitor import DatabaseJanitor @@ -376,10 +378,7 @@ def mocked_s3_res(): @pytest.fixture def s3_hook(): """Provide an S3 for testing.""" - try: - from airflow.providers.amazon.aws.hooks.s3 import S3Hook - except ImportError: - from airflow.hooks.S3_hook import S3Hook + from airflow.providers.amazon.aws.hooks.s3 import S3Hook return S3Hook() @@ -411,6 +410,68 @@ def s3_bucket(mocked_s3_res, s3_hook): assert keys is None or len(keys) == 0 +@pytest.fixture +def gcp_conn_id(): + """Provide a GCS connection for testing.""" + from airflow.providers.google.cloud.hooks.gcs import GCSHook + + conn_id = GCSHook.default_conn_name + + session = settings.Session() + existing = session.query(Connection).filter_by(conn_id=conn_id).first() + if existing is not None: + # Connections may exist from previous test run. + session.delete(existing) + session.commit() + + conn = Connection(conn_id=conn_id, conn_type=GCSHook.conn_type) + + session.add(conn) + + session.commit() + + yield conn_id + + session.delete(conn) + + session.commit() + session.close() + + +@pytest.fixture +def mocked_gcs_client(): + """Provide mock Google Storage Client for testing.""" + with patch("google.cloud.storage.client.Client", MockStorageClient): + yield MockStorageClient(project="test-project") + + +@pytest.fixture +def gcs_hook(gcp_conn_id): + """Provide an GCS for testing.""" + from airflow_dbt_python.hooks.remote.gcs import DbtGCSRemoteHook + + with patch( + "airflow.providers.google.cloud.hooks.gcs.GCSHook.get_credentials_and_project_id", + lambda x: ({}, "test-project"), + ): + with patch("google.cloud.storage.Client", MockStorageClient): + yield DbtGCSRemoteHook() + + +@pytest.fixture +def gcs_bucket(mocked_gcs_client, gcs_hook): + """Return a mocked gcs bucket for testing. + + Bucket is cleaned after every use. + """ + bucket_name = "airflow-dbt-test-gcs-bucket" + bucket = mocked_gcs_client.create_bucket(bucket_name) + + yield bucket_name + + bucket.delete() + + BROKEN_SQL = """ SELECT field1 AS field1 diff --git a/tests/hooks/test_gcs_hook.py b/tests/hooks/test_gcs_hook.py new file mode 100644 index 0000000..81398bc --- /dev/null +++ b/tests/hooks/test_gcs_hook.py @@ -0,0 +1,429 @@ +"""Unit test module for DbtGCSRemoteHook.""" + +import io +from zipfile import ZipFile + +import freezegun +import pytest + +try: + from airflow_dbt_python.hooks.remote.gcs import DbtGCSRemoteHook +except ImportError: + pytest.skip( + "GCS Remote not available, consider installing google extras", + allow_module_level=True, + ) + + +def test_download_dbt_profiles(gcs_bucket, gcs_hook, tmpdir, profiles_file): + """Test downloading dbt profile from GCS path.""" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + with open(profiles_file) as pf: + profiles_content = pf.read() + bucket.blob("profiles/profiles.yml").upload_from_string(profiles_content.encode()) + + profiles_path = gcs_hook.download_dbt_profiles( + f"gs://{gcs_bucket}/profiles/", + tmpdir, + ) + + assert profiles_path.exists() + + with open(profiles_path) as f: + result = f.read() + assert result == profiles_content + + +def test_download_dbt_profiles_sub_dir(gcs_bucket, gcs_hook, tmpdir, profiles_file): + """Test downloading dbt profile from GCS path sub-directory.""" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + with open(profiles_file) as pf: + profiles_content = pf.read() + bucket.blob("profiles/v0.0.1/profiles.yml").upload_from_string( + profiles_content.encode() + ) + + profiles_path = gcs_hook.download_dbt_profiles( + f"gs://{gcs_bucket}/profiles/v0.0.1", + tmpdir, + ) + + assert profiles_path.exists() + + with open(profiles_path) as f: + result = f.read() + assert result == profiles_content + + +def test_download_dbt_profiles_sub_dir_trailing_slash( + gcs_bucket, gcs_hook, tmpdir, profiles_file +): + """Test whether an GCS path without a trailing slash pulls a dbt project.""" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + with open(profiles_file) as pf: + profiles_content = pf.read() + bucket.blob("profiles/v0.0.1/profiles.yml").upload_from_string( + profiles_content.encode() + ) + + profiles_path = gcs_hook.download_dbt_profiles( + f"gs://{gcs_bucket}/profiles/v0.0.1/", + tmpdir, + ) + + assert profiles_path.exists() + + with open(profiles_path) as f: + result = f.read() + assert result == profiles_content + + +def test_download_dbt_project(gcs_bucket, gcs_hook, tmpdir, dbt_project_file): + """Test downloading dbt project from GCS path.""" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + with open(dbt_project_file) as pf: + project_content = pf.read() + bucket.blob("project/dbt_project.yml").upload_from_string(project_content.encode()) + bucket.blob("project/models/a_model.sql").upload_from_string(b"SELECT 1") + bucket.blob("project/models/another_model.sql").upload_from_string(b"SELECT 2") + bucket.blob("project/data/a_seed.csv").upload_from_string(b"col1,col2\n1,2") + + project_path = gcs_hook.download_dbt_project( + f"gs://{gcs_bucket}/project/", + tmpdir.mkdir("project"), + ) + + assert project_path.exists() + + dir_contents = [f for f in project_path.iterdir()] + assert sorted(str(f.name) for f in dir_contents) == [ + "data", + "dbt_project.yml", + "models", + ] + + with open(project_path / "dbt_project.yml") as f: + result = f.read() + assert result == project_content + + with open(project_path / "models" / "a_model.sql") as f: + result = f.read() + assert result == "SELECT 1" + + with open(project_path / "models" / "another_model.sql") as f: + result = f.read() + assert result == "SELECT 2" + + with open(project_path / "data" / "a_seed.csv") as f: + result = f.read() + assert result == "col1,col2\n1,2" + + +def test_download_dbt_project_no_trailing_slash( + gcs_bucket, gcs_hook, tmpdir, dbt_project_file +): + """Test whether an GCS path without a trailing slash pulls a dbt project.""" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + with open(dbt_project_file) as pf: + project_content = pf.read() + bucket.blob("project/dbt_project.yml").upload_from_string(project_content.encode()) + bucket.blob("project/models/a_model.sql").upload_from_string(b"SELECT 1") + bucket.blob("project/models/another_model.sql").upload_from_string(b"SELECT 2") + bucket.blob("project/data/a_seed.csv").upload_from_string(b"col1,col2\n1,2") + + project_path = gcs_hook.download_dbt_project( + f"gs://{gcs_bucket}/project", + tmpdir.mkdir("project"), + ) + + assert project_path.exists() + + dir_contents = [f for f in project_path.iterdir()] + assert sorted(str(f.name) for f in dir_contents) == [ + "data", + "dbt_project.yml", + "models", + ] + + with open(project_path / "dbt_project.yml") as f: + result = f.read() + assert result == project_content + + with open(project_path / "models" / "a_model.sql") as f: + result = f.read() + assert result == "SELECT 1" + + with open(project_path / "models" / "another_model.sql") as f: + result = f.read() + assert result == "SELECT 2" + + with open(project_path / "data" / "a_seed.csv") as f: + result = f.read() + assert result == "col1,col2\n1,2" + + +def test_download_dbt_project_from_zip_file( + gcs_bucket, gcs_hook, tmpdir, dbt_project_file, test_files +): + """Test downloading dbt project from ZipFile in GCS path.""" + with open(dbt_project_file) as pf: + project_content = pf.read() + + # Prepare a zip file to upload to GCS + zip_buffer = io.BytesIO() + with ZipFile(zip_buffer, "a") as zf: + zf.write(dbt_project_file, "dbt_project.yml") + for f in test_files: + # Since files are in a different temporary directory, we need to zip them + # with their direct parent, e.g. models/a_model.sql + zf.write(f, arcname="/".join([f.parts[-2], f.parts[-1]])) + + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + bucket.blob("project/project.zip").upload_from_string(zip_buffer.getvalue()) + + project_path = gcs_hook.download_dbt_project( + f"gs://{gcs_bucket}/project/project.zip", + tmpdir.mkdir("project"), + ) + + assert project_path.exists() + + dir_contents = [f for f in project_path.iterdir()] + assert sorted(str(f.name) for f in dir_contents) == [ + "dbt_project.yml", + "models", + "seeds", + ] + + with open(project_path / "dbt_project.yml") as f: + result = f.read() + assert result == project_content + + with open(project_path / "models" / "a_model.sql") as f: + result = f.read() + assert result == "SELECT 1" + + with open(project_path / "models" / "another_model.sql") as f: + result = f.read() + assert result == "SELECT 2" + + with open(project_path / "seeds" / "a_seed.csv") as f: + result = f.read() + assert result == "col1,col2\n1,2" + + +def test_upload_dbt_project_to_zip_file(gcs_bucket, gcs_hook, tmpdir, test_files): + """Test pushing a dbt project to a ZipFile in GCS path.""" + zip_gcs_key = f"gs://{gcs_bucket}/project/project.zip" + + gcs_hook.upload_dbt_project(test_files[0].parent.parent, zip_gcs_key) + + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + key = bucket.get_blob(blob_name="project/project.zip").exists() + keys = gcs_hook.list(bucket_name=gcs_bucket) + + assert key is True + assert "project/project.zip" in keys + + +def test_upload_dbt_project_to_files(gcs_bucket, gcs_hook, test_files): + """Test pushing a dbt project to a GCS path.""" + keys = gcs_hook.list(bucket_name=gcs_bucket) + if keys is not None: + # Airflow v1 returns None instead of an empty list if no results are found. + assert len(keys) == 0 + + prefix = f"gs://{gcs_bucket}/project/" + + gcs_hook.upload_dbt_project(test_files[0].parent.parent, prefix) + + keys = gcs_hook.list(bucket_name=gcs_bucket) + assert len(keys) == 4 + + +def test_upload_dbt_project_with_no_replace(gcs_bucket, gcs_hook, test_files): + """Test pushing a dbt project to a GCS path with replace = False. + + We store the gcs.Object last_modified attribute before pushing a project and compare + it to the new values after pushing (should be the same as we are not replacing). + """ + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + last_modified_expected = {} + + project_dir = test_files[0].parent.parent + + with freezegun.freeze_time("2022-01-01"): + for _file in project_dir.glob("**/*"): + if _file.is_dir(): + continue + + with open(_file) as f: + file_content = f.read() + + key = f"project/{_file.relative_to(project_dir)}" + bucket.blob(key).upload_from_string(file_content.encode()) + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + last_modified_expected[key] = obj.updated + + with freezegun.freeze_time("2022-02-02"): + # Try to push the same files, a month after. + # Should not be replaced since replace = False. + gcs_hook.upload_dbt_project( + project_dir, f"gs://{gcs_bucket}/project/", replace=False + ) + + keys = gcs_hook.list(bucket_name=gcs_bucket) + assert len(keys) == 4, keys + + last_modified_result = {} + for key in keys: + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + last_modified_result[key] = obj.updated + + assert last_modified_expected == last_modified_result + + +def test_upload_dbt_project_with_partial_replace( + gcs_bucket, gcs_hook, tmpdir, test_files +): + """Test pushing a dbt project to a GCS path with replace = False. + + For this test we are looking for one file to be pushed while the rest are to be + ignored as they already exist and we are running with replace = False. + """ + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + last_modified_expected = {} + + project_dir = test_files[0].parent.parent + + with freezegun.freeze_time("2022-01-01"): + for _file in project_dir.glob("**/*"): + if _file.is_dir(): + continue + + with open(_file) as f: + file_content = f.read() + + key = f"project/{_file.relative_to(project_dir)}" + bucket.blob(key).upload_from_string(file_content.encode()) + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + # Store the date these were modified to compare them after project is + # pushed. + last_modified_expected[key] = obj.updated + + gcs_hook.delete( + gcs_bucket, + "project/seeds/a_seed.csv", + ) + + with freezegun.freeze_time("2022-02-02"): + # Attempt to push project a month after. + # Only one file should be pushed as the rest exist and using replace = False. + gcs_hook.upload_dbt_project( + project_dir, f"gs://{gcs_bucket}/project/", replace=False + ) + + keys = gcs_hook.list(bucket_name=gcs_bucket) + assert len(keys) == 4 + + last_modified_result = {} + for key in keys: + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + last_modified_result[key] = obj.updated + + for key, value in last_modified_result.items(): + if key == "project/seeds/a_seed.csv": + # This is the only file which should have been modified + assert value > last_modified_expected[key] + else: + assert value == last_modified_expected[key] + + +def test_upload_dbt_project_with_delete_before( + gcs_bucket, gcs_hook, tmpdir, test_files +): + """Test pushing a dbt project to a GCS path with delete_before.""" + prefix = f"gs://{gcs_bucket}/project/" + bucket = gcs_hook.get_conn().get_bucket(gcs_bucket) + + last_modified_expected = {} + + project_dir = test_files[0].parent.parent + + with freezegun.freeze_time("2022-01-01"): + # delete_before = True should delete this random file not part of the project + bucket.blob("project/file_to_be_deleted").upload_from_string("content".encode()) + + for _file in project_dir.glob("**/*"): + if _file.is_dir(): + continue + + with open(_file) as f: + file_content = f.read() + + key = f"project/{_file.relative_to(project_dir)}" + bucket.blob(key).upload_from_string(file_content.encode()) + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + last_modified_expected[key] = obj.updated + + keys = gcs_hook.list(bucket_name=gcs_bucket) + assert len(keys) == 5 + + with freezegun.freeze_time("2022-02-02"): + # Try to push the same files, a month after. + gcs_hook.upload_dbt_project(project_dir, prefix, delete_before=True) + + keys = gcs_hook.list(bucket_name=gcs_bucket) + assert len(keys) == 4, keys + + last_modified_result = {} + for key in keys: + obj = gcs_hook.get_key( + key, + gcs_bucket, + ) + last_modified_result[key] = obj.updated + + for key, value in last_modified_result.items(): + # Even though we default to replace = False, everything was deleted. + assert value > last_modified_expected[key] + + +def test_load_file_handle_replace_error_returns_false_on_valueerror(gcp_conn_id): + """Test function returns False when underlying hook raises ValueError. + + Underlying GCSHook raises ValueError if attempting to replace an existing file with + replace = False. + """ + + class FakeHook(DbtGCSRemoteHook): + def load_file(*args, **kwargs): + raise ValueError() + + remote = FakeHook() + + result = remote.load_file_handle_replace_error("/path/to/file", "gs://path/to/key") + + assert result is False From 4ba8726211b889390cee613d3aca6b344ee16f37 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Fri, 28 Feb 2025 16:58:39 +0300 Subject: [PATCH 14/24] fix: add missing mutually exclusive attrs --- airflow_dbt_python/operators/dbt.py | 28 ++++++++++++++++++++ airflow_dbt_python/utils/configs.py | 40 +++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/airflow_dbt_python/operators/dbt.py b/airflow_dbt_python/operators/dbt.py index b00de28..dbe3979 100644 --- a/airflow_dbt_python/operators/dbt.py +++ b/airflow_dbt_python/operators/dbt.py @@ -79,6 +79,8 @@ def __init__( log_format: LogFormat = LogFormat.DEFAULT, log_cache_events: Optional[bool] = False, quiet: Optional[bool] = None, + no_quiet: Optional[bool] = None, + print: Optional[bool] = None, no_print: Optional[bool] = None, record_timing_info: Optional[str] = None, # Mutually exclusive @@ -98,6 +100,18 @@ def __init__( write_perf_info: Optional[bool] = None, send_anonymous_usage_stats: Optional[bool] = None, no_send_anonymous_usage_stats: Optional[bool] = None, + partial_parse_file_diff: Optional[bool] = None, + no_partial_parse_file_diff: Optional[bool] = None, + inject_ephemeral_ctes: Optional[bool] = None, + no_inject_ephemeral_ctes: Optional[bool] = None, + empty: Optional[bool] = None, + no_empty: Optional[bool] = None, + show_resource_report: Optional[bool] = None, + no_show_resource_report: Optional[bool] = None, + favor_state: Optional[bool] = None, + no_favor_state: Optional[bool] = None, + export_saved_queries: Optional[bool] = None, + no_export_saved_queries: Optional[bool] = None, # Extra features configuration dbt_conn_id: Optional[str] = None, profiles_conn_id: Optional[str] = None, @@ -129,6 +143,8 @@ def __init__( self.log_path = log_path self.log_cache_events = log_cache_events self.quiet = quiet + self.no_quiet = no_quiet + self.print = print self.no_print = no_print self.log_level = log_level self.log_level_file = log_level_file @@ -161,6 +177,18 @@ def __init__( ) self.write_perf_info = write_perf_info + self.partial_parse_file_diff = partial_parse_file_diff + self.no_partial_parse_file_diff = no_partial_parse_file_diff + self.inject_ephemeral_ctes = inject_ephemeral_ctes + self.no_inject_ephemeral_ctes = no_inject_ephemeral_ctes + self.empty = empty + self.no_empty = no_empty + self.show_resource_report = show_resource_report + self.no_show_resource_report = no_show_resource_report + self.favor_state = favor_state + self.no_favor_state = no_favor_state + self.export_saved_queries = export_saved_queries + self.no_export_saved_queries = no_export_saved_queries self.dbt_conn_id = dbt_conn_id self.profiles_conn_id = profiles_conn_id diff --git a/airflow_dbt_python/utils/configs.py b/airflow_dbt_python/utils/configs.py index eb0614d..cda2bb5 100644 --- a/airflow_dbt_python/utils/configs.py +++ b/airflow_dbt_python/utils/configs.py @@ -95,9 +95,11 @@ class BaseConfig: log_level_file: str = "none" record_timing_info: Optional[str] = None debug: Optional[bool] = None - quiet: Optional[bool] = None - no_print: Optional[bool] = None printer_width: int = 80 + quiet: Optional[bool] = None + no_quiet: Optional[bool] = dataclasses.field(default=None, repr=False) + print: Optional[bool] = None + no_print: Optional[bool] = dataclasses.field(default=None, repr=False) # Mutually exclusive attributes defer: Optional[bool] = None @@ -140,6 +142,32 @@ class BaseConfig: default=None, repr=False ) + partial_parse_file_diff: Optional[bool] = None + no_partial_parse_file_diff: Optional[bool] = dataclasses.field( + default=None, repr=False + ) + + inject_ephemeral_ctes: Optional[bool] = None + no_inject_ephemeral_ctes: Optional[bool] = dataclasses.field( + default=None, repr=False + ) + + empty: Optional[bool] = None + no_empty: Optional[bool] = dataclasses.field(default=None, repr=False) + + show_resource_report: Optional[bool] = None + no_show_resource_report: Optional[bool] = dataclasses.field( + default=None, repr=False + ) + + favor_state: Optional[bool] = None + no_favor_state: Optional[bool] = dataclasses.field(default=None, repr=False) + + export_saved_queries: Optional[bool] = None + no_export_saved_queries: Optional[bool] = dataclasses.field( + default=None, repr=False + ) + add_package: Optional[Package] = None dry_run: bool = False lock: bool = False @@ -178,6 +206,8 @@ def set_mutually_exclusive_attributes(self): to non-None values. """ mutually_exclusive_attrs = ( + ("quiet", False), + ("print", True), ("defer", False), ("partial_parse", True), ("log_cache_events", False), @@ -191,6 +221,12 @@ def set_mutually_exclusive_attributes(self): ("write_json", True), ("include_saved_query", None), ("clean_project_files_only", True), + ("partial_parse_file_diff", True), + ("inject_ephemeral_ctes", True), + ("empty", False), + ("show_resource_report", False), + ("favor_state", None), + ("export_saved_queries", None), ) for attrs, default_value in mutually_exclusive_attrs: From 364ba09253b67178aa536c48f0aa443e6a227f14 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 4 Mar 2025 15:04:48 +0300 Subject: [PATCH 15/24] docs: update docstring --- airflow_dbt_python/operators/dbt.py | 94 +++++++++++++++++++++++++++-- tests/operators/test_dbt_base.py | 5 +- 2 files changed, 92 insertions(+), 7 deletions(-) diff --git a/airflow_dbt_python/operators/dbt.py b/airflow_dbt_python/operators/dbt.py index dbe3979..5f49912 100644 --- a/airflow_dbt_python/operators/dbt.py +++ b/airflow_dbt_python/operators/dbt.py @@ -4,6 +4,7 @@ import datetime as dt import os +from abc import ABC, abstractmethod from dataclasses import asdict, is_dataclass from pathlib import Path from typing import TYPE_CHECKING, Any, Dict, Optional, Union @@ -38,18 +39,84 @@ class DbtBaseOperator(BaseOperator): command itself, subclasses should set it. Attributes: - command: The dbt command to execute. project_dir: Directory for dbt to look for dbt_profile.yml. Defaults to current directory. profiles_dir: Directory for dbt to look for profiles.yml. Defaults to ~/.dbt. profile: Which profile to load. Overrides dbt_profile.yml. target: Which target to load for the given profile. + state: Unless overridden, use this state directory for both state comparison + and deferral. + cache_selected_only: At start of run, populate relational cache + only for schemas containing selected nodes, or for all schemas of interest. + fail_fast: Stop execution on first failure. + single_threaded: Execute dbt command in single threaded mode. For test only + threads: Specify number of threads to use while executing models. + Overrides settings in profiles.yml. + use_experimental_parser: Enable experimental parsing features. vars: Supply variables to the project. Should be a YAML string. Overrides variables defined in dbt_profile.yml. + warn_error: If dbt would normally warn, instead raise an exception. + Examples include --select that selects nothing, deprecations, + configurations with no associated models, invalid test configurations, + and missing sources/refs in tests. + debug: Display debug logging during dbt execution. + Useful for debugging and making bug reports. + log_path: Log path for dbt execution. + log_level: Specify the minimum severity of events that are logged + to the console and the log file. + log_level_file: Specify the minimum severity of events that are logged + to the log file by overriding the default value + log_format: Specify the format of logging to the console and the log file. + log_format_file: Specify the format of logging to the log file by overriding + the default value log_cache_events: Flag to enable logging of cache events. - s3_conn_id: An s3 Airflow connection ID to use when pulling dbt files from s3. + quiet/no_quiet: Suppress all non-error logging to stdout. + Does not affect {{ print() }} macro calls. + print/no_print: Output all {{ print() }} macro calls. + record_timing_info: When this option is passed, dbt will output low-level + timing stats to the specified file. + defer/no_defer: If set, resolve unselected nodes by deferring to the manifest + within the --state directory. + partial_parse/no_partial_parse: Allow for partial parsing by looking for + and writing to a pickle file in the target directory. + introspect/no_introspect: Whether to scaffold introspective queries + as part of compilation + use_colors/no_use_colors: Specify whether log output is colorized + in the console and the log file. + static_parser/no_static_parser: Use the static parser. + version_check/no_version_check: If set, ensure the installed dbt version matches + the require-dbt-version specified in the dbt_project.yml file (if any). + Otherwise, allow them to differ. + write_json/no_write_json: Whether or not to write the manifest.json + and run_results.json files to the target directory + send_anonymous_usage_stats/no_send_anonymous_usage_stats: Send anonymous usage + stats to dbt Labs. + partial_parse_file_diff/no_partial_parse_file_diff: Internal flag for whether + to compute a file diff during partial parsing. + inject_ephemeral_ctes/no_inject_ephemeral_ctes: Internal flag controlling + injection of referenced ephemeral models' CTEs during `compile`. + empty/no_empty: If specified, limit input refs and sources to zero rows. + show_resource_report/no_show_resource_report: If set, dbt will output + resource report into log. + favor_state/no_favor_state: If set, defer to the argument provided to + the state flag for resolving unselected nodes, even if the node(s) exist + as a database object in the current environment. + export_saved_queries/no_export_saved_queries: Export saved queries within + the 'build' command, otherwise no-op + dbt_conn_id: An Airflow connection ID to generate dbt profile from. + profiles_conn_id: An Airflow connection ID to use for pulling dbt profiles + from remote (e.g. git/s3/gcs). + project_conn_id: An Airflow connection ID to use for pulling dbt project + from remote (e.g. git/s3/gcs). do_xcom_push_artifacts: A list of dbt artifacts to XCom push. + upload_dbt_project: Flag to enable unloading the project dbt after the operator + execution back to project_dir. + delete_before_upload: Flag to enable cleaning up project_dir before uploading + dbt project back to. + replace_on_upload: Flag to allow replacing files when uploading dbt project + back to project_dir. + env_vars: Supply environment variables to the project """ template_fields = base_template_fields @@ -77,6 +144,7 @@ def __init__( log_level: Optional[str] = None, log_level_file: Optional[str] = None, log_format: LogFormat = LogFormat.DEFAULT, + log_format_file: LogFormat = LogFormat.DEBUG, log_cache_events: Optional[bool] = False, quiet: Optional[bool] = None, no_quiet: Optional[bool] = None, @@ -149,6 +217,7 @@ def __init__( self.log_level = log_level self.log_level_file = log_level_file self.log_format = log_format + self.log_format_file = log_format_file self.record_timing_info = record_timing_info self.dbt_defer = defer @@ -243,6 +312,7 @@ def execute(self, context): return serializable_result @property + @abstractmethod def command(self) -> str: """Return the current dbt command. @@ -296,6 +366,22 @@ def make_run_results_serializable( return asdict(result, dict_factory=run_result_factory) +class _GraphRunnableOperator(ABC, DbtBaseOperator): + """The abstract base Airflow dbt operator for list/compile commands. + + Attributes: + compiled_target: + """ + + def __init__( + self, + compiled_target: Optional[Union[os.PathLike, str, bytes]] = None, + **kwargs, + ): + super().__init__(**kwargs) + self.compiled_target = compiled_target + + selection_template_fields = ["select", "exclude"] @@ -397,7 +483,7 @@ def command(self) -> str: return "test" -class DbtCompileOperator(DbtBaseOperator): +class DbtCompileOperator(_GraphRunnableOperator): """Executes a dbt compile command. The compile command generates SQL files. The @@ -542,7 +628,7 @@ def command(self) -> str: return "snapshot" -class DbtLsOperator(DbtBaseOperator): +class DbtLsOperator(_GraphRunnableOperator): """Executes a dbt list (or ls) command. The documentation for the dbt command can be found here: diff --git a/tests/operators/test_dbt_base.py b/tests/operators/test_dbt_base.py index 7f7cebf..6fefbd1 100644 --- a/tests/operators/test_dbt_base.py +++ b/tests/operators/test_dbt_base.py @@ -7,6 +7,5 @@ def test_dbt_base_does_not_implement_command(): """Test DbtBaseOperator doesn't implement a command.""" - op = DbtBaseOperator(task_id="dbt_task") - with pytest.raises(NotImplementedError): - op.command + with pytest.raises(TypeError): + DbtBaseOperator(task_id="dbt_task") From f7605535740d746e761f2140df1d46a8686748f2 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 4 Mar 2025 15:34:46 +0300 Subject: [PATCH 16/24] docs: update --- docs/development.rst | 4 ++-- docs/getting_started.rst | 4 ++-- docs/how_does_it_work.rst | 2 +- docs/introduction.rst | 6 +++--- docs/reference/hooks.rst | 6 ++++++ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/development.rst b/docs/development.rst index ca3d338..885a987 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -43,7 +43,7 @@ If you wish to install a different version of Airflow for testing you may skip t .. code-block:: shell - pip install apache-airflow==2.2 apache-airflow-providers-amazon==5.0 + pip install apache-airflow>=2.2 apache-airflow-providers-amazon>=3.0 Modifying dependencies ---------------------- @@ -134,6 +134,6 @@ Most of *airflow-dbt-python*'s operator and hook tests follow the same pattern: 1. Initialize a specific operator or hook. 2. Run it with a basic test *dbt* project against the test PostgreSQL database. -3. Assert *dbt* executes succesfuly, any results are properly propagated, and any artifacts are pushed to where they need to go. +3. Assert *dbt* executes successfully, any results are properly propagated, and any artifacts are pushed to where they need to go. However, *airflow-dbt-python* also includes DAG tests, which can be seen as broader integration tests. These are located under ``tests/dags/``. DAG tests focus on testing complete end-to-end DAGs, including those shown in :ref:`example_dags`. diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 4c7be02..ef09d22 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -118,7 +118,7 @@ Accessing a *dbt* project 1. Using a `local executor `_ with a single-machine installation means we can rely on the local machine's filesystem to store a *dbt* project. This also applies to ``DebugExecutor`` and ``SequentialExecutor``, but these executors are generally only used for debugging/development so we will ignore them. If you are running a setup like this, then simply ensure your *dbt* project and *profiles.yml* exist somewhere in the ``LocalExecutor``'s file system. -2. Once your setup has evolved to a multi-machine/cloud installation with any remote executor, we must rely on a remote storage for *dbt* files. Currently, supported remote storages include AWS S3 and git remote repositories although more are in plans to be added. In this setup, your *dbt* project will need to be uploaded to a remote storage that Airflow can access. *airflow-dbt-python* can utilize Airflow connections to access these storages. +2. Once your setup has evolved to a multi-machine/cloud installation with any remote executor, we must rely on a remote storage for *dbt* files. Currently, supported remote storages include AWS S3, Google Cloud Storage and Git repositories although more are in plans to be added. In this setup, your *dbt* project will need to be uploaded to a remote storage that Airflow can access. *airflow-dbt-python* can utilize Airflow connections to access these storages. Single-machine installation ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -316,7 +316,7 @@ The DAG looks the same as the AWS S3 example, except that now we use the GitHub project_dir="git+ssh://github.com:dbt-labs/jaffle-shop-classic", select=["+tag:daily"], exclude=["tag:deprecated"], - target="my_warehouse_connection", + dbt_conn_id="my_warehouse_connection", profile="my-project", ) diff --git a/docs/how_does_it_work.rst b/docs/how_does_it_work.rst index e0e6705..c38b798 100644 --- a/docs/how_does_it_work.rst +++ b/docs/how_does_it_work.rst @@ -58,7 +58,7 @@ This ensures *dbt* can work with any Airflow deployment, including most producti *dbt* remote hooks ------------------ -*dbt* remote hooks implement a simple interface to communicate with *dbt* remotes. A *dbt* remote can be any external storage that contains a *dbt* project and potentially also a *profiles.yml* file for example: an AWS S3 bucket or a GitHub repository. See the reference for a list of which remotes are currently supported. +*dbt* remote hooks implement a simple interface to communicate with *dbt* remotes. A *dbt* remote can be any external storage that contains a *dbt* project and potentially also a *profiles.yml* file for example: an AWS S3 bucket, a Google Cloud Storage or a GitHub repository. See the reference for a list of which remotes are currently supported. Implementing the ``DbtRemoteHook`` interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/introduction.rst b/docs/introduction.rst index 6a2cd13..2ffd35a 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -14,7 +14,7 @@ Features We believe Airflow can **enhance** a *dbt* user's experience with several additional features that leverage Airflow as much as possible: * Configuring *dbt* connections with Airflow connections. -* Downloading *dbt* projects from remote storages, like `AWS S3 `_ or Github repositories. +* Downloading *dbt* projects from remote storages, like `AWS S3 `_, `Google Cloud Storage `_ or Github repositories. * Communicate between tasks by pushing results and artifacts to `XCom `_. Can you think of another way Airflow can enhance *dbt*? Let us know in a `GitHub issue `_! @@ -26,7 +26,7 @@ Read along for a breakdown of *airflow-dbt-python*'s main features, or head over Download dbt files from S3 ^^^^^^^^^^^^^^^^^^^^^^^^^^ -The dbt parameters ``profiles_dir`` and ``project_dir`` would normally point to a directory containing a ``profiles.yml`` file and a dbt project in the local environment respectively (defined by the presence of a ``dbt_project.yml`` file). airflow-dbt-python extends these parameters to also accept an `AWS S3 `_ URL (identified by a ``s3://`` scheme): +The dbt parameters ``profiles_dir`` and ``project_dir`` would normally point to a directory containing a ``profiles.yml`` file and a dbt project in the local environment respectively (defined by the presence of a ``dbt_project.yml`` file). airflow-dbt-python extends these parameters to also accept an `AWS S3 `_ URL (identified by a ``s3://`` scheme) and a `Google Cloud Storate `_ URL (identified by a ``gs://`` scheme): * If an S3 URL is used for ``profiles_dir``, then this URL must point to a directory in S3 that contains a ``profiles.yml`` file. The ``profiles.yml`` file will be downloaded and made available for the operator to use when running. * If an S3 URL is used for ``project_dir``, then this URL must point to a directory in S3 containing all the files required for a dbt project to run. All of the contents of this directory will be downloaded and made available for the operator. The URL may also point to a zip file containing all the files of a dbt project, which will be downloaded, uncompressed, and made available for the operator. @@ -134,7 +134,7 @@ Use Airflow connections as dbt targets (without a profiles.yml) ) as dag: dbt_run = DbtRunOperator( task_id="dbt_run_hourly", - target="my_db_connection", + dbt_conn_id="my_db_connection", # Profiles file is not needed as we are using an Airflow connection. # If a profiles file is used, the Airflow connection will be merged to the # existing targets diff --git a/docs/reference/hooks.rst b/docs/reference/hooks.rst index 2aaed4c..66cad15 100644 --- a/docs/reference/hooks.rst +++ b/docs/reference/hooks.rst @@ -33,3 +33,9 @@ The DbtRemoteHook interface .. automodule:: airflow_dbt_python.hooks.remote.s3 :members: + +*dbt* GCS remote +^^^^^^^^^^^^^^^^ + +.. automodule:: airflow_dbt_python.hooks.remote.gcs + :members: From 40d1f50a326e4e1b570472c4c787cd24ef0687db Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 4 Mar 2025 16:11:47 +0300 Subject: [PATCH 17/24] fix: mypy checks --- airflow_dbt_python/hooks/remote/gcs.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/airflow_dbt_python/hooks/remote/gcs.py b/airflow_dbt_python/hooks/remote/gcs.py index 36e56cc..31cc459 100644 --- a/airflow_dbt_python/hooks/remote/gcs.py +++ b/airflow_dbt_python/hooks/remote/gcs.py @@ -194,7 +194,7 @@ def load_file( self, filename: Path | str, key: str, - bucket_name: str | None = None, + bucket_name: str, replace: bool = False, encrypt: bool = False, gzip: bool = False, @@ -215,7 +215,6 @@ def load_file( if not replace and self.check_for_key(key, bucket_name): raise ValueError(f"The key {key} already exists.") - metadata = {} if encrypt: raise NotImplementedError("Encrypt is not implemented in GCSHook.") @@ -224,7 +223,6 @@ def load_file( object_name=key, filename=filename, gzip=gzip, - metadata=metadata, ) get_hook_lineage_collector().add_input_asset( context=self, scheme="file", asset_kwargs={"path": filename} From c666d7b5a80a81dd8eb529d1201ac5267216e609 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Wed, 19 Feb 2025 16:59:45 +0300 Subject: [PATCH 18/24] chore: Version v3.0.0 bump --- README.md | 2 +- airflow_dbt_python/__version__.py | 2 +- docs/getting_started.rst | 12 +- poetry.lock | 5809 +++++++++++++++++++---------- pyproject.toml | 4 +- 5 files changed, 3779 insertions(+), 2050 deletions(-) diff --git a/README.md b/README.md index 217b4cb..edbbddc 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Before using *airflow-dbt-python*, ensure you meet the following requirements: * If using any managed service, like AWS MWAA or GCP Cloud Composer 2/3, ensure your environment is created with a supported version of Airflow. * If self-hosting, Airflow installation instructions can be found in their [official documentation](https://airflow.apache.org/docs/apache-airflow/stable/installation/index.html). -* Running Python 3.8 or later in your Airflow environment. +* Running Python 3.9 or later in your Airflow environment. > **Warning** > diff --git a/airflow_dbt_python/__version__.py b/airflow_dbt_python/__version__.py index 43d6206..13ca1dd 100644 --- a/airflow_dbt_python/__version__.py +++ b/airflow_dbt_python/__version__.py @@ -3,4 +3,4 @@ __author__ = "Tomás Farías Santana" __copyright__ = "Copyright 2021 Tomás Farías Santana" __title__ = "airflow-dbt-python" -__version__ = "2.2.0" +__version__ = "3.0.0" diff --git a/docs/getting_started.rst b/docs/getting_started.rst index ef09d22..f0307a7 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -9,19 +9,19 @@ Requirements ------------ Before using *airflow-dbt-python*, ensure you meet the following requirements: -* A *dbt* project using `dbt-core `_ version 1.0.0 or later. -* An Airflow environment using version 2.2 or later. +* A *dbt* project using `dbt-core `_ version 1.8 or later. +* An Airflow environment using version 2.8 or later. - * If using any managed service, like AWS MWAA, ensure your environment is created with a supported version of Airflow. + * If using any managed service, like AWS MWAA or GCP Cloud Composer 2/3, ensure your environment is created with a supported version of Airflow. * If self-hosting, Airflow installation instructions can be found in their `official documentation `_. -* Running Python 3.7 or later in your Airflow environment. +* Running Python 3.9 or later in your Airflow environment. .. warning:: Even though we don't impose any upper limits on versions of Airflow and *dbt*, it's possible that new versions are not supported immediately after release, particularly for *dbt*. We recommend testing the latest versions before upgrading and `reporting any issues `_. .. note:: - Older versions of Airflow and *dbt* may work with *airflow-dbt-python*, although we cannot guarantee this. Our testing pipeline runs the latest *dbt-core* with the latest Airflow release, and the latest version supported by `AWS MWAA `_. + Older versions of Airflow and *dbt* may work with *airflow-dbt-python*, although we cannot guarantee this. Our testing pipeline runs the latest *dbt-core* with the latest Airflow release, and the latest version supported by `AWS MWAA `_ and `GCP Cloud Composer 2/3 `_. Installation ------------ @@ -109,7 +109,7 @@ The wheel file can now be added to your *plugins.zip*, and the requirements can .. code-block:: shell :caption: requirements.txt - /usr/local/airflow/plugins/airflow_dbt_python-1.0.0-py3-none-any.whl + /usr/local/airflow/plugins/airflow_dbt_python-3.0.0-py3-none-any.whl Accessing a *dbt* project ------------------------- diff --git a/poetry.lock b/poetry.lock index d5548b6..c30e21d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,13 +1,12 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "agate" version = "1.9.1" description = "A data analysis library that is optimized for humans instead of machines." -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "agate-1.9.1-py2.py3-none-any.whl", hash = "sha256:1cf329510b3dde07c4ad1740b7587c9c679abc3dcd92bb1107eabc10c2e03c50"}, {file = "agate-1.9.1.tar.gz", hash = "sha256:bc60880c2ee59636a2a80cd8603d63f995be64526abf3cbba12f00767bcd5b3d"}, @@ -23,106 +22,121 @@ pytimeparse = ">=1.1.5" tzdata = {version = ">=2023.3", markers = "platform_system == \"Windows\""} [package.extras] -test = ["PyICU (>=2.4.2)", "backports.zoneinfo", "coverage (>=3.7.1)", "cssselect (>=0.9.1)", "lxml (>=3.6.0)", "pytest", "pytest-cov"] +test = ["PyICU (>=2.4.2) ; sys_platform == \"linux\"", "backports.zoneinfo ; python_version < \"3.9\"", "coverage (>=3.7.1)", "cssselect (>=0.9.1)", "lxml (>=3.6.0)", "pytest", "pytest-cov"] + +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] [[package]] name = "aiohappyeyeballs" -version = "2.4.4" +version = "2.4.8" description = "Happy Eyeballs for asyncio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, - {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, + {file = "aiohappyeyeballs-2.4.8-py3-none-any.whl", hash = "sha256:6cac4f5dd6e34a9644e69cf9021ef679e4394f54e58a183056d12009e42ea9e3"}, + {file = "aiohappyeyeballs-2.4.8.tar.gz", hash = "sha256:19728772cb12263077982d2f55453babd8bec6a052a926cd5c0c42796da8bf62"}, ] [[package]] name = "aiohttp" -version = "3.11.11" +version = "3.11.13" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, - {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, - {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, - {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, - {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, - {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, - {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, - {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, - {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, - {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, - {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, +files = [ + {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4fe27dbbeec445e6e1291e61d61eb212ee9fed6e47998b27de71d70d3e8777d"}, + {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e64ca2dbea28807f8484c13f684a2f761e69ba2640ec49dacd342763cc265ef"}, + {file = "aiohttp-3.11.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9840be675de208d1f68f84d578eaa4d1a36eee70b16ae31ab933520c49ba1325"}, + {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28a772757c9067e2aee8a6b2b425d0efaa628c264d6416d283694c3d86da7689"}, + {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b88aca5adbf4625e11118df45acac29616b425833c3be7a05ef63a6a4017bfdb"}, + {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce10ddfbe26ed5856d6902162f71b8fe08545380570a885b4ab56aecfdcb07f4"}, + {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa48dac27f41b36735c807d1ab093a8386701bbf00eb6b89a0f69d9fa26b3671"}, + {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89ce611b1eac93ce2ade68f1470889e0173d606de20c85a012bfa24be96cf867"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78e4dd9c34ec7b8b121854eb5342bac8b02aa03075ae8618b6210a06bbb8a115"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:66047eacbc73e6fe2462b77ce39fc170ab51235caf331e735eae91c95e6a11e4"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ad8f1c19fe277eeb8bc45741c6d60ddd11d705c12a4d8ee17546acff98e0802"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64815c6f02e8506b10113ddbc6b196f58dbef135751cc7c32136df27b736db09"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:967b93f21b426f23ca37329230d5bd122f25516ae2f24a9cea95a30023ff8283"}, + {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf1f31f83d16ec344136359001c5e871915c6ab685a3d8dee38e2961b4c81730"}, + {file = "aiohttp-3.11.13-cp310-cp310-win32.whl", hash = "sha256:00c8ac69e259c60976aa2edae3f13d9991cf079aaa4d3cd5a49168ae3748dee3"}, + {file = "aiohttp-3.11.13-cp310-cp310-win_amd64.whl", hash = "sha256:90d571c98d19a8b6e793b34aa4df4cee1e8fe2862d65cc49185a3a3d0a1a3996"}, + {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b35aab22419ba45f8fc290d0010898de7a6ad131e468ffa3922b1b0b24e9d2e"}, + {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81cba651db8795f688c589dd11a4fbb834f2e59bbf9bb50908be36e416dc760"}, + {file = "aiohttp-3.11.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f55d0f242c2d1fcdf802c8fabcff25a9d85550a4cf3a9cf5f2a6b5742c992839"}, + {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4bea08a6aad9195ac9b1be6b0c7e8a702a9cec57ce6b713698b4a5afa9c2e33"}, + {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6070bcf2173a7146bb9e4735b3c62b2accba459a6eae44deea0eb23e0035a23"}, + {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:718d5deb678bc4b9d575bfe83a59270861417da071ab44542d0fcb6faa686636"}, + {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f6b2c5b4a4d22b8fb2c92ac98e0747f5f195e8e9448bfb7404cd77e7bfa243f"}, + {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747ec46290107a490d21fe1ff4183bef8022b848cf9516970cb31de6d9460088"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:01816f07c9cc9d80f858615b1365f8319d6a5fd079cd668cc58e15aafbc76a54"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a08ad95fcbd595803e0c4280671d808eb170a64ca3f2980dd38e7a72ed8d1fea"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c97be90d70f7db3aa041d720bfb95f4869d6063fcdf2bb8333764d97e319b7d0"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ab915a57c65f7a29353c8014ac4be685c8e4a19e792a79fe133a8e101111438e"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:35cda4e07f5e058a723436c4d2b7ba2124ab4e0aa49e6325aed5896507a8a42e"}, + {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:af55314407714fe77a68a9ccaab90fdb5deb57342585fd4a3a8102b6d4370080"}, + {file = "aiohttp-3.11.13-cp311-cp311-win32.whl", hash = "sha256:42d689a5c0a0c357018993e471893e939f555e302313d5c61dfc566c2cad6185"}, + {file = "aiohttp-3.11.13-cp311-cp311-win_amd64.whl", hash = "sha256:b73a2b139782a07658fbf170fe4bcdf70fc597fae5ffe75e5b67674c27434a9f"}, + {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eabb269dc3852537d57589b36d7f7362e57d1ece308842ef44d9830d2dc3c90"}, + {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b77ee42addbb1c36d35aca55e8cc6d0958f8419e458bb70888d8c69a4ca833d"}, + {file = "aiohttp-3.11.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55789e93c5ed71832e7fac868167276beadf9877b85697020c46e9a75471f55f"}, + {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c929f9a7249a11e4aa5c157091cfad7f49cc6b13f4eecf9b747104befd9f56f2"}, + {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d33851d85537bbf0f6291ddc97926a754c8f041af759e0aa0230fe939168852b"}, + {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9229d8613bd8401182868fe95688f7581673e1c18ff78855671a4b8284f47bcb"}, + {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669dd33f028e54fe4c96576f406ebb242ba534dd3a981ce009961bf49960f117"}, + {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1b20a1ace54af7db1f95af85da530fe97407d9063b7aaf9ce6a32f44730778"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5724cc77f4e648362ebbb49bdecb9e2b86d9b172c68a295263fa072e679ee69d"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa36c35e94ecdb478246dd60db12aba57cfcd0abcad43c927a8876f25734d496"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9b5b37c863ad5b0892cc7a4ceb1e435e5e6acd3f2f8d3e11fa56f08d3c67b820"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e06cf4852ce8c4442a59bae5a3ea01162b8fcb49ab438d8548b8dc79375dad8a"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5194143927e494616e335d074e77a5dac7cd353a04755330c9adc984ac5a628e"}, + {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afcb6b275c2d2ba5d8418bf30a9654fa978b4f819c2e8db6311b3525c86fe637"}, + {file = "aiohttp-3.11.13-cp312-cp312-win32.whl", hash = "sha256:7104d5b3943c6351d1ad7027d90bdd0ea002903e9f610735ac99df3b81f102ee"}, + {file = "aiohttp-3.11.13-cp312-cp312-win_amd64.whl", hash = "sha256:47dc018b1b220c48089b5b9382fbab94db35bef2fa192995be22cbad3c5730c8"}, + {file = "aiohttp-3.11.13-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9862d077b9ffa015dbe3ce6c081bdf35135948cb89116e26667dd183550833d1"}, + {file = "aiohttp-3.11.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbfef0666ae9e07abfa2c54c212ac18a1f63e13e0760a769f70b5717742f3ece"}, + {file = "aiohttp-3.11.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a1f7d857c4fcf7cabb1178058182c789b30d85de379e04f64c15b7e88d66fb"}, + {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba40b7ae0f81c7029583a338853f6607b6d83a341a3dcde8bed1ea58a3af1df9"}, + {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5b95787335c483cd5f29577f42bbe027a412c5431f2f80a749c80d040f7ca9f"}, + {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7d474c5c1f0b9405c1565fafdc4429fa7d986ccbec7ce55bc6a330f36409cad"}, + {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e83fb1991e9d8982b3b36aea1e7ad27ea0ce18c14d054c7a404d68b0319eebb"}, + {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4586a68730bd2f2b04a83e83f79d271d8ed13763f64b75920f18a3a677b9a7f0"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fe4eb0e7f50cdb99b26250d9328faef30b1175a5dbcfd6d0578d18456bac567"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2a8a6bc19818ac3e5596310ace5aa50d918e1ebdcc204dc96e2f4d505d51740c"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f27eec42f6c3c1df09cfc1f6786308f8b525b8efaaf6d6bd76c1f52c6511f6a"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2a4a13dfbb23977a51853b419141cd0a9b9573ab8d3a1455c6e63561387b52ff"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:02876bf2f69b062584965507b07bc06903c2dc93c57a554b64e012d636952654"}, + {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b992778d95b60a21c4d8d4a5f15aaab2bd3c3e16466a72d7f9bfd86e8cea0d4b"}, + {file = "aiohttp-3.11.13-cp313-cp313-win32.whl", hash = "sha256:507ab05d90586dacb4f26a001c3abf912eb719d05635cbfad930bdbeb469b36c"}, + {file = "aiohttp-3.11.13-cp313-cp313-win_amd64.whl", hash = "sha256:5ceb81a4db2decdfa087381b5fc5847aa448244f973e5da232610304e199e7b2"}, + {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:51c3ff9c7a25f3cad5c09d9aacbc5aefb9267167c4652c1eb737989b554fe278"}, + {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e271beb2b1dabec5cd84eb488bdabf9758d22ad13471e9c356be07ad139b3012"}, + {file = "aiohttp-3.11.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e9eb7e5764abcb49f0e2bd8f5731849b8728efbf26d0cac8e81384c95acec3f"}, + {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baae005092e3f200de02699314ac8933ec20abf998ec0be39448f6605bce93df"}, + {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1982c98ac62c132d2b773d50e2fcc941eb0b8bad3ec078ce7e7877c4d5a2dce7"}, + {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2b25b2eeb35707113b2d570cadc7c612a57f1c5d3e7bb2b13870fe284e08fc0"}, + {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b27961d65639128336b7a7c3f0046dcc62a9443d5ef962e3c84170ac620cec47"}, + {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe9f1e05025eacdd97590895e2737b9f851d0eb2e017ae9574d9a4f0b6252"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa1fb1b61881c8405829c50e9cc5c875bfdbf685edf57a76817dfb50643e4a1a"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:25de43bb3cf83ad83efc8295af7310219af6dbe4c543c2e74988d8e9c8a2a917"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe7065e2215e4bba63dc00db9ae654c1ba3950a5fff691475a32f511142fcddb"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7836587eef675a17d835ec3d98a8c9acdbeb2c1d72b0556f0edf4e855a25e9c1"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:85fa0b18558eb1427090912bd456a01f71edab0872f4e0f9e4285571941e4090"}, + {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a86dc177eb4c286c19d1823ac296299f59ed8106c9536d2b559f65836e0fb2c6"}, + {file = "aiohttp-3.11.13-cp39-cp39-win32.whl", hash = "sha256:684eea71ab6e8ade86b9021bb62af4bf0881f6be4e926b6b5455de74e420783a"}, + {file = "aiohttp-3.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:82c249f2bfa5ecbe4a1a7902c81c0fba52ed9ebd0176ab3047395d02ad96cfcb"}, + {file = "aiohttp-3.11.13.tar.gz", hash = "sha256:8ce789231404ca8fff7f693cdce398abf6d90fd5dae2b1847477196c243b1fbb"}, ] [package.dependencies] @@ -136,7 +150,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -145,7 +159,6 @@ description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -161,7 +174,6 @@ description = "asyncio bridge to the standard sqlite3 module" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0"}, {file = "aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3"}, @@ -181,7 +193,6 @@ description = "A light, configurable Sphinx theme" optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, @@ -194,7 +205,6 @@ description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5"}, {file = "alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213"}, @@ -206,16 +216,15 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["backports.zoneinfo", "tzdata"] +tz = ["backports.zoneinfo ; python_version < \"3.9\"", "tzdata"] [[package]] name = "annotated-types" version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -228,7 +237,6 @@ description = "High level compatibility layer for multiple asynchronous event lo optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -242,20 +250,19 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] [[package]] name = "apache-airflow" -version = "2.10.4" +version = "2.10.5" description = "Programmatically author, schedule and monitor data pipelines" optional = false python-versions = "<3.13,>=3.8.1" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow-2.10.4-py3-none-any.whl", hash = "sha256:9470a26479034ddede69fca913d7f84a32dd883368861b9421e2a692c0fc5ef4"}, - {file = "apache_airflow-2.10.4.tar.gz", hash = "sha256:10ebf8b95c59ba229f06235665e92cc684577861cfd1e96bdbe3d3eb7cb5779a"}, + {file = "apache_airflow-2.10.5-py3-none-any.whl", hash = "sha256:4c6d19159bcd85f496fbea70db72ef55d32335f80e4ffb82ae3c252782079ca0"}, + {file = "apache_airflow-2.10.5.tar.gz", hash = "sha256:1a2b1f1082d530fee039989cdff7192fcfd98d8e909d1c5650e61e10c418e488"}, ] [package.dependencies] @@ -344,7 +351,7 @@ all-core = ["apache-airflow[aiobotocore]", "apache-airflow[apache-atlas]", "apac all-dbs = ["apache-airflow[apache-cassandra]", "apache-airflow[apache-drill]", "apache-airflow[apache-druid]", "apache-airflow[apache-hdfs]", "apache-airflow[apache-hive]", "apache-airflow[apache-impala]", "apache-airflow[apache-pinot]", "apache-airflow[arangodb]", "apache-airflow[cloudant]", "apache-airflow[databricks]", "apache-airflow[exasol]", "apache-airflow[influxdb]", "apache-airflow[microsoft-mssql]", "apache-airflow[mongo]", "apache-airflow[mysql]", "apache-airflow[neo4j]", "apache-airflow[postgres]", "apache-airflow[presto]", "apache-airflow[trino]", "apache-airflow[vertica]"] amazon = ["apache-airflow-providers-amazon"] apache-atlas = ["atlasclient (>=0.1.2)"] -apache-beam = ["apache-airflow-providers-apache-beam"] +apache-beam = ["apache-airflow-providers-apache-beam ; python_version != \"3.12\""] apache-cassandra = ["apache-airflow-providers-apache-cassandra"] apache-drill = ["apache-airflow-providers-apache-drill"] apache-druid = ["apache-airflow-providers-apache-druid"] @@ -382,7 +389,7 @@ databricks = ["apache-airflow-providers-databricks"] datadog = ["apache-airflow-providers-datadog"] dbt-cloud = ["apache-airflow-providers-dbt-cloud"] deprecated-api = ["requests (>=2.27.0,<3)"] -devel-ci = ["aiobotocore (>=2.9.0)", "aiofiles (>=23.2.0)", "aioresponses (>=0.7.6)", "amqp", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "authlib (>=1.0.0)", "backports-zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black (>=23.12.0)", "blinker (>=1.1)", "blinker (>=1.7.0)", "cgroupspy (>=0.2.2)", "checksumdir (>=1.2.0)", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudpickle", "coverage (>=7.4.0)", "diagrams (>=0.23.4)", "docutils (>=0.16,<0.17)", "duckdb (>=0.10.0)", "duckdb (>=0.9.0)", "eralchemy2 (>=1.3.8)", "eventlet (>=0.33.3)", "flask-bcrypt (>=0.7.1)", "gevent (>=0.13)", "gitpython (>=3.1.40)", "graphviz (>=0.12)", "greenlet (>=0.4.9)", "hatch (>=1.9.1)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "incremental (>=22.10.0,!=24.7.0,!=24.7.1)", "ipdb (>=0.13.13)", "jmespath (>=0.7.0)", "ldap3 (>=2.5.1)", "mypy (==1.9.0)", "opentelemetry-exporter-prometheus", "pandas (>=1.2.5,<2.2)", "pipdeptree (>=2.13.1)", "plyvel (>=1.5.1)", "pre-commit (>=3.5.0)", "pydantic (>=2.3.0)", "pygithub (>=2.1.1)", "pykerberos (>=1.1.13)", "pytest (>=8.2,<9)", "pytest-asyncio (>=0.23.6)", "pytest-cov (>=4.1.0)", "pytest-custom-exit-code (>=0.3.0)", "pytest-icdiff (>=0.9)", "pytest-instafail (>=0.5.0)", "pytest-mock (>=3.12.0)", "pytest-rerunfailures (>=13.0)", "pytest-timeouts (>=1.2.1)", "pytest-xdist (>=3.5.0)", "python-ldap", "python3-saml (>=1.16.0)", "requests (>=2.27.0,<3)", "requests-kerberos (>=0.10.0)", "requests-mock (>=1.11.0)", "restructuredtext-lint (>=1.4.0)", "rich-click (>=1.7.0)", "ruff (==0.5.5)", "s3fs (>=2023.10.0)", "semver (>=3.0.2)", "sentry-sdk (>=1.32.0,!=1.33.0)", "sphinx (>=5.3.0,<6.0.0)", "sphinx-airflow-theme (>=0.0.12)", "sphinx-argparse (>=0.4.0)", "sphinx-autoapi (>=2.1.1)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0.2)", "sphinx-rtd-theme (>=2.0.0)", "sphinxcontrib-applehelp (>=1.0.4)", "sphinxcontrib-devhelp (>=1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.1)", "sphinxcontrib-httpdomain (>=1.8.1)", "sphinxcontrib-jquery (>=4.1)", "sphinxcontrib-jsmath (>=1.0.1)", "sphinxcontrib-qthelp (>=1.0.3)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (>=8.0.0)", "statsd (>=3.3.0)", "thrift-sasl (>=0.2.0)", "time-machine (>=2.13.0)", "towncrier (>=23.11.0)", "twine (>=4.0.2)", "types-aiofiles", "types-certifi", "types-croniter", "types-deprecated", "types-docutils", "types-markdown", "types-paramiko", "types-protobuf", "types-pymysql", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-pyyaml", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "uv (>=0.1.32)", "virtualenv", "wheel (>=0.42.0)", "yamllint (>=1.33.0)"] +devel-ci = ["aiobotocore (>=2.9.0)", "aiofiles (>=23.2.0)", "aioresponses (>=0.7.6)", "amqp", "astroid (>=3) ; python_version >= \"3.9\"", "atlasclient (>=0.1.2)", "authlib (>=1.0.0)", "backports-zoneinfo (>=0.2.1) ; python_version < \"3.9\"", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black (>=23.12.0)", "blinker (>=1.1)", "blinker (>=1.7.0)", "cgroupspy (>=0.2.2)", "checksumdir (>=1.2.0) ; python_version >= \"3.9\"", "click (>=8.0)", "click (>=8.1.8) ; python_version >= \"3.9\"", "cloudpickle", "coverage (>=7.4.0)", "diagrams (>=0.23.4)", "docutils (>=0.21) ; python_version >= \"3.9\"", "duckdb (>=0.10.0) ; python_version >= \"3.12\"", "duckdb (>=0.9.0) ; python_version < \"3.12\"", "eralchemy2 (>=1.3.8)", "eventlet (>=0.33.3)", "flask-bcrypt (>=0.7.1)", "gevent (>=0.13)", "gitpython (>=3.1.40)", "graphviz (>=0.12)", "greenlet (>=0.4.9)", "hatch (>=1.9.1)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "incremental (>=22.10.0,!=24.7.0,!=24.7.1)", "ipdb (>=0.13.13)", "jmespath (>=0.7.0)", "ldap3 (>=2.5.1)", "mypy (==1.9.0)", "opentelemetry-exporter-prometheus", "pandas (>=1.2.5,<2.2)", "pipdeptree (>=2.13.1)", "plyvel (>=1.5.1) ; sys_platform != \"darwin\"", "pre-commit (>=3.5.0)", "pydantic (>=2.3.0)", "pygithub (>=2.1.1)", "pykerberos (>=1.1.13)", "pytest (>=8.2,<9)", "pytest-asyncio (>=0.23.6)", "pytest-cov (>=4.1.0)", "pytest-custom-exit-code (>=0.3.0)", "pytest-icdiff (>=0.9)", "pytest-instafail (>=0.5.0)", "pytest-mock (>=3.12.0)", "pytest-rerunfailures (>=13.0)", "pytest-timeouts (>=1.2.1)", "pytest-xdist (>=3.5.0)", "python-ldap", "python3-saml (>=1.16.0)", "requests (>=2.27.0,<3)", "requests-kerberos (>=0.10.0)", "requests-mock (>=1.11.0)", "restructuredtext-lint (>=1.4.0)", "rich-click (>=1.7.0)", "ruff (==0.5.5)", "s3fs (>=2023.10.0)", "semver (>=3.0.2)", "sentry-sdk (>=1.32.0,!=1.33.0)", "sphinx (>=7) ; python_version >= \"3.9\"", "sphinx-airflow-theme (>=0.1.0) ; python_version >= \"3.9\"", "sphinx-argparse (>=0.4.0) ; python_version >= \"3.9\"", "sphinx-autoapi (>=3) ; python_version >= \"3.9\"", "sphinx-copybutton (>=0.5.2) ; python_version >= \"3.9\"", "sphinx-design (>=0.5.0) ; python_version >= \"3.9\"", "sphinx-jinja (>=2.0.2) ; python_version >= \"3.9\"", "sphinx-rtd-theme (>=2.0.0) ; python_version >= \"3.9\"", "sphinxcontrib-applehelp (>=1.0.4) ; python_version >= \"3.9\"", "sphinxcontrib-devhelp (>=1.0.2) ; python_version >= \"3.9\"", "sphinxcontrib-htmlhelp (>=2.0.1) ; python_version >= \"3.9\"", "sphinxcontrib-httpdomain (>=1.8.1) ; python_version >= \"3.9\"", "sphinxcontrib-jquery (>=4.1) ; python_version >= \"3.9\"", "sphinxcontrib-jsmath (>=1.0.1) ; python_version >= \"3.9\"", "sphinxcontrib-qthelp (>=1.0.3) ; python_version >= \"3.9\"", "sphinxcontrib-redoc (>=1.6.0) ; python_version >= \"3.9\"", "sphinxcontrib-serializinghtml (>=1.1.5) ; python_version >= \"3.9\"", "sphinxcontrib-spelling (>=8.0.0) ; python_version >= \"3.9\"", "statsd (>=3.3.0)", "thrift-sasl (>=0.2.0)", "time-machine (>=2.13.0)", "towncrier (>=23.11.0)", "twine (>=4.0.2)", "types-aiofiles", "types-certifi", "types-croniter", "types-deprecated", "types-docutils", "types-markdown", "types-paramiko", "types-protobuf", "types-pymysql", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-pyyaml", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "uv (>=0.1.32)", "virtualenv", "wheel (>=0.42.0)", "yamllint (>=1.33.0)"] dingding = ["apache-airflow-providers-dingding"] discord = ["apache-airflow-providers-discord"] docker = ["apache-airflow-providers-docker"] @@ -411,7 +418,7 @@ jenkins = ["apache-airflow-providers-jenkins"] kerberos = ["pykerberos (>=1.1.13)", "requests-kerberos (>=0.10.0)", "thrift-sasl (>=0.2.0)"] kubernetes = ["apache-airflow[cncf-kubernetes]"] ldap = ["ldap3 (>=2.5.1)", "python-ldap"] -leveldb = ["plyvel (>=1.5.1)"] +leveldb = ["plyvel (>=1.5.1) ; sys_platform != \"darwin\""] microsoft-azure = ["apache-airflow-providers-microsoft-azure"] microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] microsoft-psrp = ["apache-airflow-providers-microsoft-psrp"] @@ -430,7 +437,7 @@ oracle = ["apache-airflow-providers-oracle"] otel = ["opentelemetry-exporter-prometheus"] pagerduty = ["apache-airflow-providers-pagerduty"] pandas = ["pandas (>=1.2.5,<2.2)"] -papermill = ["apache-airflow-providers-papermill"] +papermill = ["apache-airflow-providers-papermill ; python_version != \"3.12\""] password = ["bcrypt (>=2.0.0)", "flask-bcrypt (>=0.7.1)"] pgvector = ["apache-airflow-providers-pgvector"] pinecone = ["apache-airflow-providers-pinecone"] @@ -475,15 +482,14 @@ zendesk = ["apache-airflow-providers-zendesk"] [[package]] name = "apache-airflow-providers-amazon" -version = "9.2.0" +version = "9.4.0" description = "Provider package apache-airflow-providers-amazon for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_amazon-9.2.0-py3-none-any.whl", hash = "sha256:69880a782c79e6d91337bd7a74f7ab8e12fee68408c3ec8bd8ccc7def6a14aa7"}, - {file = "apache_airflow_providers_amazon-9.2.0.tar.gz", hash = "sha256:d525e7d703f9fa58dc10f39ca7f7c3e8c7a65759a0a59fe5979998464abf3a9e"}, + {file = "apache_airflow_providers_amazon-9.4.0-py3-none-any.whl", hash = "sha256:3940f065cb327e9d6340f0a265cbb955597b3def84f76cda560eaa09c76d4e54"}, + {file = "apache_airflow_providers_amazon-9.4.0.tar.gz", hash = "sha256:53a9fd570387290c4e97a99ce1cb4ca6565e36277a22e575ad015f66c79c656c"}, ] [package.dependencies] @@ -513,7 +519,7 @@ imap = ["apache-airflow-providers-imap"] microsoft-azure = ["apache-airflow-providers-microsoft-azure"] mongo = ["apache-airflow-providers-mongo"] openlineage = ["apache-airflow-providers-openlineage"] -pandas = ["pandas (>=1.5.3,<2.2)", "pandas (>=2.1.2,<2.2)"] +pandas = ["pandas (>=2.1.2,<2.2)"] python3-saml = ["python3-saml (>=1.16.0)"] s3fs = ["s3fs (>=2023.10.0)"] salesforce = ["apache-airflow-providers-salesforce"] @@ -521,15 +527,14 @@ ssh = ["apache-airflow-providers-ssh"] [[package]] name = "apache-airflow-providers-common-compat" -version = "1.3.0" +version = "1.5.0" description = "Provider package apache-airflow-providers-common-compat for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_common_compat-1.3.0-py3-none-any.whl", hash = "sha256:f4e125eba88078bda95cec5144debe519460276f33e214260a7e471bbe8d8c5d"}, - {file = "apache_airflow_providers_common_compat-1.3.0.tar.gz", hash = "sha256:fc63b30baa72c9aff810087898a957555e0f67281a7b2430f3a1d322a7abb9fb"}, + {file = "apache_airflow_providers_common_compat-1.5.0-py3-none-any.whl", hash = "sha256:cb9810147cf07ab9b306b3db04aeea320bfcc97452a94abebd636e6a081706a4"}, + {file = "apache_airflow_providers_common_compat-1.5.0.tar.gz", hash = "sha256:11994ab1ffb5d398c4b83a2ebb701419375037137ce56a7f271a026425beae3d"}, ] [package.dependencies] @@ -546,7 +551,6 @@ description = "Provider package apache-airflow-providers-common-io for Apache Ai optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "apache_airflow_providers_common_io-1.5.0-py3-none-any.whl", hash = "sha256:74accdef8c0c8b0a38f6f607b7c33c9dc2a5c5d1b6ff992b5dee605cf71e7c49"}, {file = "apache_airflow_providers_common_io-1.5.0.tar.gz", hash = "sha256:5eae7b705f600347d7f2e208696be76951db18e380f7534d0416932300b67e85"}, @@ -561,15 +565,14 @@ openlineage = ["apache-airflow-providers-openlineage"] [[package]] name = "apache-airflow-providers-common-sql" -version = "1.21.0" +version = "1.23.0" description = "Provider package apache-airflow-providers-common-sql for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_common_sql-1.21.0-py3-none-any.whl", hash = "sha256:87d26eab25fb09e0b04e14f563dfc3a365fc86e2452211e075229dcb8ce142d2"}, - {file = "apache_airflow_providers_common_sql-1.21.0.tar.gz", hash = "sha256:bcab9432a50c46b9a23d2203c2a9beb682f039c28da6b5882c70dc3ab80ac826"}, + {file = "apache_airflow_providers_common_sql-1.23.0-py3-none-any.whl", hash = "sha256:283381c7b43829aae18ab11cfde90edd8b3d4babb637b91b50d5de772d6184d6"}, + {file = "apache_airflow_providers_common_sql-1.23.0.tar.gz", hash = "sha256:9755ce812e4c032e3729fcff63ae845102132e69947c37c25a3896931362162d"}, ] [package.dependencies] @@ -579,45 +582,42 @@ sqlparse = ">=0.5.1" [package.extras] openlineage = ["apache-airflow-providers-openlineage"] -pandas = ["pandas (>=1.5.3,<2.2)", "pandas (>=2.1.2,<2.2)"] +pandas = ["pandas (>=2.1.2,<2.2)"] [[package]] name = "apache-airflow-providers-fab" -version = "1.5.2" +version = "1.5.3" description = "Provider package apache-airflow-providers-fab for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_fab-1.5.2-py3-none-any.whl", hash = "sha256:62180f0f2cab0060b4370bda43040fe1ebdeb656297de797b1bc846cfe7d63e3"}, - {file = "apache_airflow_providers_fab-1.5.2.tar.gz", hash = "sha256:22744241fd8f5dfd4575f02775afa00b3a965b04799b67fd0a42678f994ec3ba"}, + {file = "apache_airflow_providers_fab-1.5.3-py3-none-any.whl", hash = "sha256:0b1352e16266f40aa1037af316fd3abcc3852ca49b033acac9f9cad60e5f9764"}, + {file = "apache_airflow_providers_fab-1.5.3.tar.gz", hash = "sha256:bb4d879fb9bf9bca7c0f103e1dc9d1fa25efe02e2c4536f4d60c789786fb1f89"}, ] [package.dependencies] apache-airflow = ">=2.9.0" apache-airflow-providers-common-compat = ">=1.2.1" flask = ">=2.2,<2.3" -flask-appbuilder = "4.5.2" +flask-appbuilder = "4.5.3" flask-login = ">=0.6.2" google-re2 = ">=1.0" jmespath = ">=0.7.0" [package.extras] -common-compat = ["apache-airflow-providers-common-compat"] kerberos = ["kerberos (>=1.3.0)"] [[package]] name = "apache-airflow-providers-ftp" -version = "3.12.0" +version = "3.12.2" description = "Provider package apache-airflow-providers-ftp for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_ftp-3.12.0-py3-none-any.whl", hash = "sha256:46518cc3dfcd21545ca7a4f342b415296cdd8daa6036c174d45d734d4b53a802"}, - {file = "apache_airflow_providers_ftp-3.12.0.tar.gz", hash = "sha256:91430e2d1c0f323b361e2c6b08de649103ee10e6c8977dde3fd5cc42db84c505"}, + {file = "apache_airflow_providers_ftp-3.12.2-py3-none-any.whl", hash = "sha256:994713b2ce077aed781e0f08d130c606b00d50224a8614bb9d4d8d888e7ccfc3"}, + {file = "apache_airflow_providers_ftp-3.12.2.tar.gz", hash = "sha256:417bcf35bc8421d1c9bb33f51e81111a8981622f1a9b74be7e5ff8e7c69f1666"}, ] [package.dependencies] @@ -627,17 +627,117 @@ apache-airflow = ">=2.9.0" common-compat = ["apache-airflow-providers-common-compat"] openlineage = ["apache-airflow-providers-openlineage"] +[[package]] +name = "apache-airflow-providers-google" +version = "14.0.0" +description = "Provider package apache-airflow-providers-google for Apache Airflow" +optional = false +python-versions = "~=3.9" +groups = ["main", "dev"] +files = [ + {file = "apache_airflow_providers_google-14.0.0-py3-none-any.whl", hash = "sha256:39a8f4b157a1770091df4573cdce3cca92c908604b02461db4fd22aa18b94009"}, + {file = "apache_airflow_providers_google-14.0.0.tar.gz", hash = "sha256:125d57be235b8ac39336ba70a649f37d7f2eae5f13abefe5bb45df5049eb7b8b"}, +] + +[package.dependencies] +apache-airflow = ">=2.9.0" +apache-airflow-providers-common-compat = ">=1.4.0" +apache-airflow-providers-common-sql = ">=1.20.0" +asgiref = ">=3.5.2" +dill = ">=0.2.3" +gcloud-aio-auth = ">=5.2.0" +gcloud-aio-bigquery = ">=6.1.2" +gcloud-aio-storage = ">=9.0.0" +gcsfs = ">=2023.10.0" +google-ads = ">=25.1.0" +google-analytics-admin = ">=0.9.0" +google-api-core = ">=2.11.0,<2.16.0 || >2.16.0,<2.18.0 || >2.18.0" +google-api-python-client = ">=2.0.2" +google-auth = ">=2.29.0" +google-auth-httplib2 = ">=0.0.1" +google-cloud-aiplatform = {version = ">=1.73.0", extras = ["evaluation"]} +google-cloud-alloydb = ">=0.4.0" +google-cloud-automl = ">=2.12.0" +google-cloud-batch = ">=0.13.0" +google-cloud-bigquery = ">=3.4.0,<3.21.dev0 || >3.22.0,<3.23.dev0 || >=3.24.dev0" +google-cloud-bigquery-datatransfer = ">=3.13.0" +google-cloud-bigtable = ">=2.17.0" +google-cloud-build = ">=3.31.0" +google-cloud-compute = ">=1.10.0" +google-cloud-container = ">=2.17.4" +google-cloud-datacatalog = ">=3.23.0" +google-cloud-dataflow-client = ">=0.8.6" +google-cloud-dataform = ">=0.5.0" +google-cloud-dataplex = ">=2.6.0" +google-cloud-dataproc = ">=5.12.0" +google-cloud-dataproc-metastore = ">=1.12.0" +google-cloud-dlp = ">=3.12.0" +google-cloud-kms = ">=2.15.0" +google-cloud-language = ">=2.9.0" +google-cloud-logging = ">=3.5.0" +google-cloud-managedkafka = ">=0.1.6" +google-cloud-memcache = ">=1.7.0" +google-cloud-monitoring = ">=2.18.0" +google-cloud-orchestration-airflow = ">=1.10.0" +google-cloud-os-login = ">=2.9.1" +google-cloud-pubsub = ">=2.19.0" +google-cloud-redis = ">=2.12.0" +google-cloud-run = ">=0.10.0" +google-cloud-secret-manager = ">=2.16.0" +google-cloud-spanner = ">=3.11.1,<3.49.0 || >3.49.0" +google-cloud-speech = ">=2.18.0" +google-cloud-storage = ">=2.7.0" +google-cloud-storage-transfer = ">=1.4.1" +google-cloud-tasks = ">=2.13.0" +google-cloud-texttospeech = ">=2.14.1" +google-cloud-translate = ">=3.16.0" +google-cloud-videointelligence = ">=2.11.0" +google-cloud-vision = ">=3.4.0" +google-cloud-workflows = ">=1.10.0" +grpcio-gcp = ">=0.2.2" +httpx = ">=0.25.0" +immutabledict = ">=4.2.0" +json-merge-patch = ">=0.2" +looker-sdk = ">=22.4.0,<24.18.0 || >24.18.0" +pandas = ">=2.1.2,<2.2" +pandas-gbq = ">=0.7.0" +proto-plus = ">=1.19.6" +pyarrow = ">=14.0.1" +PyOpenSSL = ">=23.0.0" +python-slugify = ">=7.0.0" +sqlalchemy-bigquery = ">=1.2.1" +sqlalchemy-spanner = ">=1.6.2" +tenacity = ">=8.1.0" + +[package.extras] +amazon = ["apache-airflow-providers-amazon (>=2.6.0)"] +apache-beam = ["apache-beam[gcp] (>=2.53.0) ; python_version < \"3.12\"", "apache-beam[gcp] (>=2.57.0) ; python_version >= \"3.12\""] +apache-cassandra = ["apache-airflow-providers-apache-cassandra"] +cncf-kubernetes = ["apache-airflow-providers-cncf-kubernetes (>=10.1.0)"] +facebook = ["apache-airflow-providers-facebook (>=2.2.0)"] +leveldb = ["plyvel (>=1.5.1)"] +microsoft-azure = ["apache-airflow-providers-microsoft-azure"] +microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] +mysql = ["apache-airflow-providers-mysql"] +openlineage = ["apache-airflow-providers-openlineage"] +oracle = ["apache-airflow-providers-oracle (>=3.1.0)"] +postgres = ["apache-airflow-providers-postgres"] +presto = ["apache-airflow-providers-presto"] +salesforce = ["apache-airflow-providers-salesforce"] +sftp = ["apache-airflow-providers-sftp"] +ssh = ["apache-airflow-providers-ssh"] +trino = ["apache-airflow-providers-trino"] + [[package]] name = "apache-airflow-providers-http" -version = "5.0.0" +version = "5.2.0" description = "Provider package apache-airflow-providers-http for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_http-5.0.0-py3-none-any.whl", hash = "sha256:27e8902afad082bc05d05ec625b7f3c24ef3467a95813f3471b1c6eaea991ef8"}, - {file = "apache_airflow_providers_http-5.0.0.tar.gz", hash = "sha256:3869cb1dcdcd9a13a4416e91e2fc2bccbec27598115ad9ef1dc4596831ffbf17"}, + {file = "apache_airflow_providers_http-5.2.0-py3-none-any.whl", hash = "sha256:4f689fb9ffba87766f090f1f2d12efa18fbf28a588fe1c7d7bf7f936068ef5e6"}, + {file = "apache_airflow_providers_http-5.2.0.tar.gz", hash = "sha256:a6e82b6fef533c24987a42816ff899898448e7db9e23d8df025134561556bc28"}, ] [package.dependencies] @@ -649,15 +749,14 @@ requests-toolbelt = ">=0.4.0" [[package]] name = "apache-airflow-providers-imap" -version = "3.8.0" +version = "3.8.2" description = "Provider package apache-airflow-providers-imap for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_imap-3.8.0-py3-none-any.whl", hash = "sha256:559104033a5d7500ac988ef2a876917afa79ccabacfa0169e5698ad04026036b"}, - {file = "apache_airflow_providers_imap-3.8.0.tar.gz", hash = "sha256:29e024ab590dfd33049ef3bd62357b742e0adbd4fd16426e595ea7ec5e62f776"}, + {file = "apache_airflow_providers_imap-3.8.2-py3-none-any.whl", hash = "sha256:cf7b75ffeaa6f6e33dd0e57d05daa3b7b8c7d54e91f57fc71b0a981e35d22cda"}, + {file = "apache_airflow_providers_imap-3.8.2.tar.gz", hash = "sha256:65e357ba65c20676f13d5a672d40d69d2b88915041ea4658c3aa711e45742705"}, ] [package.dependencies] @@ -665,15 +764,14 @@ apache-airflow = ">=2.9.0" [[package]] name = "apache-airflow-providers-smtp" -version = "1.9.0" +version = "2.0.0" description = "Provider package apache-airflow-providers-smtp for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "apache_airflow_providers_smtp-1.9.0-py3-none-any.whl", hash = "sha256:73f0d2bd0ab945fee7c7b7d0c21a8e60c744e5a0dd2d216a4b3b31045b98bf57"}, - {file = "apache_airflow_providers_smtp-1.9.0.tar.gz", hash = "sha256:012ca6abe1b8e241a90b3e627d4b4fdfc9c467f84c0b849ba97e9b22f0a135af"}, + {file = "apache_airflow_providers_smtp-2.0.0-py3-none-any.whl", hash = "sha256:efa11f9ab71d06159be0620487a01f6eb7e0bbc64a93573aba294649fcc56521"}, + {file = "apache_airflow_providers_smtp-2.0.0.tar.gz", hash = "sha256:a721e4fb3637d27bb2861a3dfed51b3461dc761d9c9699eed6ab22d536254320"}, ] [package.dependencies] @@ -686,7 +784,6 @@ description = "Provider package apache-airflow-providers-sqlite for Apache Airfl optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "apache_airflow_providers_sqlite-4.0.0-py3-none-any.whl", hash = "sha256:e83e642372292dcf79fecbab986fc4778728eef1a9854ebe6702e25c8096fc6f"}, {file = "apache_airflow_providers_sqlite-4.0.0.tar.gz", hash = "sha256:b667c94b9f4e71fb7d1392bec9018fcc8fef8a8741edb0f248221a9e56e7b1e5"}, @@ -704,7 +801,6 @@ description = "Provider package apache-airflow-providers-ssh for Apache Airflow" optional = false python-versions = "~=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "apache_airflow_providers_ssh-4.0.0-py3-none-any.whl", hash = "sha256:b27be35bd63b71fc93db26e2625569453f50476f29fa799d404ca4a4e2962cc0"}, {file = "apache_airflow_providers_ssh-4.0.0.tar.gz", hash = "sha256:0719783920590e51cbf756aac08100778881fa9f80d77e1ad16eab4e157d88e3"}, @@ -722,7 +818,6 @@ description = "A pluggable API specification generator. Currently supports the O optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "apispec-6.8.1-py3-none-any.whl", hash = "sha256:eacba00df745efc9adb2a45cf992300e87938582077e101fb26b78ecf4320beb"}, {file = "apispec-6.8.1.tar.gz", hash = "sha256:f4916cbb7be156963b18f5929a0e42bd2349135834b680a81b12432bcfaa9a39"}, @@ -746,7 +841,6 @@ description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -762,7 +856,6 @@ description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, @@ -780,8 +873,7 @@ version = "1.5.1" description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" optional = false python-versions = "*" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, @@ -794,7 +886,7 @@ description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version < \"3.11\"" +markers = "python_version <= \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -806,20 +898,19 @@ version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "babel" @@ -827,15 +918,26 @@ version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main", "dev"] +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] [[package]] name = "backports-tarfile" @@ -843,8 +945,8 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\"" +groups = ["main"] +markers = "python_version < \"3.12\" and (extra == \"adapters\" or extra == \"snowflake\")" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -856,38 +958,63 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "bcrypt" -version = "4.2.1" +version = "4.3.0" description = "Modern password hashing for your software and your servers" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "bcrypt-4.2.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:1340411a0894b7d3ef562fb233e4b6ed58add185228650942bdc885362f32c17"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ee315739bc8387aa36ff127afc99120ee452924e0df517a8f3e4c0187a0f5f"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dbd0747208912b1e4ce730c6725cb56c07ac734b3629b60d4398f082ea718ad"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:aaa2e285be097050dba798d537b6efd9b698aa88eef52ec98d23dcd6d7cf6fea"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:76d3e352b32f4eeb34703370e370997065d28a561e4a18afe4fef07249cb4396"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b7703ede632dc945ed1172d6f24e9f30f27b1b1a067f32f68bf169c5f08d0425"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89df2aea2c43be1e1fa066df5f86c8ce822ab70a30e4c210968669565c0f4685"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:04e56e3fe8308a88b77e0afd20bec516f74aecf391cdd6e374f15cbed32783d6"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cfdf3d7530c790432046c40cda41dfee8c83e29482e6a604f8930b9930e94139"}, - {file = "bcrypt-4.2.1-cp37-abi3-win32.whl", hash = "sha256:adadd36274510a01f33e6dc08f5824b97c9580583bd4487c564fc4617b328005"}, - {file = "bcrypt-4.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:8c458cd103e6c5d1d85cf600e546a639f234964d0228909d8f8dbeebff82d526"}, - {file = "bcrypt-4.2.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8ad2f4528cbf0febe80e5a3a57d7a74e6635e41af1ea5675282a33d769fba413"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909faa1027900f2252a9ca5dfebd25fc0ef1417943824783d1c8418dd7d6df4a"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde78d385d5e93ece5479a0a87f73cd6fa26b171c786a884f955e165032b262c"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:533e7f3bcf2f07caee7ad98124fab7499cb3333ba2274f7a36cf1daee7409d99"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:687cf30e6681eeda39548a93ce9bfbb300e48b4d445a43db4298d2474d2a1e54"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:041fa0155c9004eb98a232d54da05c0b41d4b8e66b6fc3cb71b4b3f6144ba837"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f85b1ffa09240c89aa2e1ae9f3b1c687104f7b2b9d2098da4e923f1b7082d331"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c6f5fa3775966cca251848d4d5393ab016b3afed251163c1436fefdec3b02c84"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:807261df60a8b1ccd13e6599c779014a362ae4e795f5c59747f60208daddd96d"}, - {file = "bcrypt-4.2.1-cp39-abi3-win32.whl", hash = "sha256:b588af02b89d9fad33e5f98f7838bf590d6d692df7153647724a7f20c186f6bf"}, - {file = "bcrypt-4.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:e84e0e6f8e40a242b11bce56c313edc2be121cec3e0ec2d76fce01f6af33c07c"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76132c176a6d9953cdc83c296aeaed65e1a708485fd55abf163e0d9f8f16ce0e"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e158009a54c4c8bc91d5e0da80920d048f918c61a581f0a63e4e93bb556d362f"}, - {file = "bcrypt-4.2.1.tar.gz", hash = "sha256:6765386e3ab87f569b276988742039baab087b2cdb01e809d74e74503c2faafe"}, +files = [ + {file = "bcrypt-4.3.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f01e060f14b6b57bbb72fc5b4a83ac21c443c9a2ee708e04a10e9192f90a6281"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5eeac541cefd0bb887a371ef73c62c3cd78535e4887b310626036a7c0a817bb"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59e1aa0e2cd871b08ca146ed08445038f42ff75968c7ae50d2fdd7860ade2180"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:0042b2e342e9ae3d2ed22727c1262f76cc4f345683b5c1715f0250cf4277294f"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74a8d21a09f5e025a9a23e7c0fd2c7fe8e7503e4d356c0a2c1486ba010619f09"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:0142b2cb84a009f8452c8c5a33ace5e3dfec4159e7735f5afe9a4d50a8ea722d"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:12fa6ce40cde3f0b899729dbd7d5e8811cb892d31b6f7d0334a1f37748b789fd"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:5bd3cca1f2aa5dbcf39e2aa13dd094ea181f48959e1071265de49cc2b82525af"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:335a420cfd63fc5bc27308e929bee231c15c85cc4c496610ffb17923abf7f231"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:0e30e5e67aed0187a1764911af023043b4542e70a7461ad20e837e94d23e1d6c"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b8d62290ebefd49ee0b3ce7500f5dbdcf13b81402c05f6dafab9a1e1b27212f"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef6630e0ec01376f59a006dc72918b1bf436c3b571b80fa1968d775fa02fe7d"}, + {file = "bcrypt-4.3.0-cp313-cp313t-win32.whl", hash = "sha256:7a4be4cbf241afee43f1c3969b9103a41b40bcb3a3f467ab19f891d9bc4642e4"}, + {file = "bcrypt-4.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c1949bf259a388863ced887c7861da1df681cb2388645766c89fdfd9004c669"}, + {file = "bcrypt-4.3.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:f81b0ed2639568bf14749112298f9e4e2b28853dab50a8b357e31798686a036d"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:864f8f19adbe13b7de11ba15d85d4a428c7e2f344bac110f667676a0ff84924b"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e36506d001e93bffe59754397572f21bb5dc7c83f54454c990c74a468cd589e"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:842d08d75d9fe9fb94b18b071090220697f9f184d4547179b60734846461ed59"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7c03296b85cb87db865d91da79bf63d5609284fc0cab9472fdd8367bbd830753"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:62f26585e8b219cdc909b6a0069efc5e4267e25d4a3770a364ac58024f62a761"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:beeefe437218a65322fbd0069eb437e7c98137e08f22c4660ac2dc795c31f8bb"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:97eea7408db3a5bcce4a55d13245ab3fa566e23b4c67cd227062bb49e26c585d"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:191354ebfe305e84f344c5964c7cd5f924a3bfc5d405c75ad07f232b6dffb49f"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:41261d64150858eeb5ff43c753c4b216991e0ae16614a308a15d909503617732"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:33752b1ba962ee793fa2b6321404bf20011fe45b9afd2a842139de3011898fef"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:50e6e80a4bfd23a25f5c05b90167c19030cf9f87930f7cb2eacb99f45d1c3304"}, + {file = "bcrypt-4.3.0-cp38-abi3-win32.whl", hash = "sha256:67a561c4d9fb9465ec866177e7aebcad08fe23aaf6fbd692a6fab69088abfc51"}, + {file = "bcrypt-4.3.0-cp38-abi3-win_amd64.whl", hash = "sha256:584027857bc2843772114717a7490a37f68da563b3620f78a849bcb54dc11e62"}, + {file = "bcrypt-4.3.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3efb1157edebfd9128e4e46e2ac1a64e0c1fe46fb023158a407c7892b0f8c3"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08bacc884fd302b611226c01014eca277d48f0a05187666bca23aac0dad6fe24"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6746e6fec103fcd509b96bacdfdaa2fbde9a553245dbada284435173a6f1aef"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:afe327968aaf13fc143a56a3360cb27d4ad0345e34da12c7290f1b00b8fe9a8b"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d9af79d322e735b1fc33404b5765108ae0ff232d4b54666d46730f8ac1a43676"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f1e3ffa1365e8702dc48c8b360fef8d7afeca482809c5e45e653af82ccd088c1"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3004df1b323d10021fda07a813fd33e0fd57bef0e9a480bb143877f6cba996fe"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:531457e5c839d8caea9b589a1bcfe3756b0547d7814e9ce3d437f17da75c32b0"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:17a854d9a7a476a89dcef6c8bd119ad23e0f82557afbd2c442777a16408e614f"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6fb1fd3ab08c0cbc6826a2e0447610c6f09e983a281b919ed721ad32236b8b23"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e965a9c1e9a393b8005031ff52583cedc15b7884fce7deb8b0346388837d6cfe"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:79e70b8342a33b52b55d93b3a59223a844962bef479f6a0ea318ebbcadf71505"}, + {file = "bcrypt-4.3.0-cp39-abi3-win32.whl", hash = "sha256:b4d4e57f0a63fd0b358eb765063ff661328f69a04494427265950c71b992a39a"}, + {file = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c950d682f0952bafcceaf709761da0a32a942272fad381081b51096ffa46cea1"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:107d53b5c67e0bbc3f03ebf5b030e0403d24dda980f8e244795335ba7b4a027d"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b693dbb82b3c27a1604a3dff5bfc5418a7e6a781bb795288141e5f80cf3a3492"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:b6354d3760fcd31994a14c89659dee887f1351a06e5dac3c1142307172a79f90"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a839320bf27d474e52ef8cb16449bb2ce0ba03ca9f44daba6d93fa1d8828e48a"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bdc6a24e754a555d7316fa4774e64c6c3997d27ed2d1964d55920c7c227bc4ce"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:55a935b8e9a1d2def0626c4269db3fcd26728cbff1e84f0341465c31c4ee56d8"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57967b7a28d855313a963aaea51bf6df89f833db4320da458e5b3c5ab6d4c938"}, + {file = "bcrypt-4.3.0.tar.gz", hash = "sha256:3a3fd2204178b6d2adcf09cb4f6426ffef54762577a7c9b54c159008cb288c18"}, ] [package.extras] @@ -900,8 +1027,7 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -925,7 +1051,6 @@ description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, @@ -973,7 +1098,6 @@ description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, @@ -981,19 +1105,18 @@ files = [ [[package]] name = "boto3" -version = "1.36.14" +version = "1.37.5" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "boto3-1.36.14-py3-none-any.whl", hash = "sha256:e2dab15944c3f517c88850d60b07f2f6fd3bc69aa51c47670e4f45d62a8c41fd"}, - {file = "boto3-1.36.14.tar.gz", hash = "sha256:4b0b8dd593b95f32a5a761dee65094423fbd06a4ad09f26b2e6c80493139569f"}, + {file = "boto3-1.37.5-py3-none-any.whl", hash = "sha256:12166353519aca0cc8d9dcfbbb0d38f8915955a5912b8cb241b2b2314f0dbc14"}, + {file = "boto3-1.37.5.tar.gz", hash = "sha256:ae6e7048beeaa4478368e554a4b290e3928beb0ae8d8767d108d72381a81af30"}, ] [package.dependencies] -botocore = ">=1.36.14,<1.37.0" +botocore = ">=1.37.5,<1.38.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -1002,443 +1125,440 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.14" -description = "Type annotations for boto3 1.36.14 generated with mypy-boto3-builder 8.9.0" +version = "1.37.5" +description = "Type annotations for boto3 1.37.5 generated with mypy-boto3-builder 8.10.0" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "boto3_stubs-1.36.14-py3-none-any.whl", hash = "sha256:dcde60b21a4026719b82b7f4679ecd9af9372b3d0c9a7f45f1cf2c496bcf19b4"}, - {file = "boto3_stubs-1.36.14.tar.gz", hash = "sha256:9eccdee8091b095a8ce5119b825dccba73555d88a813636b95c3ea2e57186e4f"}, + {file = "boto3_stubs-1.37.5-py3-none-any.whl", hash = "sha256:c36571bb582d3ace0009a8aefde087e2378c991accb2b343015a2023a129850a"}, + {file = "boto3_stubs-1.37.5.tar.gz", hash = "sha256:11d3a8bdce0e305951141762e2f861eedb53af7e3b04df10af44c9ced1961883"}, ] [package.dependencies] botocore-stubs = "*" -mypy-boto3-s3 = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"s3\""} +mypy-boto3-s3 = {version = ">=1.37.0,<1.38.0", optional = true, markers = "extra == \"s3\""} types-s3transfer = "*" typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [package.extras] -accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)"] -account = ["mypy-boto3-account (>=1.36.0,<1.37.0)"] -acm = ["mypy-boto3-acm (>=1.36.0,<1.37.0)"] -acm-pca = ["mypy-boto3-acm-pca (>=1.36.0,<1.37.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)", "mypy-boto3-account (>=1.36.0,<1.37.0)", "mypy-boto3-acm (>=1.36.0,<1.37.0)", "mypy-boto3-acm-pca (>=1.36.0,<1.37.0)", "mypy-boto3-amp (>=1.36.0,<1.37.0)", "mypy-boto3-amplify (>=1.36.0,<1.37.0)", "mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)", "mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)", "mypy-boto3-apigateway (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)", "mypy-boto3-appconfig (>=1.36.0,<1.37.0)", "mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)", "mypy-boto3-appfabric (>=1.36.0,<1.37.0)", "mypy-boto3-appflow (>=1.36.0,<1.37.0)", "mypy-boto3-appintegrations (>=1.36.0,<1.37.0)", "mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-application-insights (>=1.36.0,<1.37.0)", "mypy-boto3-application-signals (>=1.36.0,<1.37.0)", "mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-appmesh (>=1.36.0,<1.37.0)", "mypy-boto3-apprunner (>=1.36.0,<1.37.0)", "mypy-boto3-appstream (>=1.36.0,<1.37.0)", "mypy-boto3-appsync (>=1.36.0,<1.37.0)", "mypy-boto3-apptest (>=1.36.0,<1.37.0)", "mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)", "mypy-boto3-artifact (>=1.36.0,<1.37.0)", "mypy-boto3-athena (>=1.36.0,<1.37.0)", "mypy-boto3-auditmanager (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)", "mypy-boto3-b2bi (>=1.36.0,<1.37.0)", "mypy-boto3-backup (>=1.36.0,<1.37.0)", "mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)", "mypy-boto3-backupsearch (>=1.36.0,<1.37.0)", "mypy-boto3-batch (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-billing (>=1.36.0,<1.37.0)", "mypy-boto3-billingconductor (>=1.36.0,<1.37.0)", "mypy-boto3-braket (>=1.36.0,<1.37.0)", "mypy-boto3-budgets (>=1.36.0,<1.37.0)", "mypy-boto3-ce (>=1.36.0,<1.37.0)", "mypy-boto3-chatbot (>=1.36.0,<1.37.0)", "mypy-boto3-chime (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)", "mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)", "mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)", "mypy-boto3-cloud9 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)", "mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)", "mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)", "mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)", "mypy-boto3-codeartifact (>=1.36.0,<1.37.0)", "mypy-boto3-codebuild (>=1.36.0,<1.37.0)", "mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)", "mypy-boto3-codecommit (>=1.36.0,<1.37.0)", "mypy-boto3-codeconnections (>=1.36.0,<1.37.0)", "mypy-boto3-codedeploy (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)", "mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-codepipeline (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)", "mypy-boto3-comprehend (>=1.36.0,<1.37.0)", "mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)", "mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)", "mypy-boto3-config (>=1.36.0,<1.37.0)", "mypy-boto3-connect (>=1.36.0,<1.37.0)", "mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-connectcases (>=1.36.0,<1.37.0)", "mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)", "mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)", "mypy-boto3-controltower (>=1.36.0,<1.37.0)", "mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)", "mypy-boto3-cur (>=1.36.0,<1.37.0)", "mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)", "mypy-boto3-databrew (>=1.36.0,<1.37.0)", "mypy-boto3-dataexchange (>=1.36.0,<1.37.0)", "mypy-boto3-datapipeline (>=1.36.0,<1.37.0)", "mypy-boto3-datasync (>=1.36.0,<1.37.0)", "mypy-boto3-datazone (>=1.36.0,<1.37.0)", "mypy-boto3-dax (>=1.36.0,<1.37.0)", "mypy-boto3-deadline (>=1.36.0,<1.37.0)", "mypy-boto3-detective (>=1.36.0,<1.37.0)", "mypy-boto3-devicefarm (>=1.36.0,<1.37.0)", "mypy-boto3-devops-guru (>=1.36.0,<1.37.0)", "mypy-boto3-directconnect (>=1.36.0,<1.37.0)", "mypy-boto3-discovery (>=1.36.0,<1.37.0)", "mypy-boto3-dlm (>=1.36.0,<1.37.0)", "mypy-boto3-dms (>=1.36.0,<1.37.0)", "mypy-boto3-docdb (>=1.36.0,<1.37.0)", "mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)", "mypy-boto3-drs (>=1.36.0,<1.37.0)", "mypy-boto3-ds (>=1.36.0,<1.37.0)", "mypy-boto3-ds-data (>=1.36.0,<1.37.0)", "mypy-boto3-dsql (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)", "mypy-boto3-ebs (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)", "mypy-boto3-ecr (>=1.36.0,<1.37.0)", "mypy-boto3-ecr-public (>=1.36.0,<1.37.0)", "mypy-boto3-ecs (>=1.36.0,<1.37.0)", "mypy-boto3-efs (>=1.36.0,<1.37.0)", "mypy-boto3-eks (>=1.36.0,<1.37.0)", "mypy-boto3-eks-auth (>=1.36.0,<1.37.0)", "mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)", "mypy-boto3-elasticache (>=1.36.0,<1.37.0)", "mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)", "mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)", "mypy-boto3-elb (>=1.36.0,<1.37.0)", "mypy-boto3-elbv2 (>=1.36.0,<1.37.0)", "mypy-boto3-emr (>=1.36.0,<1.37.0)", "mypy-boto3-emr-containers (>=1.36.0,<1.37.0)", "mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-entityresolution (>=1.36.0,<1.37.0)", "mypy-boto3-es (>=1.36.0,<1.37.0)", "mypy-boto3-events (>=1.36.0,<1.37.0)", "mypy-boto3-evidently (>=1.36.0,<1.37.0)", "mypy-boto3-finspace (>=1.36.0,<1.37.0)", "mypy-boto3-finspace-data (>=1.36.0,<1.37.0)", "mypy-boto3-firehose (>=1.36.0,<1.37.0)", "mypy-boto3-fis (>=1.36.0,<1.37.0)", "mypy-boto3-fms (>=1.36.0,<1.37.0)", "mypy-boto3-forecast (>=1.36.0,<1.37.0)", "mypy-boto3-forecastquery (>=1.36.0,<1.37.0)", "mypy-boto3-frauddetector (>=1.36.0,<1.37.0)", "mypy-boto3-freetier (>=1.36.0,<1.37.0)", "mypy-boto3-fsx (>=1.36.0,<1.37.0)", "mypy-boto3-gamelift (>=1.36.0,<1.37.0)", "mypy-boto3-geo-maps (>=1.36.0,<1.37.0)", "mypy-boto3-geo-places (>=1.36.0,<1.37.0)", "mypy-boto3-geo-routes (>=1.36.0,<1.37.0)", "mypy-boto3-glacier (>=1.36.0,<1.37.0)", "mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)", "mypy-boto3-glue (>=1.36.0,<1.37.0)", "mypy-boto3-grafana (>=1.36.0,<1.37.0)", "mypy-boto3-greengrass (>=1.36.0,<1.37.0)", "mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)", "mypy-boto3-groundstation (>=1.36.0,<1.37.0)", "mypy-boto3-guardduty (>=1.36.0,<1.37.0)", "mypy-boto3-health (>=1.36.0,<1.37.0)", "mypy-boto3-healthlake (>=1.36.0,<1.37.0)", "mypy-boto3-iam (>=1.36.0,<1.37.0)", "mypy-boto3-identitystore (>=1.36.0,<1.37.0)", "mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)", "mypy-boto3-importexport (>=1.36.0,<1.37.0)", "mypy-boto3-inspector (>=1.36.0,<1.37.0)", "mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)", "mypy-boto3-inspector2 (>=1.36.0,<1.37.0)", "mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-invoicing (>=1.36.0,<1.37.0)", "mypy-boto3-iot (>=1.36.0,<1.37.0)", "mypy-boto3-iot-data (>=1.36.0,<1.37.0)", "mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)", "mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)", "mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)", "mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)", "mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)", "mypy-boto3-iotwireless (>=1.36.0,<1.37.0)", "mypy-boto3-ivs (>=1.36.0,<1.37.0)", "mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)", "mypy-boto3-ivschat (>=1.36.0,<1.37.0)", "mypy-boto3-kafka (>=1.36.0,<1.37.0)", "mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-kendra (>=1.36.0,<1.37.0)", "mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)", "mypy-boto3-keyspaces (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)", "mypy-boto3-kms (>=1.36.0,<1.37.0)", "mypy-boto3-lakeformation (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)", "mypy-boto3-lex-models (>=1.36.0,<1.37.0)", "mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-lightsail (>=1.36.0,<1.37.0)", "mypy-boto3-location (>=1.36.0,<1.37.0)", "mypy-boto3-logs (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)", "mypy-boto3-m2 (>=1.36.0,<1.37.0)", "mypy-boto3-machinelearning (>=1.36.0,<1.37.0)", "mypy-boto3-macie2 (>=1.36.0,<1.37.0)", "mypy-boto3-mailmanager (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)", "mypy-boto3-medialive (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)", "mypy-boto3-mediatailor (>=1.36.0,<1.37.0)", "mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)", "mypy-boto3-memorydb (>=1.36.0,<1.37.0)", "mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)", "mypy-boto3-mgh (>=1.36.0,<1.37.0)", "mypy-boto3-mgn (>=1.36.0,<1.37.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)", "mypy-boto3-mq (>=1.36.0,<1.37.0)", "mypy-boto3-mturk (>=1.36.0,<1.37.0)", "mypy-boto3-mwaa (>=1.36.0,<1.37.0)", "mypy-boto3-neptune (>=1.36.0,<1.37.0)", "mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)", "mypy-boto3-neptunedata (>=1.36.0,<1.37.0)", "mypy-boto3-network-firewall (>=1.36.0,<1.37.0)", "mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-networkmanager (>=1.36.0,<1.37.0)", "mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)", "mypy-boto3-oam (>=1.36.0,<1.37.0)", "mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)", "mypy-boto3-omics (>=1.36.0,<1.37.0)", "mypy-boto3-opensearch (>=1.36.0,<1.37.0)", "mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)", "mypy-boto3-opsworks (>=1.36.0,<1.37.0)", "mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)", "mypy-boto3-organizations (>=1.36.0,<1.37.0)", "mypy-boto3-osis (>=1.36.0,<1.37.0)", "mypy-boto3-outposts (>=1.36.0,<1.37.0)", "mypy-boto3-panorama (>=1.36.0,<1.37.0)", "mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)", "mypy-boto3-pcs (>=1.36.0,<1.37.0)", "mypy-boto3-personalize (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-events (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-pi (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)", "mypy-boto3-pipes (>=1.36.0,<1.37.0)", "mypy-boto3-polly (>=1.36.0,<1.37.0)", "mypy-boto3-pricing (>=1.36.0,<1.37.0)", "mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)", "mypy-boto3-proton (>=1.36.0,<1.37.0)", "mypy-boto3-qapps (>=1.36.0,<1.37.0)", "mypy-boto3-qbusiness (>=1.36.0,<1.37.0)", "mypy-boto3-qconnect (>=1.36.0,<1.37.0)", "mypy-boto3-qldb (>=1.36.0,<1.37.0)", "mypy-boto3-qldb-session (>=1.36.0,<1.37.0)", "mypy-boto3-quicksight (>=1.36.0,<1.37.0)", "mypy-boto3-ram (>=1.36.0,<1.37.0)", "mypy-boto3-rbin (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-rds-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-rekognition (>=1.36.0,<1.37.0)", "mypy-boto3-repostspace (>=1.36.0,<1.37.0)", "mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)", "mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)", "mypy-boto3-resource-groups (>=1.36.0,<1.37.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)", "mypy-boto3-robomaker (>=1.36.0,<1.37.0)", "mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)", "mypy-boto3-route53 (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)", "mypy-boto3-route53domains (>=1.36.0,<1.37.0)", "mypy-boto3-route53profiles (>=1.36.0,<1.37.0)", "mypy-boto3-route53resolver (>=1.36.0,<1.37.0)", "mypy-boto3-rum (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-s3control (>=1.36.0,<1.37.0)", "mypy-boto3-s3outposts (>=1.36.0,<1.37.0)", "mypy-boto3-s3tables (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-savingsplans (>=1.36.0,<1.37.0)", "mypy-boto3-scheduler (>=1.36.0,<1.37.0)", "mypy-boto3-schemas (>=1.36.0,<1.37.0)", "mypy-boto3-sdb (>=1.36.0,<1.37.0)", "mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)", "mypy-boto3-security-ir (>=1.36.0,<1.37.0)", "mypy-boto3-securityhub (>=1.36.0,<1.37.0)", "mypy-boto3-securitylake (>=1.36.0,<1.37.0)", "mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)", "mypy-boto3-service-quotas (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)", "mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)", "mypy-boto3-ses (>=1.36.0,<1.37.0)", "mypy-boto3-sesv2 (>=1.36.0,<1.37.0)", "mypy-boto3-shield (>=1.36.0,<1.37.0)", "mypy-boto3-signer (>=1.36.0,<1.37.0)", "mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)", "mypy-boto3-sms (>=1.36.0,<1.37.0)", "mypy-boto3-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)", "mypy-boto3-snowball (>=1.36.0,<1.37.0)", "mypy-boto3-sns (>=1.36.0,<1.37.0)", "mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)", "mypy-boto3-ssm (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)", "mypy-boto3-sso (>=1.36.0,<1.37.0)", "mypy-boto3-sso-admin (>=1.36.0,<1.37.0)", "mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)", "mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)", "mypy-boto3-storagegateway (>=1.36.0,<1.37.0)", "mypy-boto3-sts (>=1.36.0,<1.37.0)", "mypy-boto3-supplychain (>=1.36.0,<1.37.0)", "mypy-boto3-support (>=1.36.0,<1.37.0)", "mypy-boto3-support-app (>=1.36.0,<1.37.0)", "mypy-boto3-swf (>=1.36.0,<1.37.0)", "mypy-boto3-synthetics (>=1.36.0,<1.37.0)", "mypy-boto3-taxsettings (>=1.36.0,<1.37.0)", "mypy-boto3-textract (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-query (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-write (>=1.36.0,<1.37.0)", "mypy-boto3-tnb (>=1.36.0,<1.37.0)", "mypy-boto3-transcribe (>=1.36.0,<1.37.0)", "mypy-boto3-transfer (>=1.36.0,<1.37.0)", "mypy-boto3-translate (>=1.36.0,<1.37.0)", "mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)", "mypy-boto3-voice-id (>=1.36.0,<1.37.0)", "mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)", "mypy-boto3-waf (>=1.36.0,<1.37.0)", "mypy-boto3-waf-regional (>=1.36.0,<1.37.0)", "mypy-boto3-wafv2 (>=1.36.0,<1.37.0)", "mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)", "mypy-boto3-wisdom (>=1.36.0,<1.37.0)", "mypy-boto3-workdocs (>=1.36.0,<1.37.0)", "mypy-boto3-workmail (>=1.36.0,<1.37.0)", "mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)", "mypy-boto3-xray (>=1.36.0,<1.37.0)"] -amp = ["mypy-boto3-amp (>=1.36.0,<1.37.0)"] -amplify = ["mypy-boto3-amplify (>=1.36.0,<1.37.0)"] -amplifybackend = ["mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)"] -amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)"] -apigateway = ["mypy-boto3-apigateway (>=1.36.0,<1.37.0)"] -apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)"] -apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)"] -appconfig = ["mypy-boto3-appconfig (>=1.36.0,<1.37.0)"] -appconfigdata = ["mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)"] -appfabric = ["mypy-boto3-appfabric (>=1.36.0,<1.37.0)"] -appflow = ["mypy-boto3-appflow (>=1.36.0,<1.37.0)"] -appintegrations = ["mypy-boto3-appintegrations (>=1.36.0,<1.37.0)"] -application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)"] -application-insights = ["mypy-boto3-application-insights (>=1.36.0,<1.37.0)"] -application-signals = ["mypy-boto3-application-signals (>=1.36.0,<1.37.0)"] -applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)"] -appmesh = ["mypy-boto3-appmesh (>=1.36.0,<1.37.0)"] -apprunner = ["mypy-boto3-apprunner (>=1.36.0,<1.37.0)"] -appstream = ["mypy-boto3-appstream (>=1.36.0,<1.37.0)"] -appsync = ["mypy-boto3-appsync (>=1.36.0,<1.37.0)"] -apptest = ["mypy-boto3-apptest (>=1.36.0,<1.37.0)"] -arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)"] -artifact = ["mypy-boto3-artifact (>=1.36.0,<1.37.0)"] -athena = ["mypy-boto3-athena (>=1.36.0,<1.37.0)"] -auditmanager = ["mypy-boto3-auditmanager (>=1.36.0,<1.37.0)"] -autoscaling = ["mypy-boto3-autoscaling (>=1.36.0,<1.37.0)"] -autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)"] -b2bi = ["mypy-boto3-b2bi (>=1.36.0,<1.37.0)"] -backup = ["mypy-boto3-backup (>=1.36.0,<1.37.0)"] -backup-gateway = ["mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)"] -backupsearch = ["mypy-boto3-backupsearch (>=1.36.0,<1.37.0)"] -batch = ["mypy-boto3-batch (>=1.36.0,<1.37.0)"] -bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)"] -bcm-pricing-calculator = ["mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)"] -bedrock = ["mypy-boto3-bedrock (>=1.36.0,<1.37.0)"] -bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)"] -bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)"] -bedrock-data-automation = ["mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)"] -bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)"] -bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] -billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] -billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.14)"] -braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] -budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] -ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] -chatbot = ["mypy-boto3-chatbot (>=1.36.0,<1.37.0)"] -chime = ["mypy-boto3-chime (>=1.36.0,<1.37.0)"] -chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)"] -chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)"] -chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)"] -chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)"] -chime-sdk-voice = ["mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)"] -cleanrooms = ["mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)"] -cleanroomsml = ["mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)"] -cloud9 = ["mypy-boto3-cloud9 (>=1.36.0,<1.37.0)"] -cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)"] -clouddirectory = ["mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)"] -cloudformation = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)"] -cloudfront = ["mypy-boto3-cloudfront (>=1.36.0,<1.37.0)"] -cloudfront-keyvaluestore = ["mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)"] -cloudhsm = ["mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)"] -cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)"] -cloudsearch = ["mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)"] -cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)"] -cloudtrail = ["mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)"] -cloudtrail-data = ["mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)"] -cloudwatch = ["mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)"] -codeartifact = ["mypy-boto3-codeartifact (>=1.36.0,<1.37.0)"] -codebuild = ["mypy-boto3-codebuild (>=1.36.0,<1.37.0)"] -codecatalyst = ["mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)"] -codecommit = ["mypy-boto3-codecommit (>=1.36.0,<1.37.0)"] -codeconnections = ["mypy-boto3-codeconnections (>=1.36.0,<1.37.0)"] -codedeploy = ["mypy-boto3-codedeploy (>=1.36.0,<1.37.0)"] -codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)"] -codeguru-security = ["mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)"] -codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)"] -codepipeline = ["mypy-boto3-codepipeline (>=1.36.0,<1.37.0)"] -codestar-connections = ["mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)"] -codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)"] -cognito-identity = ["mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)"] -cognito-idp = ["mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)"] -cognito-sync = ["mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)"] -comprehend = ["mypy-boto3-comprehend (>=1.36.0,<1.37.0)"] -comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)"] -compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)"] -config = ["mypy-boto3-config (>=1.36.0,<1.37.0)"] -connect = ["mypy-boto3-connect (>=1.36.0,<1.37.0)"] -connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)"] -connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)"] -connectcampaignsv2 = ["mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)"] -connectcases = ["mypy-boto3-connectcases (>=1.36.0,<1.37.0)"] -connectparticipant = ["mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)"] -controlcatalog = ["mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)"] -controltower = ["mypy-boto3-controltower (>=1.36.0,<1.37.0)"] -cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)"] -cur = ["mypy-boto3-cur (>=1.36.0,<1.37.0)"] -customer-profiles = ["mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)"] -databrew = ["mypy-boto3-databrew (>=1.36.0,<1.37.0)"] -dataexchange = ["mypy-boto3-dataexchange (>=1.36.0,<1.37.0)"] -datapipeline = ["mypy-boto3-datapipeline (>=1.36.0,<1.37.0)"] -datasync = ["mypy-boto3-datasync (>=1.36.0,<1.37.0)"] -datazone = ["mypy-boto3-datazone (>=1.36.0,<1.37.0)"] -dax = ["mypy-boto3-dax (>=1.36.0,<1.37.0)"] -deadline = ["mypy-boto3-deadline (>=1.36.0,<1.37.0)"] -detective = ["mypy-boto3-detective (>=1.36.0,<1.37.0)"] -devicefarm = ["mypy-boto3-devicefarm (>=1.36.0,<1.37.0)"] -devops-guru = ["mypy-boto3-devops-guru (>=1.36.0,<1.37.0)"] -directconnect = ["mypy-boto3-directconnect (>=1.36.0,<1.37.0)"] -discovery = ["mypy-boto3-discovery (>=1.36.0,<1.37.0)"] -dlm = ["mypy-boto3-dlm (>=1.36.0,<1.37.0)"] -dms = ["mypy-boto3-dms (>=1.36.0,<1.37.0)"] -docdb = ["mypy-boto3-docdb (>=1.36.0,<1.37.0)"] -docdb-elastic = ["mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)"] -drs = ["mypy-boto3-drs (>=1.36.0,<1.37.0)"] -ds = ["mypy-boto3-ds (>=1.36.0,<1.37.0)"] -ds-data = ["mypy-boto3-ds-data (>=1.36.0,<1.37.0)"] -dsql = ["mypy-boto3-dsql (>=1.36.0,<1.37.0)"] -dynamodb = ["mypy-boto3-dynamodb (>=1.36.0,<1.37.0)"] -dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)"] -ebs = ["mypy-boto3-ebs (>=1.36.0,<1.37.0)"] -ec2 = ["mypy-boto3-ec2 (>=1.36.0,<1.37.0)"] -ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)"] -ecr = ["mypy-boto3-ecr (>=1.36.0,<1.37.0)"] -ecr-public = ["mypy-boto3-ecr-public (>=1.36.0,<1.37.0)"] -ecs = ["mypy-boto3-ecs (>=1.36.0,<1.37.0)"] -efs = ["mypy-boto3-efs (>=1.36.0,<1.37.0)"] -eks = ["mypy-boto3-eks (>=1.36.0,<1.37.0)"] -eks-auth = ["mypy-boto3-eks-auth (>=1.36.0,<1.37.0)"] -elastic-inference = ["mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)"] -elasticache = ["mypy-boto3-elasticache (>=1.36.0,<1.37.0)"] -elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)"] -elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)"] -elb = ["mypy-boto3-elb (>=1.36.0,<1.37.0)"] -elbv2 = ["mypy-boto3-elbv2 (>=1.36.0,<1.37.0)"] -emr = ["mypy-boto3-emr (>=1.36.0,<1.37.0)"] -emr-containers = ["mypy-boto3-emr-containers (>=1.36.0,<1.37.0)"] -emr-serverless = ["mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)"] -entityresolution = ["mypy-boto3-entityresolution (>=1.36.0,<1.37.0)"] -es = ["mypy-boto3-es (>=1.36.0,<1.37.0)"] -essential = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)"] -events = ["mypy-boto3-events (>=1.36.0,<1.37.0)"] -evidently = ["mypy-boto3-evidently (>=1.36.0,<1.37.0)"] -finspace = ["mypy-boto3-finspace (>=1.36.0,<1.37.0)"] -finspace-data = ["mypy-boto3-finspace-data (>=1.36.0,<1.37.0)"] -firehose = ["mypy-boto3-firehose (>=1.36.0,<1.37.0)"] -fis = ["mypy-boto3-fis (>=1.36.0,<1.37.0)"] -fms = ["mypy-boto3-fms (>=1.36.0,<1.37.0)"] -forecast = ["mypy-boto3-forecast (>=1.36.0,<1.37.0)"] -forecastquery = ["mypy-boto3-forecastquery (>=1.36.0,<1.37.0)"] -frauddetector = ["mypy-boto3-frauddetector (>=1.36.0,<1.37.0)"] -freetier = ["mypy-boto3-freetier (>=1.36.0,<1.37.0)"] -fsx = ["mypy-boto3-fsx (>=1.36.0,<1.37.0)"] -full = ["boto3-stubs-full (>=1.36.0,<1.37.0)"] -gamelift = ["mypy-boto3-gamelift (>=1.36.0,<1.37.0)"] -geo-maps = ["mypy-boto3-geo-maps (>=1.36.0,<1.37.0)"] -geo-places = ["mypy-boto3-geo-places (>=1.36.0,<1.37.0)"] -geo-routes = ["mypy-boto3-geo-routes (>=1.36.0,<1.37.0)"] -glacier = ["mypy-boto3-glacier (>=1.36.0,<1.37.0)"] -globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)"] -glue = ["mypy-boto3-glue (>=1.36.0,<1.37.0)"] -grafana = ["mypy-boto3-grafana (>=1.36.0,<1.37.0)"] -greengrass = ["mypy-boto3-greengrass (>=1.36.0,<1.37.0)"] -greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)"] -groundstation = ["mypy-boto3-groundstation (>=1.36.0,<1.37.0)"] -guardduty = ["mypy-boto3-guardduty (>=1.36.0,<1.37.0)"] -health = ["mypy-boto3-health (>=1.36.0,<1.37.0)"] -healthlake = ["mypy-boto3-healthlake (>=1.36.0,<1.37.0)"] -iam = ["mypy-boto3-iam (>=1.36.0,<1.37.0)"] -identitystore = ["mypy-boto3-identitystore (>=1.36.0,<1.37.0)"] -imagebuilder = ["mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)"] -importexport = ["mypy-boto3-importexport (>=1.36.0,<1.37.0)"] -inspector = ["mypy-boto3-inspector (>=1.36.0,<1.37.0)"] -inspector-scan = ["mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)"] -inspector2 = ["mypy-boto3-inspector2 (>=1.36.0,<1.37.0)"] -internetmonitor = ["mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)"] -invoicing = ["mypy-boto3-invoicing (>=1.36.0,<1.37.0)"] -iot = ["mypy-boto3-iot (>=1.36.0,<1.37.0)"] -iot-data = ["mypy-boto3-iot-data (>=1.36.0,<1.37.0)"] -iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)"] -iotanalytics = ["mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)"] -iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)"] -iotevents = ["mypy-boto3-iotevents (>=1.36.0,<1.37.0)"] -iotevents-data = ["mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)"] -iotfleethub = ["mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)"] -iotfleetwise = ["mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)"] -iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)"] -iotsitewise = ["mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)"] -iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)"] -iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)"] -iotwireless = ["mypy-boto3-iotwireless (>=1.36.0,<1.37.0)"] -ivs = ["mypy-boto3-ivs (>=1.36.0,<1.37.0)"] -ivs-realtime = ["mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)"] -ivschat = ["mypy-boto3-ivschat (>=1.36.0,<1.37.0)"] -kafka = ["mypy-boto3-kafka (>=1.36.0,<1.37.0)"] -kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)"] -kendra = ["mypy-boto3-kendra (>=1.36.0,<1.37.0)"] -kendra-ranking = ["mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)"] -keyspaces = ["mypy-boto3-keyspaces (>=1.36.0,<1.37.0)"] -kinesis = ["mypy-boto3-kinesis (>=1.36.0,<1.37.0)"] -kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)"] -kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)"] -kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)"] -kinesis-video-webrtc-storage = ["mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)"] -kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)"] -kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)"] -kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)"] -kms = ["mypy-boto3-kms (>=1.36.0,<1.37.0)"] -lakeformation = ["mypy-boto3-lakeformation (>=1.36.0,<1.37.0)"] -lambda = ["mypy-boto3-lambda (>=1.36.0,<1.37.0)"] -launch-wizard = ["mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)"] -lex-models = ["mypy-boto3-lex-models (>=1.36.0,<1.37.0)"] -lex-runtime = ["mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)"] -lexv2-models = ["mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)"] -lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)"] -license-manager = ["mypy-boto3-license-manager (>=1.36.0,<1.37.0)"] -license-manager-linux-subscriptions = ["mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)"] -license-manager-user-subscriptions = ["mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)"] -lightsail = ["mypy-boto3-lightsail (>=1.36.0,<1.37.0)"] -location = ["mypy-boto3-location (>=1.36.0,<1.37.0)"] -logs = ["mypy-boto3-logs (>=1.36.0,<1.37.0)"] -lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)"] -lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)"] -lookoutvision = ["mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)"] -m2 = ["mypy-boto3-m2 (>=1.36.0,<1.37.0)"] -machinelearning = ["mypy-boto3-machinelearning (>=1.36.0,<1.37.0)"] -macie2 = ["mypy-boto3-macie2 (>=1.36.0,<1.37.0)"] -mailmanager = ["mypy-boto3-mailmanager (>=1.36.0,<1.37.0)"] -managedblockchain = ["mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)"] -managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)"] -marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)"] -marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)"] -marketplace-deployment = ["mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)"] -marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)"] -marketplace-reporting = ["mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)"] -marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)"] -mediaconnect = ["mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)"] -mediaconvert = ["mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)"] -medialive = ["mypy-boto3-medialive (>=1.36.0,<1.37.0)"] -mediapackage = ["mypy-boto3-mediapackage (>=1.36.0,<1.37.0)"] -mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)"] -mediapackagev2 = ["mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)"] -mediastore = ["mypy-boto3-mediastore (>=1.36.0,<1.37.0)"] -mediastore-data = ["mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)"] -mediatailor = ["mypy-boto3-mediatailor (>=1.36.0,<1.37.0)"] -medical-imaging = ["mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)"] -memorydb = ["mypy-boto3-memorydb (>=1.36.0,<1.37.0)"] -meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)"] -mgh = ["mypy-boto3-mgh (>=1.36.0,<1.37.0)"] -mgn = ["mypy-boto3-mgn (>=1.36.0,<1.37.0)"] -migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)"] -migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)"] -migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)"] -migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)"] -mq = ["mypy-boto3-mq (>=1.36.0,<1.37.0)"] -mturk = ["mypy-boto3-mturk (>=1.36.0,<1.37.0)"] -mwaa = ["mypy-boto3-mwaa (>=1.36.0,<1.37.0)"] -neptune = ["mypy-boto3-neptune (>=1.36.0,<1.37.0)"] -neptune-graph = ["mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)"] -neptunedata = ["mypy-boto3-neptunedata (>=1.36.0,<1.37.0)"] -network-firewall = ["mypy-boto3-network-firewall (>=1.36.0,<1.37.0)"] -networkflowmonitor = ["mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)"] -networkmanager = ["mypy-boto3-networkmanager (>=1.36.0,<1.37.0)"] -networkmonitor = ["mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)"] -notifications = ["mypy-boto3-notifications (>=1.36.0,<1.37.0)"] -notificationscontacts = ["mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)"] -oam = ["mypy-boto3-oam (>=1.36.0,<1.37.0)"] -observabilityadmin = ["mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)"] -omics = ["mypy-boto3-omics (>=1.36.0,<1.37.0)"] -opensearch = ["mypy-boto3-opensearch (>=1.36.0,<1.37.0)"] -opensearchserverless = ["mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)"] -opsworks = ["mypy-boto3-opsworks (>=1.36.0,<1.37.0)"] -opsworkscm = ["mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)"] -organizations = ["mypy-boto3-organizations (>=1.36.0,<1.37.0)"] -osis = ["mypy-boto3-osis (>=1.36.0,<1.37.0)"] -outposts = ["mypy-boto3-outposts (>=1.36.0,<1.37.0)"] -panorama = ["mypy-boto3-panorama (>=1.36.0,<1.37.0)"] -partnercentral-selling = ["mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)"] -payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)"] -payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)"] -pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)"] -pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)"] -pcs = ["mypy-boto3-pcs (>=1.36.0,<1.37.0)"] -personalize = ["mypy-boto3-personalize (>=1.36.0,<1.37.0)"] -personalize-events = ["mypy-boto3-personalize-events (>=1.36.0,<1.37.0)"] -personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)"] -pi = ["mypy-boto3-pi (>=1.36.0,<1.37.0)"] -pinpoint = ["mypy-boto3-pinpoint (>=1.36.0,<1.37.0)"] -pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)"] -pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)"] -pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)"] -pipes = ["mypy-boto3-pipes (>=1.36.0,<1.37.0)"] -polly = ["mypy-boto3-polly (>=1.36.0,<1.37.0)"] -pricing = ["mypy-boto3-pricing (>=1.36.0,<1.37.0)"] -privatenetworks = ["mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)"] -proton = ["mypy-boto3-proton (>=1.36.0,<1.37.0)"] -qapps = ["mypy-boto3-qapps (>=1.36.0,<1.37.0)"] -qbusiness = ["mypy-boto3-qbusiness (>=1.36.0,<1.37.0)"] -qconnect = ["mypy-boto3-qconnect (>=1.36.0,<1.37.0)"] -qldb = ["mypy-boto3-qldb (>=1.36.0,<1.37.0)"] -qldb-session = ["mypy-boto3-qldb-session (>=1.36.0,<1.37.0)"] -quicksight = ["mypy-boto3-quicksight (>=1.36.0,<1.37.0)"] -ram = ["mypy-boto3-ram (>=1.36.0,<1.37.0)"] -rbin = ["mypy-boto3-rbin (>=1.36.0,<1.37.0)"] -rds = ["mypy-boto3-rds (>=1.36.0,<1.37.0)"] -rds-data = ["mypy-boto3-rds-data (>=1.36.0,<1.37.0)"] -redshift = ["mypy-boto3-redshift (>=1.36.0,<1.37.0)"] -redshift-data = ["mypy-boto3-redshift-data (>=1.36.0,<1.37.0)"] -redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)"] -rekognition = ["mypy-boto3-rekognition (>=1.36.0,<1.37.0)"] -repostspace = ["mypy-boto3-repostspace (>=1.36.0,<1.37.0)"] -resiliencehub = ["mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)"] -resource-explorer-2 = ["mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)"] -resource-groups = ["mypy-boto3-resource-groups (>=1.36.0,<1.37.0)"] -resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)"] -robomaker = ["mypy-boto3-robomaker (>=1.36.0,<1.37.0)"] -rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)"] -route53 = ["mypy-boto3-route53 (>=1.36.0,<1.37.0)"] -route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)"] -route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)"] -route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)"] -route53domains = ["mypy-boto3-route53domains (>=1.36.0,<1.37.0)"] -route53profiles = ["mypy-boto3-route53profiles (>=1.36.0,<1.37.0)"] -route53resolver = ["mypy-boto3-route53resolver (>=1.36.0,<1.37.0)"] -rum = ["mypy-boto3-rum (>=1.36.0,<1.37.0)"] -s3 = ["mypy-boto3-s3 (>=1.36.0,<1.37.0)"] -s3control = ["mypy-boto3-s3control (>=1.36.0,<1.37.0)"] -s3outposts = ["mypy-boto3-s3outposts (>=1.36.0,<1.37.0)"] -s3tables = ["mypy-boto3-s3tables (>=1.36.0,<1.37.0)"] -sagemaker = ["mypy-boto3-sagemaker (>=1.36.0,<1.37.0)"] -sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)"] -sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)"] -sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)"] -sagemaker-geospatial = ["mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)"] -sagemaker-metrics = ["mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)"] -sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)"] -savingsplans = ["mypy-boto3-savingsplans (>=1.36.0,<1.37.0)"] -scheduler = ["mypy-boto3-scheduler (>=1.36.0,<1.37.0)"] -schemas = ["mypy-boto3-schemas (>=1.36.0,<1.37.0)"] -sdb = ["mypy-boto3-sdb (>=1.36.0,<1.37.0)"] -secretsmanager = ["mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)"] -security-ir = ["mypy-boto3-security-ir (>=1.36.0,<1.37.0)"] -securityhub = ["mypy-boto3-securityhub (>=1.36.0,<1.37.0)"] -securitylake = ["mypy-boto3-securitylake (>=1.36.0,<1.37.0)"] -serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)"] -service-quotas = ["mypy-boto3-service-quotas (>=1.36.0,<1.37.0)"] -servicecatalog = ["mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)"] -servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)"] -servicediscovery = ["mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)"] -ses = ["mypy-boto3-ses (>=1.36.0,<1.37.0)"] -sesv2 = ["mypy-boto3-sesv2 (>=1.36.0,<1.37.0)"] -shield = ["mypy-boto3-shield (>=1.36.0,<1.37.0)"] -signer = ["mypy-boto3-signer (>=1.36.0,<1.37.0)"] -simspaceweaver = ["mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)"] -sms = ["mypy-boto3-sms (>=1.36.0,<1.37.0)"] -sms-voice = ["mypy-boto3-sms-voice (>=1.36.0,<1.37.0)"] -snow-device-management = ["mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)"] -snowball = ["mypy-boto3-snowball (>=1.36.0,<1.37.0)"] -sns = ["mypy-boto3-sns (>=1.36.0,<1.37.0)"] -socialmessaging = ["mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)"] -sqs = ["mypy-boto3-sqs (>=1.36.0,<1.37.0)"] -ssm = ["mypy-boto3-ssm (>=1.36.0,<1.37.0)"] -ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)"] -ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)"] -ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)"] -ssm-sap = ["mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)"] -sso = ["mypy-boto3-sso (>=1.36.0,<1.37.0)"] -sso-admin = ["mypy-boto3-sso-admin (>=1.36.0,<1.37.0)"] -sso-oidc = ["mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)"] -stepfunctions = ["mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)"] -storagegateway = ["mypy-boto3-storagegateway (>=1.36.0,<1.37.0)"] -sts = ["mypy-boto3-sts (>=1.36.0,<1.37.0)"] -supplychain = ["mypy-boto3-supplychain (>=1.36.0,<1.37.0)"] -support = ["mypy-boto3-support (>=1.36.0,<1.37.0)"] -support-app = ["mypy-boto3-support-app (>=1.36.0,<1.37.0)"] -swf = ["mypy-boto3-swf (>=1.36.0,<1.37.0)"] -synthetics = ["mypy-boto3-synthetics (>=1.36.0,<1.37.0)"] -taxsettings = ["mypy-boto3-taxsettings (>=1.36.0,<1.37.0)"] -textract = ["mypy-boto3-textract (>=1.36.0,<1.37.0)"] -timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)"] -timestream-query = ["mypy-boto3-timestream-query (>=1.36.0,<1.37.0)"] -timestream-write = ["mypy-boto3-timestream-write (>=1.36.0,<1.37.0)"] -tnb = ["mypy-boto3-tnb (>=1.36.0,<1.37.0)"] -transcribe = ["mypy-boto3-transcribe (>=1.36.0,<1.37.0)"] -transfer = ["mypy-boto3-transfer (>=1.36.0,<1.37.0)"] -translate = ["mypy-boto3-translate (>=1.36.0,<1.37.0)"] -trustedadvisor = ["mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)"] -verifiedpermissions = ["mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)"] -voice-id = ["mypy-boto3-voice-id (>=1.36.0,<1.37.0)"] -vpc-lattice = ["mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)"] -waf = ["mypy-boto3-waf (>=1.36.0,<1.37.0)"] -waf-regional = ["mypy-boto3-waf-regional (>=1.36.0,<1.37.0)"] -wafv2 = ["mypy-boto3-wafv2 (>=1.36.0,<1.37.0)"] -wellarchitected = ["mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)"] -wisdom = ["mypy-boto3-wisdom (>=1.36.0,<1.37.0)"] -workdocs = ["mypy-boto3-workdocs (>=1.36.0,<1.37.0)"] -workmail = ["mypy-boto3-workmail (>=1.36.0,<1.37.0)"] -workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)"] -workspaces = ["mypy-boto3-workspaces (>=1.36.0,<1.37.0)"] -workspaces-thin-client = ["mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)"] -workspaces-web = ["mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)"] -xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] +accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.37.0,<1.38.0)"] +account = ["mypy-boto3-account (>=1.37.0,<1.38.0)"] +acm = ["mypy-boto3-acm (>=1.37.0,<1.38.0)"] +acm-pca = ["mypy-boto3-acm-pca (>=1.37.0,<1.38.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.37.0,<1.38.0)", "mypy-boto3-account (>=1.37.0,<1.38.0)", "mypy-boto3-acm (>=1.37.0,<1.38.0)", "mypy-boto3-acm-pca (>=1.37.0,<1.38.0)", "mypy-boto3-amp (>=1.37.0,<1.38.0)", "mypy-boto3-amplify (>=1.37.0,<1.38.0)", "mypy-boto3-amplifybackend (>=1.37.0,<1.38.0)", "mypy-boto3-amplifyuibuilder (>=1.37.0,<1.38.0)", "mypy-boto3-apigateway (>=1.37.0,<1.38.0)", "mypy-boto3-apigatewaymanagementapi (>=1.37.0,<1.38.0)", "mypy-boto3-apigatewayv2 (>=1.37.0,<1.38.0)", "mypy-boto3-appconfig (>=1.37.0,<1.38.0)", "mypy-boto3-appconfigdata (>=1.37.0,<1.38.0)", "mypy-boto3-appfabric (>=1.37.0,<1.38.0)", "mypy-boto3-appflow (>=1.37.0,<1.38.0)", "mypy-boto3-appintegrations (>=1.37.0,<1.38.0)", "mypy-boto3-application-autoscaling (>=1.37.0,<1.38.0)", "mypy-boto3-application-insights (>=1.37.0,<1.38.0)", "mypy-boto3-application-signals (>=1.37.0,<1.38.0)", "mypy-boto3-applicationcostprofiler (>=1.37.0,<1.38.0)", "mypy-boto3-appmesh (>=1.37.0,<1.38.0)", "mypy-boto3-apprunner (>=1.37.0,<1.38.0)", "mypy-boto3-appstream (>=1.37.0,<1.38.0)", "mypy-boto3-appsync (>=1.37.0,<1.38.0)", "mypy-boto3-apptest (>=1.37.0,<1.38.0)", "mypy-boto3-arc-zonal-shift (>=1.37.0,<1.38.0)", "mypy-boto3-artifact (>=1.37.0,<1.38.0)", "mypy-boto3-athena (>=1.37.0,<1.38.0)", "mypy-boto3-auditmanager (>=1.37.0,<1.38.0)", "mypy-boto3-autoscaling (>=1.37.0,<1.38.0)", "mypy-boto3-autoscaling-plans (>=1.37.0,<1.38.0)", "mypy-boto3-b2bi (>=1.37.0,<1.38.0)", "mypy-boto3-backup (>=1.37.0,<1.38.0)", "mypy-boto3-backup-gateway (>=1.37.0,<1.38.0)", "mypy-boto3-backupsearch (>=1.37.0,<1.38.0)", "mypy-boto3-batch (>=1.37.0,<1.38.0)", "mypy-boto3-bcm-data-exports (>=1.37.0,<1.38.0)", "mypy-boto3-bcm-pricing-calculator (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock-agent (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock-agent-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock-data-automation (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock-data-automation-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-bedrock-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-billing (>=1.37.0,<1.38.0)", "mypy-boto3-billingconductor (>=1.37.0,<1.38.0)", "mypy-boto3-braket (>=1.37.0,<1.38.0)", "mypy-boto3-budgets (>=1.37.0,<1.38.0)", "mypy-boto3-ce (>=1.37.0,<1.38.0)", "mypy-boto3-chatbot (>=1.37.0,<1.38.0)", "mypy-boto3-chime (>=1.37.0,<1.38.0)", "mypy-boto3-chime-sdk-identity (>=1.37.0,<1.38.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.37.0,<1.38.0)", "mypy-boto3-chime-sdk-meetings (>=1.37.0,<1.38.0)", "mypy-boto3-chime-sdk-messaging (>=1.37.0,<1.38.0)", "mypy-boto3-chime-sdk-voice (>=1.37.0,<1.38.0)", "mypy-boto3-cleanrooms (>=1.37.0,<1.38.0)", "mypy-boto3-cleanroomsml (>=1.37.0,<1.38.0)", "mypy-boto3-cloud9 (>=1.37.0,<1.38.0)", "mypy-boto3-cloudcontrol (>=1.37.0,<1.38.0)", "mypy-boto3-clouddirectory (>=1.37.0,<1.38.0)", "mypy-boto3-cloudformation (>=1.37.0,<1.38.0)", "mypy-boto3-cloudfront (>=1.37.0,<1.38.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.37.0,<1.38.0)", "mypy-boto3-cloudhsm (>=1.37.0,<1.38.0)", "mypy-boto3-cloudhsmv2 (>=1.37.0,<1.38.0)", "mypy-boto3-cloudsearch (>=1.37.0,<1.38.0)", "mypy-boto3-cloudsearchdomain (>=1.37.0,<1.38.0)", "mypy-boto3-cloudtrail (>=1.37.0,<1.38.0)", "mypy-boto3-cloudtrail-data (>=1.37.0,<1.38.0)", "mypy-boto3-cloudwatch (>=1.37.0,<1.38.0)", "mypy-boto3-codeartifact (>=1.37.0,<1.38.0)", "mypy-boto3-codebuild (>=1.37.0,<1.38.0)", "mypy-boto3-codecatalyst (>=1.37.0,<1.38.0)", "mypy-boto3-codecommit (>=1.37.0,<1.38.0)", "mypy-boto3-codeconnections (>=1.37.0,<1.38.0)", "mypy-boto3-codedeploy (>=1.37.0,<1.38.0)", "mypy-boto3-codeguru-reviewer (>=1.37.0,<1.38.0)", "mypy-boto3-codeguru-security (>=1.37.0,<1.38.0)", "mypy-boto3-codeguruprofiler (>=1.37.0,<1.38.0)", "mypy-boto3-codepipeline (>=1.37.0,<1.38.0)", "mypy-boto3-codestar-connections (>=1.37.0,<1.38.0)", "mypy-boto3-codestar-notifications (>=1.37.0,<1.38.0)", "mypy-boto3-cognito-identity (>=1.37.0,<1.38.0)", "mypy-boto3-cognito-idp (>=1.37.0,<1.38.0)", "mypy-boto3-cognito-sync (>=1.37.0,<1.38.0)", "mypy-boto3-comprehend (>=1.37.0,<1.38.0)", "mypy-boto3-comprehendmedical (>=1.37.0,<1.38.0)", "mypy-boto3-compute-optimizer (>=1.37.0,<1.38.0)", "mypy-boto3-config (>=1.37.0,<1.38.0)", "mypy-boto3-connect (>=1.37.0,<1.38.0)", "mypy-boto3-connect-contact-lens (>=1.37.0,<1.38.0)", "mypy-boto3-connectcampaigns (>=1.37.0,<1.38.0)", "mypy-boto3-connectcampaignsv2 (>=1.37.0,<1.38.0)", "mypy-boto3-connectcases (>=1.37.0,<1.38.0)", "mypy-boto3-connectparticipant (>=1.37.0,<1.38.0)", "mypy-boto3-controlcatalog (>=1.37.0,<1.38.0)", "mypy-boto3-controltower (>=1.37.0,<1.38.0)", "mypy-boto3-cost-optimization-hub (>=1.37.0,<1.38.0)", "mypy-boto3-cur (>=1.37.0,<1.38.0)", "mypy-boto3-customer-profiles (>=1.37.0,<1.38.0)", "mypy-boto3-databrew (>=1.37.0,<1.38.0)", "mypy-boto3-dataexchange (>=1.37.0,<1.38.0)", "mypy-boto3-datapipeline (>=1.37.0,<1.38.0)", "mypy-boto3-datasync (>=1.37.0,<1.38.0)", "mypy-boto3-datazone (>=1.37.0,<1.38.0)", "mypy-boto3-dax (>=1.37.0,<1.38.0)", "mypy-boto3-deadline (>=1.37.0,<1.38.0)", "mypy-boto3-detective (>=1.37.0,<1.38.0)", "mypy-boto3-devicefarm (>=1.37.0,<1.38.0)", "mypy-boto3-devops-guru (>=1.37.0,<1.38.0)", "mypy-boto3-directconnect (>=1.37.0,<1.38.0)", "mypy-boto3-discovery (>=1.37.0,<1.38.0)", "mypy-boto3-dlm (>=1.37.0,<1.38.0)", "mypy-boto3-dms (>=1.37.0,<1.38.0)", "mypy-boto3-docdb (>=1.37.0,<1.38.0)", "mypy-boto3-docdb-elastic (>=1.37.0,<1.38.0)", "mypy-boto3-drs (>=1.37.0,<1.38.0)", "mypy-boto3-ds (>=1.37.0,<1.38.0)", "mypy-boto3-ds-data (>=1.37.0,<1.38.0)", "mypy-boto3-dsql (>=1.37.0,<1.38.0)", "mypy-boto3-dynamodb (>=1.37.0,<1.38.0)", "mypy-boto3-dynamodbstreams (>=1.37.0,<1.38.0)", "mypy-boto3-ebs (>=1.37.0,<1.38.0)", "mypy-boto3-ec2 (>=1.37.0,<1.38.0)", "mypy-boto3-ec2-instance-connect (>=1.37.0,<1.38.0)", "mypy-boto3-ecr (>=1.37.0,<1.38.0)", "mypy-boto3-ecr-public (>=1.37.0,<1.38.0)", "mypy-boto3-ecs (>=1.37.0,<1.38.0)", "mypy-boto3-efs (>=1.37.0,<1.38.0)", "mypy-boto3-eks (>=1.37.0,<1.38.0)", "mypy-boto3-eks-auth (>=1.37.0,<1.38.0)", "mypy-boto3-elasticache (>=1.37.0,<1.38.0)", "mypy-boto3-elasticbeanstalk (>=1.37.0,<1.38.0)", "mypy-boto3-elastictranscoder (>=1.37.0,<1.38.0)", "mypy-boto3-elb (>=1.37.0,<1.38.0)", "mypy-boto3-elbv2 (>=1.37.0,<1.38.0)", "mypy-boto3-emr (>=1.37.0,<1.38.0)", "mypy-boto3-emr-containers (>=1.37.0,<1.38.0)", "mypy-boto3-emr-serverless (>=1.37.0,<1.38.0)", "mypy-boto3-entityresolution (>=1.37.0,<1.38.0)", "mypy-boto3-es (>=1.37.0,<1.38.0)", "mypy-boto3-events (>=1.37.0,<1.38.0)", "mypy-boto3-evidently (>=1.37.0,<1.38.0)", "mypy-boto3-finspace (>=1.37.0,<1.38.0)", "mypy-boto3-finspace-data (>=1.37.0,<1.38.0)", "mypy-boto3-firehose (>=1.37.0,<1.38.0)", "mypy-boto3-fis (>=1.37.0,<1.38.0)", "mypy-boto3-fms (>=1.37.0,<1.38.0)", "mypy-boto3-forecast (>=1.37.0,<1.38.0)", "mypy-boto3-forecastquery (>=1.37.0,<1.38.0)", "mypy-boto3-frauddetector (>=1.37.0,<1.38.0)", "mypy-boto3-freetier (>=1.37.0,<1.38.0)", "mypy-boto3-fsx (>=1.37.0,<1.38.0)", "mypy-boto3-gamelift (>=1.37.0,<1.38.0)", "mypy-boto3-geo-maps (>=1.37.0,<1.38.0)", "mypy-boto3-geo-places (>=1.37.0,<1.38.0)", "mypy-boto3-geo-routes (>=1.37.0,<1.38.0)", "mypy-boto3-glacier (>=1.37.0,<1.38.0)", "mypy-boto3-globalaccelerator (>=1.37.0,<1.38.0)", "mypy-boto3-glue (>=1.37.0,<1.38.0)", "mypy-boto3-grafana (>=1.37.0,<1.38.0)", "mypy-boto3-greengrass (>=1.37.0,<1.38.0)", "mypy-boto3-greengrassv2 (>=1.37.0,<1.38.0)", "mypy-boto3-groundstation (>=1.37.0,<1.38.0)", "mypy-boto3-guardduty (>=1.37.0,<1.38.0)", "mypy-boto3-health (>=1.37.0,<1.38.0)", "mypy-boto3-healthlake (>=1.37.0,<1.38.0)", "mypy-boto3-iam (>=1.37.0,<1.38.0)", "mypy-boto3-identitystore (>=1.37.0,<1.38.0)", "mypy-boto3-imagebuilder (>=1.37.0,<1.38.0)", "mypy-boto3-importexport (>=1.37.0,<1.38.0)", "mypy-boto3-inspector (>=1.37.0,<1.38.0)", "mypy-boto3-inspector-scan (>=1.37.0,<1.38.0)", "mypy-boto3-inspector2 (>=1.37.0,<1.38.0)", "mypy-boto3-internetmonitor (>=1.37.0,<1.38.0)", "mypy-boto3-invoicing (>=1.37.0,<1.38.0)", "mypy-boto3-iot (>=1.37.0,<1.38.0)", "mypy-boto3-iot-data (>=1.37.0,<1.38.0)", "mypy-boto3-iot-jobs-data (>=1.37.0,<1.38.0)", "mypy-boto3-iotanalytics (>=1.37.0,<1.38.0)", "mypy-boto3-iotdeviceadvisor (>=1.37.0,<1.38.0)", "mypy-boto3-iotevents (>=1.37.0,<1.38.0)", "mypy-boto3-iotevents-data (>=1.37.0,<1.38.0)", "mypy-boto3-iotfleethub (>=1.37.0,<1.38.0)", "mypy-boto3-iotfleetwise (>=1.37.0,<1.38.0)", "mypy-boto3-iotsecuretunneling (>=1.37.0,<1.38.0)", "mypy-boto3-iotsitewise (>=1.37.0,<1.38.0)", "mypy-boto3-iotthingsgraph (>=1.37.0,<1.38.0)", "mypy-boto3-iottwinmaker (>=1.37.0,<1.38.0)", "mypy-boto3-iotwireless (>=1.37.0,<1.38.0)", "mypy-boto3-ivs (>=1.37.0,<1.38.0)", "mypy-boto3-ivs-realtime (>=1.37.0,<1.38.0)", "mypy-boto3-ivschat (>=1.37.0,<1.38.0)", "mypy-boto3-kafka (>=1.37.0,<1.38.0)", "mypy-boto3-kafkaconnect (>=1.37.0,<1.38.0)", "mypy-boto3-kendra (>=1.37.0,<1.38.0)", "mypy-boto3-kendra-ranking (>=1.37.0,<1.38.0)", "mypy-boto3-keyspaces (>=1.37.0,<1.38.0)", "mypy-boto3-kinesis (>=1.37.0,<1.38.0)", "mypy-boto3-kinesis-video-archived-media (>=1.37.0,<1.38.0)", "mypy-boto3-kinesis-video-media (>=1.37.0,<1.38.0)", "mypy-boto3-kinesis-video-signaling (>=1.37.0,<1.38.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.37.0,<1.38.0)", "mypy-boto3-kinesisanalytics (>=1.37.0,<1.38.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.37.0,<1.38.0)", "mypy-boto3-kinesisvideo (>=1.37.0,<1.38.0)", "mypy-boto3-kms (>=1.37.0,<1.38.0)", "mypy-boto3-lakeformation (>=1.37.0,<1.38.0)", "mypy-boto3-lambda (>=1.37.0,<1.38.0)", "mypy-boto3-launch-wizard (>=1.37.0,<1.38.0)", "mypy-boto3-lex-models (>=1.37.0,<1.38.0)", "mypy-boto3-lex-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-lexv2-models (>=1.37.0,<1.38.0)", "mypy-boto3-lexv2-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-license-manager (>=1.37.0,<1.38.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.37.0,<1.38.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.37.0,<1.38.0)", "mypy-boto3-lightsail (>=1.37.0,<1.38.0)", "mypy-boto3-location (>=1.37.0,<1.38.0)", "mypy-boto3-logs (>=1.37.0,<1.38.0)", "mypy-boto3-lookoutequipment (>=1.37.0,<1.38.0)", "mypy-boto3-lookoutmetrics (>=1.37.0,<1.38.0)", "mypy-boto3-lookoutvision (>=1.37.0,<1.38.0)", "mypy-boto3-m2 (>=1.37.0,<1.38.0)", "mypy-boto3-machinelearning (>=1.37.0,<1.38.0)", "mypy-boto3-macie2 (>=1.37.0,<1.38.0)", "mypy-boto3-mailmanager (>=1.37.0,<1.38.0)", "mypy-boto3-managedblockchain (>=1.37.0,<1.38.0)", "mypy-boto3-managedblockchain-query (>=1.37.0,<1.38.0)", "mypy-boto3-marketplace-agreement (>=1.37.0,<1.38.0)", "mypy-boto3-marketplace-catalog (>=1.37.0,<1.38.0)", "mypy-boto3-marketplace-deployment (>=1.37.0,<1.38.0)", "mypy-boto3-marketplace-entitlement (>=1.37.0,<1.38.0)", "mypy-boto3-marketplace-reporting (>=1.37.0,<1.38.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.37.0,<1.38.0)", "mypy-boto3-mediaconnect (>=1.37.0,<1.38.0)", "mypy-boto3-mediaconvert (>=1.37.0,<1.38.0)", "mypy-boto3-medialive (>=1.37.0,<1.38.0)", "mypy-boto3-mediapackage (>=1.37.0,<1.38.0)", "mypy-boto3-mediapackage-vod (>=1.37.0,<1.38.0)", "mypy-boto3-mediapackagev2 (>=1.37.0,<1.38.0)", "mypy-boto3-mediastore (>=1.37.0,<1.38.0)", "mypy-boto3-mediastore-data (>=1.37.0,<1.38.0)", "mypy-boto3-mediatailor (>=1.37.0,<1.38.0)", "mypy-boto3-medical-imaging (>=1.37.0,<1.38.0)", "mypy-boto3-memorydb (>=1.37.0,<1.38.0)", "mypy-boto3-meteringmarketplace (>=1.37.0,<1.38.0)", "mypy-boto3-mgh (>=1.37.0,<1.38.0)", "mypy-boto3-mgn (>=1.37.0,<1.38.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.37.0,<1.38.0)", "mypy-boto3-migrationhub-config (>=1.37.0,<1.38.0)", "mypy-boto3-migrationhuborchestrator (>=1.37.0,<1.38.0)", "mypy-boto3-migrationhubstrategy (>=1.37.0,<1.38.0)", "mypy-boto3-mq (>=1.37.0,<1.38.0)", "mypy-boto3-mturk (>=1.37.0,<1.38.0)", "mypy-boto3-mwaa (>=1.37.0,<1.38.0)", "mypy-boto3-neptune (>=1.37.0,<1.38.0)", "mypy-boto3-neptune-graph (>=1.37.0,<1.38.0)", "mypy-boto3-neptunedata (>=1.37.0,<1.38.0)", "mypy-boto3-network-firewall (>=1.37.0,<1.38.0)", "mypy-boto3-networkflowmonitor (>=1.37.0,<1.38.0)", "mypy-boto3-networkmanager (>=1.37.0,<1.38.0)", "mypy-boto3-networkmonitor (>=1.37.0,<1.38.0)", "mypy-boto3-notifications (>=1.37.0,<1.38.0)", "mypy-boto3-notificationscontacts (>=1.37.0,<1.38.0)", "mypy-boto3-oam (>=1.37.0,<1.38.0)", "mypy-boto3-observabilityadmin (>=1.37.0,<1.38.0)", "mypy-boto3-omics (>=1.37.0,<1.38.0)", "mypy-boto3-opensearch (>=1.37.0,<1.38.0)", "mypy-boto3-opensearchserverless (>=1.37.0,<1.38.0)", "mypy-boto3-opsworks (>=1.37.0,<1.38.0)", "mypy-boto3-opsworkscm (>=1.37.0,<1.38.0)", "mypy-boto3-organizations (>=1.37.0,<1.38.0)", "mypy-boto3-osis (>=1.37.0,<1.38.0)", "mypy-boto3-outposts (>=1.37.0,<1.38.0)", "mypy-boto3-panorama (>=1.37.0,<1.38.0)", "mypy-boto3-partnercentral-selling (>=1.37.0,<1.38.0)", "mypy-boto3-payment-cryptography (>=1.37.0,<1.38.0)", "mypy-boto3-payment-cryptography-data (>=1.37.0,<1.38.0)", "mypy-boto3-pca-connector-ad (>=1.37.0,<1.38.0)", "mypy-boto3-pca-connector-scep (>=1.37.0,<1.38.0)", "mypy-boto3-pcs (>=1.37.0,<1.38.0)", "mypy-boto3-personalize (>=1.37.0,<1.38.0)", "mypy-boto3-personalize-events (>=1.37.0,<1.38.0)", "mypy-boto3-personalize-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-pi (>=1.37.0,<1.38.0)", "mypy-boto3-pinpoint (>=1.37.0,<1.38.0)", "mypy-boto3-pinpoint-email (>=1.37.0,<1.38.0)", "mypy-boto3-pinpoint-sms-voice (>=1.37.0,<1.38.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.37.0,<1.38.0)", "mypy-boto3-pipes (>=1.37.0,<1.38.0)", "mypy-boto3-polly (>=1.37.0,<1.38.0)", "mypy-boto3-pricing (>=1.37.0,<1.38.0)", "mypy-boto3-privatenetworks (>=1.37.0,<1.38.0)", "mypy-boto3-proton (>=1.37.0,<1.38.0)", "mypy-boto3-qapps (>=1.37.0,<1.38.0)", "mypy-boto3-qbusiness (>=1.37.0,<1.38.0)", "mypy-boto3-qconnect (>=1.37.0,<1.38.0)", "mypy-boto3-qldb (>=1.37.0,<1.38.0)", "mypy-boto3-qldb-session (>=1.37.0,<1.38.0)", "mypy-boto3-quicksight (>=1.37.0,<1.38.0)", "mypy-boto3-ram (>=1.37.0,<1.38.0)", "mypy-boto3-rbin (>=1.37.0,<1.38.0)", "mypy-boto3-rds (>=1.37.0,<1.38.0)", "mypy-boto3-rds-data (>=1.37.0,<1.38.0)", "mypy-boto3-redshift (>=1.37.0,<1.38.0)", "mypy-boto3-redshift-data (>=1.37.0,<1.38.0)", "mypy-boto3-redshift-serverless (>=1.37.0,<1.38.0)", "mypy-boto3-rekognition (>=1.37.0,<1.38.0)", "mypy-boto3-repostspace (>=1.37.0,<1.38.0)", "mypy-boto3-resiliencehub (>=1.37.0,<1.38.0)", "mypy-boto3-resource-explorer-2 (>=1.37.0,<1.38.0)", "mypy-boto3-resource-groups (>=1.37.0,<1.38.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.37.0,<1.38.0)", "mypy-boto3-robomaker (>=1.37.0,<1.38.0)", "mypy-boto3-rolesanywhere (>=1.37.0,<1.38.0)", "mypy-boto3-route53 (>=1.37.0,<1.38.0)", "mypy-boto3-route53-recovery-cluster (>=1.37.0,<1.38.0)", "mypy-boto3-route53-recovery-control-config (>=1.37.0,<1.38.0)", "mypy-boto3-route53-recovery-readiness (>=1.37.0,<1.38.0)", "mypy-boto3-route53domains (>=1.37.0,<1.38.0)", "mypy-boto3-route53profiles (>=1.37.0,<1.38.0)", "mypy-boto3-route53resolver (>=1.37.0,<1.38.0)", "mypy-boto3-rum (>=1.37.0,<1.38.0)", "mypy-boto3-s3 (>=1.37.0,<1.38.0)", "mypy-boto3-s3control (>=1.37.0,<1.38.0)", "mypy-boto3-s3outposts (>=1.37.0,<1.38.0)", "mypy-boto3-s3tables (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-edge (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-geospatial (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-metrics (>=1.37.0,<1.38.0)", "mypy-boto3-sagemaker-runtime (>=1.37.0,<1.38.0)", "mypy-boto3-savingsplans (>=1.37.0,<1.38.0)", "mypy-boto3-scheduler (>=1.37.0,<1.38.0)", "mypy-boto3-schemas (>=1.37.0,<1.38.0)", "mypy-boto3-sdb (>=1.37.0,<1.38.0)", "mypy-boto3-secretsmanager (>=1.37.0,<1.38.0)", "mypy-boto3-security-ir (>=1.37.0,<1.38.0)", "mypy-boto3-securityhub (>=1.37.0,<1.38.0)", "mypy-boto3-securitylake (>=1.37.0,<1.38.0)", "mypy-boto3-serverlessrepo (>=1.37.0,<1.38.0)", "mypy-boto3-service-quotas (>=1.37.0,<1.38.0)", "mypy-boto3-servicecatalog (>=1.37.0,<1.38.0)", "mypy-boto3-servicecatalog-appregistry (>=1.37.0,<1.38.0)", "mypy-boto3-servicediscovery (>=1.37.0,<1.38.0)", "mypy-boto3-ses (>=1.37.0,<1.38.0)", "mypy-boto3-sesv2 (>=1.37.0,<1.38.0)", "mypy-boto3-shield (>=1.37.0,<1.38.0)", "mypy-boto3-signer (>=1.37.0,<1.38.0)", "mypy-boto3-simspaceweaver (>=1.37.0,<1.38.0)", "mypy-boto3-sms (>=1.37.0,<1.38.0)", "mypy-boto3-sms-voice (>=1.37.0,<1.38.0)", "mypy-boto3-snow-device-management (>=1.37.0,<1.38.0)", "mypy-boto3-snowball (>=1.37.0,<1.38.0)", "mypy-boto3-sns (>=1.37.0,<1.38.0)", "mypy-boto3-socialmessaging (>=1.37.0,<1.38.0)", "mypy-boto3-sqs (>=1.37.0,<1.38.0)", "mypy-boto3-ssm (>=1.37.0,<1.38.0)", "mypy-boto3-ssm-contacts (>=1.37.0,<1.38.0)", "mypy-boto3-ssm-incidents (>=1.37.0,<1.38.0)", "mypy-boto3-ssm-quicksetup (>=1.37.0,<1.38.0)", "mypy-boto3-ssm-sap (>=1.37.0,<1.38.0)", "mypy-boto3-sso (>=1.37.0,<1.38.0)", "mypy-boto3-sso-admin (>=1.37.0,<1.38.0)", "mypy-boto3-sso-oidc (>=1.37.0,<1.38.0)", "mypy-boto3-stepfunctions (>=1.37.0,<1.38.0)", "mypy-boto3-storagegateway (>=1.37.0,<1.38.0)", "mypy-boto3-sts (>=1.37.0,<1.38.0)", "mypy-boto3-supplychain (>=1.37.0,<1.38.0)", "mypy-boto3-support (>=1.37.0,<1.38.0)", "mypy-boto3-support-app (>=1.37.0,<1.38.0)", "mypy-boto3-swf (>=1.37.0,<1.38.0)", "mypy-boto3-synthetics (>=1.37.0,<1.38.0)", "mypy-boto3-taxsettings (>=1.37.0,<1.38.0)", "mypy-boto3-textract (>=1.37.0,<1.38.0)", "mypy-boto3-timestream-influxdb (>=1.37.0,<1.38.0)", "mypy-boto3-timestream-query (>=1.37.0,<1.38.0)", "mypy-boto3-timestream-write (>=1.37.0,<1.38.0)", "mypy-boto3-tnb (>=1.37.0,<1.38.0)", "mypy-boto3-transcribe (>=1.37.0,<1.38.0)", "mypy-boto3-transfer (>=1.37.0,<1.38.0)", "mypy-boto3-translate (>=1.37.0,<1.38.0)", "mypy-boto3-trustedadvisor (>=1.37.0,<1.38.0)", "mypy-boto3-verifiedpermissions (>=1.37.0,<1.38.0)", "mypy-boto3-voice-id (>=1.37.0,<1.38.0)", "mypy-boto3-vpc-lattice (>=1.37.0,<1.38.0)", "mypy-boto3-waf (>=1.37.0,<1.38.0)", "mypy-boto3-waf-regional (>=1.37.0,<1.38.0)", "mypy-boto3-wafv2 (>=1.37.0,<1.38.0)", "mypy-boto3-wellarchitected (>=1.37.0,<1.38.0)", "mypy-boto3-wisdom (>=1.37.0,<1.38.0)", "mypy-boto3-workdocs (>=1.37.0,<1.38.0)", "mypy-boto3-workmail (>=1.37.0,<1.38.0)", "mypy-boto3-workmailmessageflow (>=1.37.0,<1.38.0)", "mypy-boto3-workspaces (>=1.37.0,<1.38.0)", "mypy-boto3-workspaces-thin-client (>=1.37.0,<1.38.0)", "mypy-boto3-workspaces-web (>=1.37.0,<1.38.0)", "mypy-boto3-xray (>=1.37.0,<1.38.0)"] +amp = ["mypy-boto3-amp (>=1.37.0,<1.38.0)"] +amplify = ["mypy-boto3-amplify (>=1.37.0,<1.38.0)"] +amplifybackend = ["mypy-boto3-amplifybackend (>=1.37.0,<1.38.0)"] +amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.37.0,<1.38.0)"] +apigateway = ["mypy-boto3-apigateway (>=1.37.0,<1.38.0)"] +apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.37.0,<1.38.0)"] +apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.37.0,<1.38.0)"] +appconfig = ["mypy-boto3-appconfig (>=1.37.0,<1.38.0)"] +appconfigdata = ["mypy-boto3-appconfigdata (>=1.37.0,<1.38.0)"] +appfabric = ["mypy-boto3-appfabric (>=1.37.0,<1.38.0)"] +appflow = ["mypy-boto3-appflow (>=1.37.0,<1.38.0)"] +appintegrations = ["mypy-boto3-appintegrations (>=1.37.0,<1.38.0)"] +application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.37.0,<1.38.0)"] +application-insights = ["mypy-boto3-application-insights (>=1.37.0,<1.38.0)"] +application-signals = ["mypy-boto3-application-signals (>=1.37.0,<1.38.0)"] +applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.37.0,<1.38.0)"] +appmesh = ["mypy-boto3-appmesh (>=1.37.0,<1.38.0)"] +apprunner = ["mypy-boto3-apprunner (>=1.37.0,<1.38.0)"] +appstream = ["mypy-boto3-appstream (>=1.37.0,<1.38.0)"] +appsync = ["mypy-boto3-appsync (>=1.37.0,<1.38.0)"] +apptest = ["mypy-boto3-apptest (>=1.37.0,<1.38.0)"] +arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.37.0,<1.38.0)"] +artifact = ["mypy-boto3-artifact (>=1.37.0,<1.38.0)"] +athena = ["mypy-boto3-athena (>=1.37.0,<1.38.0)"] +auditmanager = ["mypy-boto3-auditmanager (>=1.37.0,<1.38.0)"] +autoscaling = ["mypy-boto3-autoscaling (>=1.37.0,<1.38.0)"] +autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.37.0,<1.38.0)"] +b2bi = ["mypy-boto3-b2bi (>=1.37.0,<1.38.0)"] +backup = ["mypy-boto3-backup (>=1.37.0,<1.38.0)"] +backup-gateway = ["mypy-boto3-backup-gateway (>=1.37.0,<1.38.0)"] +backupsearch = ["mypy-boto3-backupsearch (>=1.37.0,<1.38.0)"] +batch = ["mypy-boto3-batch (>=1.37.0,<1.38.0)"] +bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.37.0,<1.38.0)"] +bcm-pricing-calculator = ["mypy-boto3-bcm-pricing-calculator (>=1.37.0,<1.38.0)"] +bedrock = ["mypy-boto3-bedrock (>=1.37.0,<1.38.0)"] +bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.37.0,<1.38.0)"] +bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.37.0,<1.38.0)"] +bedrock-data-automation = ["mypy-boto3-bedrock-data-automation (>=1.37.0,<1.38.0)"] +bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (>=1.37.0,<1.38.0)"] +bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.37.0,<1.38.0)"] +billing = ["mypy-boto3-billing (>=1.37.0,<1.38.0)"] +billingconductor = ["mypy-boto3-billingconductor (>=1.37.0,<1.38.0)"] +boto3 = ["boto3 (==1.37.5)"] +braket = ["mypy-boto3-braket (>=1.37.0,<1.38.0)"] +budgets = ["mypy-boto3-budgets (>=1.37.0,<1.38.0)"] +ce = ["mypy-boto3-ce (>=1.37.0,<1.38.0)"] +chatbot = ["mypy-boto3-chatbot (>=1.37.0,<1.38.0)"] +chime = ["mypy-boto3-chime (>=1.37.0,<1.38.0)"] +chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.37.0,<1.38.0)"] +chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.37.0,<1.38.0)"] +chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.37.0,<1.38.0)"] +chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.37.0,<1.38.0)"] +chime-sdk-voice = ["mypy-boto3-chime-sdk-voice (>=1.37.0,<1.38.0)"] +cleanrooms = ["mypy-boto3-cleanrooms (>=1.37.0,<1.38.0)"] +cleanroomsml = ["mypy-boto3-cleanroomsml (>=1.37.0,<1.38.0)"] +cloud9 = ["mypy-boto3-cloud9 (>=1.37.0,<1.38.0)"] +cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.37.0,<1.38.0)"] +clouddirectory = ["mypy-boto3-clouddirectory (>=1.37.0,<1.38.0)"] +cloudformation = ["mypy-boto3-cloudformation (>=1.37.0,<1.38.0)"] +cloudfront = ["mypy-boto3-cloudfront (>=1.37.0,<1.38.0)"] +cloudfront-keyvaluestore = ["mypy-boto3-cloudfront-keyvaluestore (>=1.37.0,<1.38.0)"] +cloudhsm = ["mypy-boto3-cloudhsm (>=1.37.0,<1.38.0)"] +cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.37.0,<1.38.0)"] +cloudsearch = ["mypy-boto3-cloudsearch (>=1.37.0,<1.38.0)"] +cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.37.0,<1.38.0)"] +cloudtrail = ["mypy-boto3-cloudtrail (>=1.37.0,<1.38.0)"] +cloudtrail-data = ["mypy-boto3-cloudtrail-data (>=1.37.0,<1.38.0)"] +cloudwatch = ["mypy-boto3-cloudwatch (>=1.37.0,<1.38.0)"] +codeartifact = ["mypy-boto3-codeartifact (>=1.37.0,<1.38.0)"] +codebuild = ["mypy-boto3-codebuild (>=1.37.0,<1.38.0)"] +codecatalyst = ["mypy-boto3-codecatalyst (>=1.37.0,<1.38.0)"] +codecommit = ["mypy-boto3-codecommit (>=1.37.0,<1.38.0)"] +codeconnections = ["mypy-boto3-codeconnections (>=1.37.0,<1.38.0)"] +codedeploy = ["mypy-boto3-codedeploy (>=1.37.0,<1.38.0)"] +codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.37.0,<1.38.0)"] +codeguru-security = ["mypy-boto3-codeguru-security (>=1.37.0,<1.38.0)"] +codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.37.0,<1.38.0)"] +codepipeline = ["mypy-boto3-codepipeline (>=1.37.0,<1.38.0)"] +codestar-connections = ["mypy-boto3-codestar-connections (>=1.37.0,<1.38.0)"] +codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.37.0,<1.38.0)"] +cognito-identity = ["mypy-boto3-cognito-identity (>=1.37.0,<1.38.0)"] +cognito-idp = ["mypy-boto3-cognito-idp (>=1.37.0,<1.38.0)"] +cognito-sync = ["mypy-boto3-cognito-sync (>=1.37.0,<1.38.0)"] +comprehend = ["mypy-boto3-comprehend (>=1.37.0,<1.38.0)"] +comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.37.0,<1.38.0)"] +compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.37.0,<1.38.0)"] +config = ["mypy-boto3-config (>=1.37.0,<1.38.0)"] +connect = ["mypy-boto3-connect (>=1.37.0,<1.38.0)"] +connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.37.0,<1.38.0)"] +connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.37.0,<1.38.0)"] +connectcampaignsv2 = ["mypy-boto3-connectcampaignsv2 (>=1.37.0,<1.38.0)"] +connectcases = ["mypy-boto3-connectcases (>=1.37.0,<1.38.0)"] +connectparticipant = ["mypy-boto3-connectparticipant (>=1.37.0,<1.38.0)"] +controlcatalog = ["mypy-boto3-controlcatalog (>=1.37.0,<1.38.0)"] +controltower = ["mypy-boto3-controltower (>=1.37.0,<1.38.0)"] +cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.37.0,<1.38.0)"] +cur = ["mypy-boto3-cur (>=1.37.0,<1.38.0)"] +customer-profiles = ["mypy-boto3-customer-profiles (>=1.37.0,<1.38.0)"] +databrew = ["mypy-boto3-databrew (>=1.37.0,<1.38.0)"] +dataexchange = ["mypy-boto3-dataexchange (>=1.37.0,<1.38.0)"] +datapipeline = ["mypy-boto3-datapipeline (>=1.37.0,<1.38.0)"] +datasync = ["mypy-boto3-datasync (>=1.37.0,<1.38.0)"] +datazone = ["mypy-boto3-datazone (>=1.37.0,<1.38.0)"] +dax = ["mypy-boto3-dax (>=1.37.0,<1.38.0)"] +deadline = ["mypy-boto3-deadline (>=1.37.0,<1.38.0)"] +detective = ["mypy-boto3-detective (>=1.37.0,<1.38.0)"] +devicefarm = ["mypy-boto3-devicefarm (>=1.37.0,<1.38.0)"] +devops-guru = ["mypy-boto3-devops-guru (>=1.37.0,<1.38.0)"] +directconnect = ["mypy-boto3-directconnect (>=1.37.0,<1.38.0)"] +discovery = ["mypy-boto3-discovery (>=1.37.0,<1.38.0)"] +dlm = ["mypy-boto3-dlm (>=1.37.0,<1.38.0)"] +dms = ["mypy-boto3-dms (>=1.37.0,<1.38.0)"] +docdb = ["mypy-boto3-docdb (>=1.37.0,<1.38.0)"] +docdb-elastic = ["mypy-boto3-docdb-elastic (>=1.37.0,<1.38.0)"] +drs = ["mypy-boto3-drs (>=1.37.0,<1.38.0)"] +ds = ["mypy-boto3-ds (>=1.37.0,<1.38.0)"] +ds-data = ["mypy-boto3-ds-data (>=1.37.0,<1.38.0)"] +dsql = ["mypy-boto3-dsql (>=1.37.0,<1.38.0)"] +dynamodb = ["mypy-boto3-dynamodb (>=1.37.0,<1.38.0)"] +dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.37.0,<1.38.0)"] +ebs = ["mypy-boto3-ebs (>=1.37.0,<1.38.0)"] +ec2 = ["mypy-boto3-ec2 (>=1.37.0,<1.38.0)"] +ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.37.0,<1.38.0)"] +ecr = ["mypy-boto3-ecr (>=1.37.0,<1.38.0)"] +ecr-public = ["mypy-boto3-ecr-public (>=1.37.0,<1.38.0)"] +ecs = ["mypy-boto3-ecs (>=1.37.0,<1.38.0)"] +efs = ["mypy-boto3-efs (>=1.37.0,<1.38.0)"] +eks = ["mypy-boto3-eks (>=1.37.0,<1.38.0)"] +eks-auth = ["mypy-boto3-eks-auth (>=1.37.0,<1.38.0)"] +elasticache = ["mypy-boto3-elasticache (>=1.37.0,<1.38.0)"] +elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.37.0,<1.38.0)"] +elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.37.0,<1.38.0)"] +elb = ["mypy-boto3-elb (>=1.37.0,<1.38.0)"] +elbv2 = ["mypy-boto3-elbv2 (>=1.37.0,<1.38.0)"] +emr = ["mypy-boto3-emr (>=1.37.0,<1.38.0)"] +emr-containers = ["mypy-boto3-emr-containers (>=1.37.0,<1.38.0)"] +emr-serverless = ["mypy-boto3-emr-serverless (>=1.37.0,<1.38.0)"] +entityresolution = ["mypy-boto3-entityresolution (>=1.37.0,<1.38.0)"] +es = ["mypy-boto3-es (>=1.37.0,<1.38.0)"] +essential = ["mypy-boto3-cloudformation (>=1.37.0,<1.38.0)", "mypy-boto3-dynamodb (>=1.37.0,<1.38.0)", "mypy-boto3-ec2 (>=1.37.0,<1.38.0)", "mypy-boto3-lambda (>=1.37.0,<1.38.0)", "mypy-boto3-rds (>=1.37.0,<1.38.0)", "mypy-boto3-s3 (>=1.37.0,<1.38.0)", "mypy-boto3-sqs (>=1.37.0,<1.38.0)"] +events = ["mypy-boto3-events (>=1.37.0,<1.38.0)"] +evidently = ["mypy-boto3-evidently (>=1.37.0,<1.38.0)"] +finspace = ["mypy-boto3-finspace (>=1.37.0,<1.38.0)"] +finspace-data = ["mypy-boto3-finspace-data (>=1.37.0,<1.38.0)"] +firehose = ["mypy-boto3-firehose (>=1.37.0,<1.38.0)"] +fis = ["mypy-boto3-fis (>=1.37.0,<1.38.0)"] +fms = ["mypy-boto3-fms (>=1.37.0,<1.38.0)"] +forecast = ["mypy-boto3-forecast (>=1.37.0,<1.38.0)"] +forecastquery = ["mypy-boto3-forecastquery (>=1.37.0,<1.38.0)"] +frauddetector = ["mypy-boto3-frauddetector (>=1.37.0,<1.38.0)"] +freetier = ["mypy-boto3-freetier (>=1.37.0,<1.38.0)"] +fsx = ["mypy-boto3-fsx (>=1.37.0,<1.38.0)"] +full = ["boto3-stubs-full (>=1.37.0,<1.38.0)"] +gamelift = ["mypy-boto3-gamelift (>=1.37.0,<1.38.0)"] +geo-maps = ["mypy-boto3-geo-maps (>=1.37.0,<1.38.0)"] +geo-places = ["mypy-boto3-geo-places (>=1.37.0,<1.38.0)"] +geo-routes = ["mypy-boto3-geo-routes (>=1.37.0,<1.38.0)"] +glacier = ["mypy-boto3-glacier (>=1.37.0,<1.38.0)"] +globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.37.0,<1.38.0)"] +glue = ["mypy-boto3-glue (>=1.37.0,<1.38.0)"] +grafana = ["mypy-boto3-grafana (>=1.37.0,<1.38.0)"] +greengrass = ["mypy-boto3-greengrass (>=1.37.0,<1.38.0)"] +greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.37.0,<1.38.0)"] +groundstation = ["mypy-boto3-groundstation (>=1.37.0,<1.38.0)"] +guardduty = ["mypy-boto3-guardduty (>=1.37.0,<1.38.0)"] +health = ["mypy-boto3-health (>=1.37.0,<1.38.0)"] +healthlake = ["mypy-boto3-healthlake (>=1.37.0,<1.38.0)"] +iam = ["mypy-boto3-iam (>=1.37.0,<1.38.0)"] +identitystore = ["mypy-boto3-identitystore (>=1.37.0,<1.38.0)"] +imagebuilder = ["mypy-boto3-imagebuilder (>=1.37.0,<1.38.0)"] +importexport = ["mypy-boto3-importexport (>=1.37.0,<1.38.0)"] +inspector = ["mypy-boto3-inspector (>=1.37.0,<1.38.0)"] +inspector-scan = ["mypy-boto3-inspector-scan (>=1.37.0,<1.38.0)"] +inspector2 = ["mypy-boto3-inspector2 (>=1.37.0,<1.38.0)"] +internetmonitor = ["mypy-boto3-internetmonitor (>=1.37.0,<1.38.0)"] +invoicing = ["mypy-boto3-invoicing (>=1.37.0,<1.38.0)"] +iot = ["mypy-boto3-iot (>=1.37.0,<1.38.0)"] +iot-data = ["mypy-boto3-iot-data (>=1.37.0,<1.38.0)"] +iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.37.0,<1.38.0)"] +iotanalytics = ["mypy-boto3-iotanalytics (>=1.37.0,<1.38.0)"] +iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.37.0,<1.38.0)"] +iotevents = ["mypy-boto3-iotevents (>=1.37.0,<1.38.0)"] +iotevents-data = ["mypy-boto3-iotevents-data (>=1.37.0,<1.38.0)"] +iotfleethub = ["mypy-boto3-iotfleethub (>=1.37.0,<1.38.0)"] +iotfleetwise = ["mypy-boto3-iotfleetwise (>=1.37.0,<1.38.0)"] +iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.37.0,<1.38.0)"] +iotsitewise = ["mypy-boto3-iotsitewise (>=1.37.0,<1.38.0)"] +iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.37.0,<1.38.0)"] +iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.37.0,<1.38.0)"] +iotwireless = ["mypy-boto3-iotwireless (>=1.37.0,<1.38.0)"] +ivs = ["mypy-boto3-ivs (>=1.37.0,<1.38.0)"] +ivs-realtime = ["mypy-boto3-ivs-realtime (>=1.37.0,<1.38.0)"] +ivschat = ["mypy-boto3-ivschat (>=1.37.0,<1.38.0)"] +kafka = ["mypy-boto3-kafka (>=1.37.0,<1.38.0)"] +kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.37.0,<1.38.0)"] +kendra = ["mypy-boto3-kendra (>=1.37.0,<1.38.0)"] +kendra-ranking = ["mypy-boto3-kendra-ranking (>=1.37.0,<1.38.0)"] +keyspaces = ["mypy-boto3-keyspaces (>=1.37.0,<1.38.0)"] +kinesis = ["mypy-boto3-kinesis (>=1.37.0,<1.38.0)"] +kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.37.0,<1.38.0)"] +kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.37.0,<1.38.0)"] +kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.37.0,<1.38.0)"] +kinesis-video-webrtc-storage = ["mypy-boto3-kinesis-video-webrtc-storage (>=1.37.0,<1.38.0)"] +kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.37.0,<1.38.0)"] +kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.37.0,<1.38.0)"] +kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.37.0,<1.38.0)"] +kms = ["mypy-boto3-kms (>=1.37.0,<1.38.0)"] +lakeformation = ["mypy-boto3-lakeformation (>=1.37.0,<1.38.0)"] +lambda = ["mypy-boto3-lambda (>=1.37.0,<1.38.0)"] +launch-wizard = ["mypy-boto3-launch-wizard (>=1.37.0,<1.38.0)"] +lex-models = ["mypy-boto3-lex-models (>=1.37.0,<1.38.0)"] +lex-runtime = ["mypy-boto3-lex-runtime (>=1.37.0,<1.38.0)"] +lexv2-models = ["mypy-boto3-lexv2-models (>=1.37.0,<1.38.0)"] +lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.37.0,<1.38.0)"] +license-manager = ["mypy-boto3-license-manager (>=1.37.0,<1.38.0)"] +license-manager-linux-subscriptions = ["mypy-boto3-license-manager-linux-subscriptions (>=1.37.0,<1.38.0)"] +license-manager-user-subscriptions = ["mypy-boto3-license-manager-user-subscriptions (>=1.37.0,<1.38.0)"] +lightsail = ["mypy-boto3-lightsail (>=1.37.0,<1.38.0)"] +location = ["mypy-boto3-location (>=1.37.0,<1.38.0)"] +logs = ["mypy-boto3-logs (>=1.37.0,<1.38.0)"] +lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.37.0,<1.38.0)"] +lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.37.0,<1.38.0)"] +lookoutvision = ["mypy-boto3-lookoutvision (>=1.37.0,<1.38.0)"] +m2 = ["mypy-boto3-m2 (>=1.37.0,<1.38.0)"] +machinelearning = ["mypy-boto3-machinelearning (>=1.37.0,<1.38.0)"] +macie2 = ["mypy-boto3-macie2 (>=1.37.0,<1.38.0)"] +mailmanager = ["mypy-boto3-mailmanager (>=1.37.0,<1.38.0)"] +managedblockchain = ["mypy-boto3-managedblockchain (>=1.37.0,<1.38.0)"] +managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.37.0,<1.38.0)"] +marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.37.0,<1.38.0)"] +marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.37.0,<1.38.0)"] +marketplace-deployment = ["mypy-boto3-marketplace-deployment (>=1.37.0,<1.38.0)"] +marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.37.0,<1.38.0)"] +marketplace-reporting = ["mypy-boto3-marketplace-reporting (>=1.37.0,<1.38.0)"] +marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.37.0,<1.38.0)"] +mediaconnect = ["mypy-boto3-mediaconnect (>=1.37.0,<1.38.0)"] +mediaconvert = ["mypy-boto3-mediaconvert (>=1.37.0,<1.38.0)"] +medialive = ["mypy-boto3-medialive (>=1.37.0,<1.38.0)"] +mediapackage = ["mypy-boto3-mediapackage (>=1.37.0,<1.38.0)"] +mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.37.0,<1.38.0)"] +mediapackagev2 = ["mypy-boto3-mediapackagev2 (>=1.37.0,<1.38.0)"] +mediastore = ["mypy-boto3-mediastore (>=1.37.0,<1.38.0)"] +mediastore-data = ["mypy-boto3-mediastore-data (>=1.37.0,<1.38.0)"] +mediatailor = ["mypy-boto3-mediatailor (>=1.37.0,<1.38.0)"] +medical-imaging = ["mypy-boto3-medical-imaging (>=1.37.0,<1.38.0)"] +memorydb = ["mypy-boto3-memorydb (>=1.37.0,<1.38.0)"] +meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.37.0,<1.38.0)"] +mgh = ["mypy-boto3-mgh (>=1.37.0,<1.38.0)"] +mgn = ["mypy-boto3-mgn (>=1.37.0,<1.38.0)"] +migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.37.0,<1.38.0)"] +migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.37.0,<1.38.0)"] +migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.37.0,<1.38.0)"] +migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.37.0,<1.38.0)"] +mq = ["mypy-boto3-mq (>=1.37.0,<1.38.0)"] +mturk = ["mypy-boto3-mturk (>=1.37.0,<1.38.0)"] +mwaa = ["mypy-boto3-mwaa (>=1.37.0,<1.38.0)"] +neptune = ["mypy-boto3-neptune (>=1.37.0,<1.38.0)"] +neptune-graph = ["mypy-boto3-neptune-graph (>=1.37.0,<1.38.0)"] +neptunedata = ["mypy-boto3-neptunedata (>=1.37.0,<1.38.0)"] +network-firewall = ["mypy-boto3-network-firewall (>=1.37.0,<1.38.0)"] +networkflowmonitor = ["mypy-boto3-networkflowmonitor (>=1.37.0,<1.38.0)"] +networkmanager = ["mypy-boto3-networkmanager (>=1.37.0,<1.38.0)"] +networkmonitor = ["mypy-boto3-networkmonitor (>=1.37.0,<1.38.0)"] +notifications = ["mypy-boto3-notifications (>=1.37.0,<1.38.0)"] +notificationscontacts = ["mypy-boto3-notificationscontacts (>=1.37.0,<1.38.0)"] +oam = ["mypy-boto3-oam (>=1.37.0,<1.38.0)"] +observabilityadmin = ["mypy-boto3-observabilityadmin (>=1.37.0,<1.38.0)"] +omics = ["mypy-boto3-omics (>=1.37.0,<1.38.0)"] +opensearch = ["mypy-boto3-opensearch (>=1.37.0,<1.38.0)"] +opensearchserverless = ["mypy-boto3-opensearchserverless (>=1.37.0,<1.38.0)"] +opsworks = ["mypy-boto3-opsworks (>=1.37.0,<1.38.0)"] +opsworkscm = ["mypy-boto3-opsworkscm (>=1.37.0,<1.38.0)"] +organizations = ["mypy-boto3-organizations (>=1.37.0,<1.38.0)"] +osis = ["mypy-boto3-osis (>=1.37.0,<1.38.0)"] +outposts = ["mypy-boto3-outposts (>=1.37.0,<1.38.0)"] +panorama = ["mypy-boto3-panorama (>=1.37.0,<1.38.0)"] +partnercentral-selling = ["mypy-boto3-partnercentral-selling (>=1.37.0,<1.38.0)"] +payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.37.0,<1.38.0)"] +payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.37.0,<1.38.0)"] +pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.37.0,<1.38.0)"] +pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.37.0,<1.38.0)"] +pcs = ["mypy-boto3-pcs (>=1.37.0,<1.38.0)"] +personalize = ["mypy-boto3-personalize (>=1.37.0,<1.38.0)"] +personalize-events = ["mypy-boto3-personalize-events (>=1.37.0,<1.38.0)"] +personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.37.0,<1.38.0)"] +pi = ["mypy-boto3-pi (>=1.37.0,<1.38.0)"] +pinpoint = ["mypy-boto3-pinpoint (>=1.37.0,<1.38.0)"] +pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.37.0,<1.38.0)"] +pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.37.0,<1.38.0)"] +pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.37.0,<1.38.0)"] +pipes = ["mypy-boto3-pipes (>=1.37.0,<1.38.0)"] +polly = ["mypy-boto3-polly (>=1.37.0,<1.38.0)"] +pricing = ["mypy-boto3-pricing (>=1.37.0,<1.38.0)"] +privatenetworks = ["mypy-boto3-privatenetworks (>=1.37.0,<1.38.0)"] +proton = ["mypy-boto3-proton (>=1.37.0,<1.38.0)"] +qapps = ["mypy-boto3-qapps (>=1.37.0,<1.38.0)"] +qbusiness = ["mypy-boto3-qbusiness (>=1.37.0,<1.38.0)"] +qconnect = ["mypy-boto3-qconnect (>=1.37.0,<1.38.0)"] +qldb = ["mypy-boto3-qldb (>=1.37.0,<1.38.0)"] +qldb-session = ["mypy-boto3-qldb-session (>=1.37.0,<1.38.0)"] +quicksight = ["mypy-boto3-quicksight (>=1.37.0,<1.38.0)"] +ram = ["mypy-boto3-ram (>=1.37.0,<1.38.0)"] +rbin = ["mypy-boto3-rbin (>=1.37.0,<1.38.0)"] +rds = ["mypy-boto3-rds (>=1.37.0,<1.38.0)"] +rds-data = ["mypy-boto3-rds-data (>=1.37.0,<1.38.0)"] +redshift = ["mypy-boto3-redshift (>=1.37.0,<1.38.0)"] +redshift-data = ["mypy-boto3-redshift-data (>=1.37.0,<1.38.0)"] +redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.37.0,<1.38.0)"] +rekognition = ["mypy-boto3-rekognition (>=1.37.0,<1.38.0)"] +repostspace = ["mypy-boto3-repostspace (>=1.37.0,<1.38.0)"] +resiliencehub = ["mypy-boto3-resiliencehub (>=1.37.0,<1.38.0)"] +resource-explorer-2 = ["mypy-boto3-resource-explorer-2 (>=1.37.0,<1.38.0)"] +resource-groups = ["mypy-boto3-resource-groups (>=1.37.0,<1.38.0)"] +resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.37.0,<1.38.0)"] +robomaker = ["mypy-boto3-robomaker (>=1.37.0,<1.38.0)"] +rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.37.0,<1.38.0)"] +route53 = ["mypy-boto3-route53 (>=1.37.0,<1.38.0)"] +route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.37.0,<1.38.0)"] +route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.37.0,<1.38.0)"] +route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.37.0,<1.38.0)"] +route53domains = ["mypy-boto3-route53domains (>=1.37.0,<1.38.0)"] +route53profiles = ["mypy-boto3-route53profiles (>=1.37.0,<1.38.0)"] +route53resolver = ["mypy-boto3-route53resolver (>=1.37.0,<1.38.0)"] +rum = ["mypy-boto3-rum (>=1.37.0,<1.38.0)"] +s3 = ["mypy-boto3-s3 (>=1.37.0,<1.38.0)"] +s3control = ["mypy-boto3-s3control (>=1.37.0,<1.38.0)"] +s3outposts = ["mypy-boto3-s3outposts (>=1.37.0,<1.38.0)"] +s3tables = ["mypy-boto3-s3tables (>=1.37.0,<1.38.0)"] +sagemaker = ["mypy-boto3-sagemaker (>=1.37.0,<1.38.0)"] +sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.37.0,<1.38.0)"] +sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.37.0,<1.38.0)"] +sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.37.0,<1.38.0)"] +sagemaker-geospatial = ["mypy-boto3-sagemaker-geospatial (>=1.37.0,<1.38.0)"] +sagemaker-metrics = ["mypy-boto3-sagemaker-metrics (>=1.37.0,<1.38.0)"] +sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.37.0,<1.38.0)"] +savingsplans = ["mypy-boto3-savingsplans (>=1.37.0,<1.38.0)"] +scheduler = ["mypy-boto3-scheduler (>=1.37.0,<1.38.0)"] +schemas = ["mypy-boto3-schemas (>=1.37.0,<1.38.0)"] +sdb = ["mypy-boto3-sdb (>=1.37.0,<1.38.0)"] +secretsmanager = ["mypy-boto3-secretsmanager (>=1.37.0,<1.38.0)"] +security-ir = ["mypy-boto3-security-ir (>=1.37.0,<1.38.0)"] +securityhub = ["mypy-boto3-securityhub (>=1.37.0,<1.38.0)"] +securitylake = ["mypy-boto3-securitylake (>=1.37.0,<1.38.0)"] +serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.37.0,<1.38.0)"] +service-quotas = ["mypy-boto3-service-quotas (>=1.37.0,<1.38.0)"] +servicecatalog = ["mypy-boto3-servicecatalog (>=1.37.0,<1.38.0)"] +servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.37.0,<1.38.0)"] +servicediscovery = ["mypy-boto3-servicediscovery (>=1.37.0,<1.38.0)"] +ses = ["mypy-boto3-ses (>=1.37.0,<1.38.0)"] +sesv2 = ["mypy-boto3-sesv2 (>=1.37.0,<1.38.0)"] +shield = ["mypy-boto3-shield (>=1.37.0,<1.38.0)"] +signer = ["mypy-boto3-signer (>=1.37.0,<1.38.0)"] +simspaceweaver = ["mypy-boto3-simspaceweaver (>=1.37.0,<1.38.0)"] +sms = ["mypy-boto3-sms (>=1.37.0,<1.38.0)"] +sms-voice = ["mypy-boto3-sms-voice (>=1.37.0,<1.38.0)"] +snow-device-management = ["mypy-boto3-snow-device-management (>=1.37.0,<1.38.0)"] +snowball = ["mypy-boto3-snowball (>=1.37.0,<1.38.0)"] +sns = ["mypy-boto3-sns (>=1.37.0,<1.38.0)"] +socialmessaging = ["mypy-boto3-socialmessaging (>=1.37.0,<1.38.0)"] +sqs = ["mypy-boto3-sqs (>=1.37.0,<1.38.0)"] +ssm = ["mypy-boto3-ssm (>=1.37.0,<1.38.0)"] +ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.37.0,<1.38.0)"] +ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.37.0,<1.38.0)"] +ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.37.0,<1.38.0)"] +ssm-sap = ["mypy-boto3-ssm-sap (>=1.37.0,<1.38.0)"] +sso = ["mypy-boto3-sso (>=1.37.0,<1.38.0)"] +sso-admin = ["mypy-boto3-sso-admin (>=1.37.0,<1.38.0)"] +sso-oidc = ["mypy-boto3-sso-oidc (>=1.37.0,<1.38.0)"] +stepfunctions = ["mypy-boto3-stepfunctions (>=1.37.0,<1.38.0)"] +storagegateway = ["mypy-boto3-storagegateway (>=1.37.0,<1.38.0)"] +sts = ["mypy-boto3-sts (>=1.37.0,<1.38.0)"] +supplychain = ["mypy-boto3-supplychain (>=1.37.0,<1.38.0)"] +support = ["mypy-boto3-support (>=1.37.0,<1.38.0)"] +support-app = ["mypy-boto3-support-app (>=1.37.0,<1.38.0)"] +swf = ["mypy-boto3-swf (>=1.37.0,<1.38.0)"] +synthetics = ["mypy-boto3-synthetics (>=1.37.0,<1.38.0)"] +taxsettings = ["mypy-boto3-taxsettings (>=1.37.0,<1.38.0)"] +textract = ["mypy-boto3-textract (>=1.37.0,<1.38.0)"] +timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.37.0,<1.38.0)"] +timestream-query = ["mypy-boto3-timestream-query (>=1.37.0,<1.38.0)"] +timestream-write = ["mypy-boto3-timestream-write (>=1.37.0,<1.38.0)"] +tnb = ["mypy-boto3-tnb (>=1.37.0,<1.38.0)"] +transcribe = ["mypy-boto3-transcribe (>=1.37.0,<1.38.0)"] +transfer = ["mypy-boto3-transfer (>=1.37.0,<1.38.0)"] +translate = ["mypy-boto3-translate (>=1.37.0,<1.38.0)"] +trustedadvisor = ["mypy-boto3-trustedadvisor (>=1.37.0,<1.38.0)"] +verifiedpermissions = ["mypy-boto3-verifiedpermissions (>=1.37.0,<1.38.0)"] +voice-id = ["mypy-boto3-voice-id (>=1.37.0,<1.38.0)"] +vpc-lattice = ["mypy-boto3-vpc-lattice (>=1.37.0,<1.38.0)"] +waf = ["mypy-boto3-waf (>=1.37.0,<1.38.0)"] +waf-regional = ["mypy-boto3-waf-regional (>=1.37.0,<1.38.0)"] +wafv2 = ["mypy-boto3-wafv2 (>=1.37.0,<1.38.0)"] +wellarchitected = ["mypy-boto3-wellarchitected (>=1.37.0,<1.38.0)"] +wisdom = ["mypy-boto3-wisdom (>=1.37.0,<1.38.0)"] +workdocs = ["mypy-boto3-workdocs (>=1.37.0,<1.38.0)"] +workmail = ["mypy-boto3-workmail (>=1.37.0,<1.38.0)"] +workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.37.0,<1.38.0)"] +workspaces = ["mypy-boto3-workspaces (>=1.37.0,<1.38.0)"] +workspaces-thin-client = ["mypy-boto3-workspaces-thin-client (>=1.37.0,<1.38.0)"] +workspaces-web = ["mypy-boto3-workspaces-web (>=1.37.0,<1.38.0)"] +xray = ["mypy-boto3-xray (>=1.37.0,<1.38.0)"] [[package]] name = "botocore" -version = "1.36.14" +version = "1.37.5" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "botocore-1.36.14-py3-none-any.whl", hash = "sha256:546d0c071e9c8aeaca399d71bec414abe6434460f7d6640cbd92d4b1c3eb443e"}, - {file = "botocore-1.36.14.tar.gz", hash = "sha256:53feff270078c23ba852fb2638fde6c5f74084cfc019dd5433e865cd04065c60"}, + {file = "botocore-1.37.5-py3-none-any.whl", hash = "sha256:e5cfbb8026d5b4fadd9b3a18b61d238a41a8b8f620ab75873dc1467d456150d6"}, + {file = "botocore-1.37.5.tar.gz", hash = "sha256:f8f526d33ae74d242c577e0440b57b9ec7d53edd41db211155ec8087fe7a5a21"}, ] [package.dependencies] @@ -1454,15 +1574,14 @@ crt = ["awscrt (==0.23.8)"] [[package]] name = "botocore-stubs" -version = "1.36.14" +version = "1.37.4" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "botocore_stubs-1.36.14-py3-none-any.whl", hash = "sha256:58f8e6eb37427b7bb81aa24984b10c90d124526b2ba741ebbe7d6e5690454ad0"}, - {file = "botocore_stubs-1.36.14.tar.gz", hash = "sha256:54c7b6fe68d6e2a1eac827b1c0525554509a3481ed6ad5a0f4f2c487e00768d2"}, + {file = "botocore_stubs-1.37.4-py3-none-any.whl", hash = "sha256:29c1fc38cba7686a2b0969dfaab175b0cf3539eed07eac4fbc693437ebe8f9b9"}, + {file = "botocore_stubs-1.37.4.tar.gz", hash = "sha256:f461caf7c3a564b53b9e49352f9b55e1c7a7bf505bc2c9166d9b4a7da831e22c"}, ] [package.dependencies] @@ -1473,38 +1592,62 @@ botocore = ["botocore"] [[package]] name = "cachelib" -version = "0.9.0" +version = "0.13.0" description = "A collection of cache libraries in the same API interface." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, - {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, + {file = "cachelib-0.13.0-py3-none-any.whl", hash = "sha256:8c8019e53b6302967d4e8329a504acf75e7bc46130291d30188a6e4e58162516"}, + {file = "cachelib-0.13.0.tar.gz", hash = "sha256:209d8996e3c57595bee274ff97116d1d73c4980b2fd9a34c7846cd07fd2e1a48"}, ] [[package]] name = "cachetools" -version = "5.5.1" +version = "5.5.2" description = "Extensible memoizing collections and decorators" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] +files = [ + {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, + {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, +] + +[[package]] +name = "cattrs" +version = "24.1.2" +description = "Composable complex class support for attrs and dataclasses." +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, - {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, + {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, + {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, ] +[package.dependencies] +attrs = ">=23.1.0" +exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.4.0)"] +cbor2 = ["cbor2 (>=5.4.6)"] +msgpack = ["msgpack (>=1.0.5)"] +msgspec = ["msgspec (>=0.18.5) ; implementation_name == \"cpython\""] +orjson = ["orjson (>=3.9.2) ; implementation_name == \"cpython\""] +pyyaml = ["pyyaml (>=6.0)"] +tomlkit = ["tomlkit (>=0.11.8)"] +ujson = ["ujson (>=5.7.0)"] + [[package]] name = "certifi" version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -1516,8 +1659,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1598,20 +1740,30 @@ description = "Validate configuration and produce human readable error messages. optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + [[package]] name = "charset-normalizer" version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1713,8 +1865,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1730,7 +1881,6 @@ description = "Click utility functions" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "clickclick-20.10.2-py2.py3-none-any.whl", hash = "sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5"}, {file = "clickclick-20.10.2.tar.gz", hash = "sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c"}, @@ -1746,12 +1896,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "adapters", "dev", "docs"] +groups = ["main", "dev", "docs"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "python_version <= \"3.11\" or python_version >= \"3.12\"", adapters = "python_version <= \"3.11\" or python_version >= \"3.12\"", dev = "python_version <= \"3.11\" or python_version >= \"3.12\"", docs = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"win32\""} +markers = {docs = "sys_platform == \"win32\""} [[package]] name = "colorlog" @@ -1760,7 +1910,6 @@ description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1779,7 +1928,6 @@ description = "Parser like ConfigParser but for updating configuration files" optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "ConfigUpdater-3.2-py2.py3-none-any.whl", hash = "sha256:0f65a041627d7693840b4dd743581db4c441c97195298a29d075f91b79539df2"}, {file = "ConfigUpdater-3.2.tar.gz", hash = "sha256:9fdac53831c1b062929bf398b649b87ca30e7f1a735f3fbf482072804106306b"}, @@ -1795,7 +1943,6 @@ description = "Connexion - API first applications with OpenAPI/Swagger and Flask optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "connexion-2.14.2-py2.py3-none-any.whl", hash = "sha256:a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36"}, {file = "connexion-2.14.2.tar.gz", hash = "sha256:dbc06f52ebeebcf045c9904d570f24377e8bbd5a6521caef15a06f634cf85646"}, @@ -1826,7 +1973,7 @@ description = "Backport of contextlib.chdir stdlib class added in Python3.11." optional = false python-versions = ">=3.6,<4.0" groups = ["main"] -markers = "python_version < \"3.11\"" +markers = "python_version <= \"3.10\"" files = [ {file = "contextlib-chdir-1.0.2.tar.gz", hash = "sha256:58406a71db00647fcccfc7e52e9e04e44d29eacf30400e7c0ba3b15f09d5f3fa"}, {file = "contextlib_chdir-1.0.2-py3-none-any.whl", hash = "sha256:f72f7abd0f87c18a57aee30acf97659ca315157e50bd07e084b8737e0719de3c"}, @@ -1834,82 +1981,82 @@ files = [ [[package]] name = "coverage" -version = "7.6.10" +version = "7.6.12" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, - {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, - {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, - {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, - {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, - {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, - {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, - {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, - {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, - {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, - {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, - {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, - {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, - {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, - {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, - {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, - {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, - {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, - {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, - {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, - {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, - {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, - {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, - {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, - {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, - {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, +files = [ + {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, + {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, + {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, + {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, + {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, + {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, + {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, + {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, + {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, + {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, + {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, + {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, + {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, + {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, + {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, + {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cron-descriptor" @@ -1918,7 +2065,6 @@ description = "A Python library that converts cron expressions into human readab optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "cron_descriptor-1.4.5-py3-none-any.whl", hash = "sha256:736b3ae9d1a99bc3dbfc5b55b5e6e7c12031e7ba5de716625772f8b02dcd6013"}, {file = "cron_descriptor-1.4.5.tar.gz", hash = "sha256:f51ce4ffc1d1f2816939add8524f206c376a42c87a5fca3091ce26725b3b1bca"}, @@ -1934,7 +2080,6 @@ description = "croniter provides iteration for datetime object with cron like fo optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "croniter-6.0.0-py2.py3-none-any.whl", hash = "sha256:2f878c3856f17896979b2a4379ba1f09c83e374931ea15cc835c5dd2eee9b368"}, {file = "croniter-6.0.0.tar.gz", hash = "sha256:37c504b313956114a983ece2c2b07790b1f1094fe9d81cc94739214748255577"}, @@ -1950,8 +2095,8 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] +markers = "python_version < \"3.10\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1995,14 +2140,72 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cryptography" +version = "44.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main", "dev"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"}, + {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"}, + {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"}, + {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"}, + {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"}, + {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"}, + {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "daff" version = "1.3.46" description = "Diff and patch tables" -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "daff-1.3.46.tar.gz", hash = "sha256:22d0da9fd6a3275b54c926a9c97b180f9258aad65113ea18f3fec52cbadcd818"}, ] @@ -2011,10 +2214,9 @@ files = [ name = "db-dtypes" version = "1.4.1" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "db_dtypes-1.4.1-py2.py3-none-any.whl", hash = "sha256:84076e2f952174da3eea16c2692409a0d3ef88d27b68c24ee0c9262513fa26d4"}, {file = "db_dtypes-1.4.1.tar.gz", hash = "sha256:36403e252c03c4a5073f67e4315015c7d1f57b2614f56d2037587e0743670fb8"}, @@ -2028,15 +2230,14 @@ pyarrow = ">=3.0.0" [[package]] name = "dbt-adapters" -version = "1.13.2" +version = "1.14.1" description = "The set of adapter protocols and base functionality that supports integration with dbt-core" -optional = true +optional = false python-versions = ">=3.9.0" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ - {file = "dbt_adapters-1.13.2-py3-none-any.whl", hash = "sha256:4de93e2f9743c39629ff2955cd5589c613b223461543fdbfb31331a6bc3c406e"}, - {file = "dbt_adapters-1.13.2.tar.gz", hash = "sha256:7498c6e8d0a3b14a903564e80b509dbe3c3453acd3b251bf620b551dc1ab1d47"}, + {file = "dbt_adapters-1.14.1-py3-none-any.whl", hash = "sha256:11e480f48b63466ead8ae56698ac7a5541ffc64ec2b0392cec174e8d47b09a7f"}, + {file = "dbt_adapters-1.14.1.tar.gz", hash = "sha256:0ba2325bfdf00f084b635d373f2d89e392be257ca79c47280683a2612882c61b"}, ] [package.dependencies] @@ -2053,8 +2254,8 @@ version = "1.9.1" description = "The Bigquery adapter plugin for dbt" optional = true python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"bigquery\"" files = [ {file = "dbt_bigquery-1.9.1-py3-none-any.whl", hash = "sha256:e2f55050e0b212403701cc21aa2de1829aa724dfbca788db02061acf9be0603f"}, {file = "dbt_bigquery-1.9.1.tar.gz", hash = "sha256:da1c7f1fa7e0a06265881d990e385f5867369529bbebf4b36500db0b3bcd495b"}, @@ -2071,15 +2272,14 @@ google-cloud-storage = ">=2.4,<3.0" [[package]] name = "dbt-common" -version = "1.14.0" +version = "1.15.0" description = "The shared common utilities that dbt-core and adapter implementations use" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ - {file = "dbt_common-1.14.0-py3-none-any.whl", hash = "sha256:239b568a0dd764a431b93cdfe247628622c975f2eed8abf3bc04f4dc770ad161"}, - {file = "dbt_common-1.14.0.tar.gz", hash = "sha256:2227e24a165780c5368320dedd3c6bc40038dedece48af03daab43c11bf20372"}, + {file = "dbt_common-1.15.0-py3-none-any.whl", hash = "sha256:007d245eb796de5fa3b5e9f9304324ad8330db37752f0cbf307b8b93db87a4d3"}, + {file = "dbt_common-1.15.0.tar.gz", hash = "sha256:728fa941591ddf97b5a93460ef2d8e5793a581a51d41a4a185afdb887b65bda9"}, ] [package.dependencies] @@ -2105,10 +2305,9 @@ test = ["hypothesis (>=6.87,<7.0)", "pytest (>=7.3,<8.0)", "pytest-cov (>=4.1,<5 name = "dbt-core" version = "1.9.2" description = "With dbt, data analysts and engineers can build analytics the way engineers build applications." -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "dbt_core-1.9.2-py3-none-any.whl", hash = "sha256:9da00a336910c3279e4deb34febef9ebd7eed847cf8a20452df0439518eb8188"}, {file = "dbt_core-1.9.2.tar.gz", hash = "sha256:c1f2d9cad44c17c366141da2613d07804497d9b063d0045ae57c758743d3b32d"}, @@ -2139,10 +2338,9 @@ typing-extensions = ">=4.4" name = "dbt-extractor" version = "0.5.1" description = "A tool to analyze and extract information from Jinja used in dbt projects." -optional = true +optional = false python-versions = ">=3.6.1" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "dbt_extractor-0.5.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3b91e6106b967d908b34f83929d3f50ee2b498876a1be9c055fe060ed728c556"}, {file = "dbt_extractor-0.5.1-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3614ce9f83ae4cd0dc95f77730034a793a1c090a52dcf698ba1c94050afe3a8b"}, @@ -2168,8 +2366,8 @@ version = "1.9.0" description = "The set of adapter protocols and base functionality that supports integration with dbt-core" optional = true python-versions = ">=3.9.0" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"redshift\" or extra == \"postgres\"" files = [ {file = "dbt_postgres-1.9.0-py3-none-any.whl", hash = "sha256:c85d1adb419251ac989e5f720fdbb964aa6c280da7739dc8c48d44e6f45d354a"}, {file = "dbt_postgres-1.9.0.tar.gz", hash = "sha256:b0574e9e1e66d8a5cd627b1d464ec0278eef7342f0b5babe4f987eee9d02a143"}, @@ -2188,8 +2386,8 @@ version = "1.9.0" description = "The Redshift adapter plugin for dbt" optional = true python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"redshift\"" files = [ {file = "dbt_redshift-1.9.0-py3-none-any.whl", hash = "sha256:ec39d1002bea7c1abbcb140855e3e68f3d9c10b75a121e232f2c12d5bdd47656"}, {file = "dbt_redshift-1.9.0.tar.gz", hash = "sha256:63a47a36da99142b67ff4d0d31b6a290f27b677465917bb921b2e400435076e8"}, @@ -2208,10 +2406,9 @@ sqlparse = ">=0.5.0,<0.6.0" name = "dbt-semantic-interfaces" version = "0.7.4" description = "The shared semantic layer definitions that dbt-core and MetricFlow use" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "dbt_semantic_interfaces-0.7.4-py3-none-any.whl", hash = "sha256:63965478ef27056f20a8c9a0f59b1355ebbc15133c1a6f0d368d93996a31dd5d"}, {file = "dbt_semantic_interfaces-0.7.4.tar.gz", hash = "sha256:dcedda6702ecabb633aa4e8ab3b1eb7f9c4301dcc0026076a4a0ef64f9e59cf0"}, @@ -2230,15 +2427,15 @@ typing-extensions = ">=4.4,<5" [[package]] name = "dbt-snowflake" -version = "1.9.0" +version = "1.9.1" description = "The Snowflake adapter plugin for dbt" optional = true python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ - {file = "dbt_snowflake-1.9.0-py3-none-any.whl", hash = "sha256:bd1778a8d0108aadaeee9d155e0ab9695a740e06480c69103a65b533eb6eada4"}, - {file = "dbt_snowflake-1.9.0.tar.gz", hash = "sha256:70ad763e334119fb7af96a924f6a2c67a873ffc1c4f5a4723b7948825c4de399"}, + {file = "dbt_snowflake-1.9.1-py3-none-any.whl", hash = "sha256:2d26bcc6521ad6d98ebcd95028b58071cee34772e863fa4bfc19a6fb74fa1282"}, + {file = "dbt_snowflake-1.9.1.tar.gz", hash = "sha256:b41a10868ba81d105304b71b45f09a10cdc166ec20088031efb5190542297272"}, ] [package.dependencies] @@ -2250,22 +2447,26 @@ snowflake-connector-python = {version = ">=3.0,<4.0", extras = ["secure-local-st [[package]] name = "dbt-spark" -version = "1.9.0" +version = "1.9.1" description = "The Apache Spark adapter plugin for dbt" optional = true python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"spark\"" files = [ - {file = "dbt_spark-1.9.0-py3-none-any.whl", hash = "sha256:f0c945638ac14697b9483de55a70d87a1d41998cc75e7dcecb55cee3f6df6c1b"}, - {file = "dbt_spark-1.9.0.tar.gz", hash = "sha256:fb81fb1d778433789e9d1ec44a8919b39fb8858be25f3af29ed05e144259f5e3"}, + {file = "dbt_spark-1.9.1-py3-none-any.whl", hash = "sha256:678c5be7f3756b77880b19c990375029232f33535a35c31d54af54a354fd3cb1"}, + {file = "dbt_spark-1.9.1.tar.gz", hash = "sha256:b21c017bce6c2fb9a25848f33a02ed0ea1b6170d416e3b0389e55e755a8aae2d"}, ] [package.dependencies] dbt-adapters = ">=1.7,<2.0" dbt-common = ">=1.10,<2.0" dbt-core = ">=1.8.0" +PyHive = {version = ">=0.7.0,<0.8.0", extras = ["hive-pure-sasl"], optional = true, markers = "extra == \"all\""} +pyodbc = {version = ">=5.1.0,<5.2.0", optional = true, markers = "extra == \"all\""} +pyspark = {version = ">=3.0.0,<4.0.0", optional = true, markers = "extra == \"all\""} sqlparams = ">=3.0.0" +thrift = {version = ">=0.11.0,<0.17.0", optional = true, markers = "extra == \"all\""} [package.extras] all = ["PyHive[hive-pure-sasl] (>=0.7.0,<0.8.0)", "pyodbc (>=5.1.0,<5.2.0)", "pyspark (>=3.0.0,<4.0.0)", "thrift (>=0.11.0,<0.17.0)"] @@ -2273,14 +2474,25 @@ odbc = ["pyodbc (>=5.1.0,<5.2.0)"] pyhive = ["PyHive[hive-pure-sasl] (>=0.7.0,<0.8.0)", "thrift (>=0.11.0,<0.17.0)"] session = ["pyspark (>=3.0.0,<4.0.0)"] +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + [[package]] name = "deepdiff" version = "7.0.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "deepdiff-7.0.1-py3-none-any.whl", hash = "sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3"}, {file = "deepdiff-7.0.1.tar.gz", hash = "sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf"}, @@ -2300,7 +2512,6 @@ description = "Python @deprecated decorator to deprecate old python classes, fun optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -2310,7 +2521,7 @@ files = [ wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"] [[package]] name = "dill" @@ -2319,7 +2530,6 @@ description = "serialize all of Python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -2336,7 +2546,6 @@ description = "Distribution utilities" optional = false python-versions = "*" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -2349,7 +2558,6 @@ description = "DNS toolkit" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, @@ -2364,6 +2572,18 @@ idna = ["idna (>=3.7)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] +[[package]] +name = "docstring-parser" +version = "0.16" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.6,<4.0" +groups = ["main", "dev"] +files = [ + {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, + {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, +] + [[package]] name = "docutils" version = "0.21.2" @@ -2371,7 +2591,6 @@ description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" groups = ["dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -2379,62 +2598,66 @@ files = [ [[package]] name = "dulwich" -version = "0.22.7" +version = "0.22.8" description = "Python Git Library" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "dulwich-0.22.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01e484d44014fef78cdef3b3adc34564808b4677497a57a0950c90a1d6349be3"}, - {file = "dulwich-0.22.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb258c62d7fb4cfe03b3fba09f702ebb84a924f2f004833435e32c93fe8a7f13"}, - {file = "dulwich-0.22.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdbd087e9e99bc809b15864ebc79dbefe869e3038b64c953d7736f6e6b382dc7"}, - {file = "dulwich-0.22.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c830d63c691b5f979964a2d6b325930b7a53f14836598352690601cd205f04b"}, - {file = "dulwich-0.22.7-cp310-cp310-win32.whl", hash = "sha256:925cec97aeefda3f950e45e8d4c247e4ce6f83b6ee96e383c82f9bced626151f"}, - {file = "dulwich-0.22.7-cp310-cp310-win_amd64.whl", hash = "sha256:f73668ecc29e0a20d20970489fffe2ba466e5486eae2f20104bc38bcbe611f64"}, - {file = "dulwich-0.22.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:df5a179e5d95ac0263b5e0ccd53311eac486091979dcac106c5cc9e0ee4f2aa2"}, - {file = "dulwich-0.22.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca7ed207956001e6a8a2e3f319cdc37591e53f7eb04aedafa78f96768048c53e"}, - {file = "dulwich-0.22.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:052715452b729544c611a107b2eef6111e527f041c1b666f8ed36c04e39c36b5"}, - {file = "dulwich-0.22.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b7cf6f0d46ac777be617dad7c1b992380004de74c0e0652bed174686249f34"}, - {file = "dulwich-0.22.7-cp311-cp311-win32.whl", hash = "sha256:5b9806a75f4b74fa891926b1d830e21f9cead80ed6dd803ed668369b26fb8b5f"}, - {file = "dulwich-0.22.7-cp311-cp311-win_amd64.whl", hash = "sha256:01544915c4056d0820de8cf126b971f7c180743ff64c4435c89168e44b30df4b"}, - {file = "dulwich-0.22.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b7a3ac4baa49bd988cc0d0891a93aa26307c01f35caeed8729b7928a1f483af"}, - {file = "dulwich-0.22.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d72ce1377eac23bd77aa3541ceb91f2d8bd68687659f8625af8301f0b6b0a63"}, - {file = "dulwich-0.22.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bda2eca0847c30a9312a72f219af9e63feb7d2ca89f47fdaa240b0d0cdd6b84"}, - {file = "dulwich-0.22.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8886b2c9750ba15193356d9e8608e031cd89a780d0afc53b3101391605b3793"}, - {file = "dulwich-0.22.7-cp312-cp312-win32.whl", hash = "sha256:1782854c10878b5cb8423e74b0ef4256c3667f7b0266513af028ac28dbab1f2d"}, - {file = "dulwich-0.22.7-cp312-cp312-win_amd64.whl", hash = "sha256:fe324dc40b93e8be996c9fa9291a439bef835a92a2e4cb5c8cbdb1171c168fd6"}, - {file = "dulwich-0.22.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2220c8b7cac5794e2260a924e81b05baa7836c18ba805d5a6731071a5ff6b860"}, - {file = "dulwich-0.22.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cbd5ecbc95e18c745965fc7b2b71209443987a99e499c7bb074234d7c6142e2"}, - {file = "dulwich-0.22.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f418779837a3249b7dfc4b3dc7266fa40687e5f0249eedfa7185560ba1ee148"}, - {file = "dulwich-0.22.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c01db2ef6d5f5b9192c0011624701b0de328868fe0c32601368cd337e77cd1a"}, - {file = "dulwich-0.22.7-cp313-cp313-win32.whl", hash = "sha256:a64e61fa6ab60db0f897f1c30f32b26b330d3a9dc264f089ee9c44f5900fb657"}, - {file = "dulwich-0.22.7-cp313-cp313-win_amd64.whl", hash = "sha256:9f5954cd491313743d7bd3623d323b72afceb83d2c2a47921f621bdd9d4c615b"}, - {file = "dulwich-0.22.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6bea11b98e854ff2abec390eeac752586b83921a22091dae65470ccbb003fc1b"}, - {file = "dulwich-0.22.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbcf206d4b1e5ba2affc6189948cb292cc647593876b96a0b71db44e79a05a1"}, - {file = "dulwich-0.22.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0bb9afa799c0301b2760e9af99083a2b08f655c55037945b6a5e227566adc1"}, - {file = "dulwich-0.22.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62027dfccee97268eadf0c54df3d72ce30e4402cf5cf06c021e474b9a9eb3536"}, - {file = "dulwich-0.22.7-cp39-cp39-win32.whl", hash = "sha256:637a9ac27512b8c04e6a29bf92e3f73386cd85dfe8609f523ffbc96e659bde4b"}, - {file = "dulwich-0.22.7-cp39-cp39-win_amd64.whl", hash = "sha256:986943e27a5c94c0be42fdcc688be1ae1a1349a3dbaa773fa7f9bdada1232b68"}, - {file = "dulwich-0.22.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b25848041c51d09affafd2708236205cc4483bed8f7f43ecbe63b6a66b447604"}, - {file = "dulwich-0.22.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b20bd6a25658e968e813eb69164332d3a2ab6029b51d3c6af8b64f2471847a"}, - {file = "dulwich-0.22.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68ab3540809bedcdd9b99e51c12adf11c2ab26554f74d899d8cf55bfa2639a6"}, - {file = "dulwich-0.22.7-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:257abd49a768a52cf7f508daf2d30fe73f54fd32b7a674abd43817f66b0ca17b"}, - {file = "dulwich-0.22.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dd5df3919c648887e550e836f87b4b83f1429876adce5ead5b5977e333c874d"}, - {file = "dulwich-0.22.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5ada6a2fd400a4f51adfedd0267bfb08c61e2d9846c18ea653b0eb88a7b851d0"}, - {file = "dulwich-0.22.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007d8160b511bb149d31c08548307982f6ce752a46e7088b020517de00c3bd46"}, - {file = "dulwich-0.22.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40260034a6ecc3141a0d42360e888a73e58b9c0c9363c454cae182957fe602ac"}, - {file = "dulwich-0.22.7-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:753eec461434f0ccbe0956ec825250e12230e8f1b365c8be1604386d94c2d8d0"}, - {file = "dulwich-0.22.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7649f0c9b4760d72768805155e66579761f282fdca123e351019c85efce811eb"}, - {file = "dulwich-0.22.7-py3-none-any.whl", hash = "sha256:10c5ee20430714ea6a79dde22c1f77078848930d27021aa810204738bc175e95"}, - {file = "dulwich-0.22.7.tar.gz", hash = "sha256:d53935832dd182d4c1415042187093efcee988af5cd397fb1f394f5bb27f0707"}, +files = [ + {file = "dulwich-0.22.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546176d18b8cc0a492b0f23f07411e38686024cffa7e9d097ae20512a2e57127"}, + {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d2434dd72b2ae09b653c9cfe6764a03c25cfbd99fbbb7c426f0478f6fb1100f"}, + {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8318bc0921d42e3e69f03716f983a301b5ee4c8dc23c7f2c5bbb28581257a9"}, + {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7a0f96a2a87f3b4f7feae79d2ac6b94107d6b7d827ac08f2f331b88c8f597a1"}, + {file = "dulwich-0.22.8-cp310-cp310-win32.whl", hash = "sha256:432a37b25733202897b8d67cdd641688444d980167c356ef4e4dd15a17a39a24"}, + {file = "dulwich-0.22.8-cp310-cp310-win_amd64.whl", hash = "sha256:f3a15e58dac8b8a76073ddca34e014f66f3672a5540a99d49ef6a9c09ab21285"}, + {file = "dulwich-0.22.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0852edc51cff4f4f62976bdaa1d82f6ef248356c681c764c0feb699bc17d5782"}, + {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:826aae8b64ac1a12321d6b272fc13934d8f62804fda2bc6ae46f93f4380798eb"}, + {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ae726f923057d36cdbb9f4fb7da0d0903751435934648b13f1b851f0e38ea1"}, + {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6987d753227f55cf75ba29a8dab69d1d83308ce483d7a8c6d223086f7a42e125"}, + {file = "dulwich-0.22.8-cp311-cp311-win32.whl", hash = "sha256:7757b4a2aad64c6f1920082fc1fccf4da25c3923a0ae7b242c08d06861dae6e1"}, + {file = "dulwich-0.22.8-cp311-cp311-win_amd64.whl", hash = "sha256:12b243b7e912011c7225dc67480c313ac8d2990744789b876016fb593f6f3e19"}, + {file = "dulwich-0.22.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d81697f74f50f008bb221ab5045595f8a3b87c0de2c86aa55be42ba97421f3cd"}, + {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bff1da8e2e6a607c3cb45f5c2e652739589fe891245e1d5b770330cdecbde41"}, + {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9969099e15b939d3936f8bee8459eaef7ef5a86cd6173393a17fe28ca3d38aff"}, + {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:017152c51b9a613f0698db28c67cf3e0a89392d28050dbf4f4ac3f657ea4c0dc"}, + {file = "dulwich-0.22.8-cp312-cp312-win32.whl", hash = "sha256:ee70e8bb8798b503f81b53f7a103cb869c8e89141db9005909f79ab1506e26e9"}, + {file = "dulwich-0.22.8-cp312-cp312-win_amd64.whl", hash = "sha256:dc89c6f14dcdcbfee200b0557c59ae243835e42720be143526d834d0e53ed3af"}, + {file = "dulwich-0.22.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbade3342376be1cd2409539fe1b901d2d57a531106bbae204da921ef4456a74"}, + {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71420ffb6deebc59b2ce875e63d814509f9c1dc89c76db962d547aebf15670c7"}, + {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a626adbfac44646a125618266a24133763bdc992bf8bd0702910d67e6b994443"}, + {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f1476c9c4e4ede95714d06c4831883a26680e37b040b8b6230f506e5ba39f51"}, + {file = "dulwich-0.22.8-cp313-cp313-win32.whl", hash = "sha256:b2b31913932bb5bd41658dd398b33b1a2d4d34825123ad54e40912cfdfe60003"}, + {file = "dulwich-0.22.8-cp313-cp313-win_amd64.whl", hash = "sha256:7a44e5a61a7989aca1e301d39cfb62ad2f8853368682f524d6e878b4115d823d"}, + {file = "dulwich-0.22.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9cd0c67fb44a38358b9fcabee948bf11044ef6ce7a129e50962f54c176d084e"}, + {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b79b94726c3f4a9e5a830c649376fd0963236e73142a4290bac6bc9fc9cb120"}, + {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16bbe483d663944972e22d64e1f191201123c3b5580fbdaac6a4f66bfaa4fc11"}, + {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e02d403af23d93dc1f96eb2408e25efd50046e38590a88c86fa4002adc9849b0"}, + {file = "dulwich-0.22.8-cp39-cp39-win32.whl", hash = "sha256:8bdd9543a77fb01be704377f5e634b71f955fec64caa4a493dc3bfb98e3a986e"}, + {file = "dulwich-0.22.8-cp39-cp39-win_amd64.whl", hash = "sha256:3b6757c6b3ba98212b854a766a4157b9cb79a06f4e1b06b46dec4bd834945b8e"}, + {file = "dulwich-0.22.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7bb18fa09daa1586c1040b3e2777d38d4212a5cdbe47d384ba66a1ac336fcc4c"}, + {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2fda8e87907ed304d4a5962aea0338366144df0df60f950b8f7f125871707f"}, + {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1748cd573a0aee4d530bc223a23ccb8bb5b319645931a37bd1cfb68933b720c1"}, + {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a631b2309feb9a9631eabd896612ba36532e3ffedccace57f183bb868d7afc06"}, + {file = "dulwich-0.22.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:00e7d9a3d324f9e0a1b27880eec0e8e276ff76519621b66c1a429ca9eb3f5a8d"}, + {file = "dulwich-0.22.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f8aa3de93201f9e3e40198725389aa9554a4ee3318a865f96a8e9bc9080f0b25"}, + {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e8da9dd8135884975f5be0563ede02179240250e11f11942801ae31ac293f37"}, + {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fc5ce2435fb3abdf76f1acabe48f2e4b3f7428232cadaef9daaf50ea7fa30ee"}, + {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982b21cc3100d959232cadb3da0a478bd549814dd937104ea50f43694ec27153"}, + {file = "dulwich-0.22.8-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6bde2b13a05cc0ec2ecd4597a99896663544c40af1466121f4d046119b874ce3"}, + {file = "dulwich-0.22.8-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6d446cb7d272a151934ad4b48ba691f32486d5267cf2de04ee3b5e05fc865326"}, + {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f6338e6cf95cd76a0191b3637dc3caed1f988ae84d8e75f876d5cd75a8dd81a"}, + {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e004fc532ea262f2d5f375068101ca4792becb9d4aa663b050f5ac31fda0bb5c"}, + {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bfdbc6fa477dee00d04e22d43a51571cd820cfaaaa886f0f155b8e29b3e3d45"}, + {file = "dulwich-0.22.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ae900c8e573f79d714c1d22b02cdadd50b64286dd7203028f0200f82089e4950"}, + {file = "dulwich-0.22.8-py3-none-any.whl", hash = "sha256:ffc7a02e62b72884de58baaa3b898b7f6427893e79b1289ffa075092efe59181"}, + {file = "dulwich-0.22.8.tar.gz", hash = "sha256:701547310415de300269331abe29cb5717aa1ea377af826bf513d0adfb1c209b"}, ] [package.dependencies] urllib3 = ">=1.25" [package.extras] -dev = ["mypy (==1.13.0)", "ruff (==0.8.3)"] +dev = ["mypy (==1.15.0)", "ruff (==0.9.7)"] fastimport = ["fastimport"] https = ["urllib3 (>=1.24.1)"] paramiko = ["paramiko"] @@ -2447,7 +2670,6 @@ description = "A robust email address syntax and deliverability validation libra optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, @@ -2480,7 +2702,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version < \"3.11\"" +markers = "python_version <= \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -2495,17 +2717,17 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, ] +markers = {main = "extra == \"adapters\" or extra == \"snowflake\""} [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "flask" @@ -2514,7 +2736,6 @@ description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, @@ -2533,15 +2754,14 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-appbuilder" -version = "4.5.2" +version = "4.5.3" description = "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more." optional = false python-versions = "~=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "Flask-AppBuilder-4.5.2.tar.gz", hash = "sha256:a2242386a7f77df7020654b4d546a9dbac105058d2cd058b7fd9b1db457c2f32"}, - {file = "Flask_AppBuilder-4.5.2-py3-none-any.whl", hash = "sha256:4962a73eafb62b8790fc425970a2f09727974bcff31a1ded0c9eaa8d50b32580"}, + {file = "Flask-AppBuilder-4.5.3.tar.gz", hash = "sha256:2f3f953b8134bed02ed0236ab7e85e6c354b1b3680069d76dfadc017eb05c561"}, + {file = "Flask_AppBuilder-4.5.3-py3-none-any.whl", hash = "sha256:9223db6c43939f8646fc6458d949ea4d5de182e8455bdfb0010bb37359d96ccf"}, ] [package.dependencies] @@ -2580,7 +2800,6 @@ description = "Adds i18n/l10n support to Flask applications" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask-Babel-2.0.0.tar.gz", hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d"}, {file = "Flask_Babel-2.0.0-py3-none-any.whl", hash = "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"}, @@ -2597,19 +2816,18 @@ dev = ["Pallets-Sphinx-Themes", "bumpversion", "ghp-import", "pytest", "pytest-m [[package]] name = "flask-caching" -version = "2.3.0" +version = "2.3.1" description = "Adds caching support to Flask applications." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "Flask_Caching-2.3.0-py3-none-any.whl", hash = "sha256:51771c75682e5abc1483b78b96d9131d7941dc669b073852edfa319dd4e29b6e"}, - {file = "flask_caching-2.3.0.tar.gz", hash = "sha256:d7e4ca64a33b49feb339fcdd17e6ba25f5e01168cf885e53790e885f83a4d2cf"}, + {file = "Flask_Caching-2.3.1-py3-none-any.whl", hash = "sha256:d3efcf600e5925ea5a2fcb810f13b341ae984f5b52c00e9d9070392f3ca10761"}, + {file = "flask_caching-2.3.1.tar.gz", hash = "sha256:65d7fd1b4eebf810f844de7de6258254b3248296ee429bdcb3f741bcbf7b98c9"}, ] [package.dependencies] -cachelib = ">=0.9.0,<0.10.0" +cachelib = ">=0.9.0" Flask = "*" [[package]] @@ -2619,7 +2837,6 @@ description = "Extended JWT integration with Flask" optional = false python-versions = "<4,>=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask_JWT_Extended-4.7.1-py2.py3-none-any.whl", hash = "sha256:52f35bf0985354d7fb7b876e2eb0e0b141aaff865a22ff6cc33d9a18aa987978"}, {file = "flask_jwt_extended-4.7.1.tar.gz", hash = "sha256:8085d6757505b6f3291a2638c84d207e8f0ad0de662d1f46aa2f77e658a0c976"}, @@ -2640,7 +2857,6 @@ description = "Rate limiting for flask applications" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask_Limiter-3.10.1-py3-none-any.whl", hash = "sha256:afa3bfa9854dd2d3267816fcfcdfa91bcadf055acc4d2461119a2670306fbccb"}, {file = "flask_limiter-3.10.1.tar.gz", hash = "sha256:5ff8395f2acbc565ba6af43dc4b9c5b0a3665989681791d01dfaa6388bb332c6"}, @@ -2665,7 +2881,6 @@ description = "User authentication and session management for Flask." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, @@ -2682,7 +2897,6 @@ description = "Server-side session support for Flask" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask-Session-0.5.0.tar.gz", hash = "sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86"}, {file = "flask_session-0.5.0-py3-none-any.whl", hash = "sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631"}, @@ -2699,7 +2913,6 @@ description = "Adds SQLAlchemy support to your Flask application." optional = false python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, @@ -2716,7 +2929,6 @@ description = "Form rendering, validation, and CSRF protection for Flask with WT optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "flask_wtf-1.2.2-py3-none-any.whl", hash = "sha256:e93160c5c5b6b571cf99300b6e01b72f9a101027cab1579901f8b10c5daf0b70"}, {file = "flask_wtf-1.2.2.tar.gz", hash = "sha256:79d2ee1e436cf570bccb7d916533fa18757a2f18c290accffab1b9a0b684666b"}, @@ -2737,7 +2949,6 @@ description = "Let your Python tests travel through time" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, @@ -2753,7 +2964,6 @@ description = "A list-like structure which implements collections.abc.MutableSeq optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -2856,7 +3066,6 @@ description = "File-system specification" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"}, {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"}, @@ -2890,14 +3099,146 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] +[[package]] +name = "future" +version = "1.0.0" +description = "Clean single-source support for Python 3 and 2" +optional = true +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, +] + +[[package]] +name = "gcloud-aio-auth" +version = "5.3.2" +description = "Python Client for Google Cloud Auth" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main", "dev"] +files = [ + {file = "gcloud_aio_auth-5.3.2-py3-none-any.whl", hash = "sha256:78b318ca90228df5f0883d36215e8f102daeb7c08aa09ba6e857a5e6ca3cf321"}, + {file = "gcloud_aio_auth-5.3.2.tar.gz", hash = "sha256:860a79de6f1a692b5fadcf27e4243d4128fa81823f177aeff926eba00b5c2255"}, +] + +[package.dependencies] +aiohttp = ">=3.9.0,<4.0.0" +backoff = ">=1.0.0,<3.0.0" +chardet = ">=2.0,<6.0" +cryptography = ">=2.0.0,<45.0.0" +pyjwt = ">=1.5.3,<3.0.0" + +[[package]] +name = "gcloud-aio-bigquery" +version = "7.1.0" +description = "Python Client for Google Cloud BigQuery" +optional = false +python-versions = ">=3.8,<4.0" +groups = ["main", "dev"] +files = [ + {file = "gcloud_aio_bigquery-7.1.0-py3-none-any.whl", hash = "sha256:524ae3cc14c1af6977a358829cc673b4471159caa7d62bba7f2d9334262bcd4a"}, + {file = "gcloud_aio_bigquery-7.1.0.tar.gz", hash = "sha256:4a3c775c2677c0588e9caeb2df40d81a54b31c174e562a527cb08e023c4408a3"}, +] + +[package.dependencies] +gcloud-aio-auth = ">=3.1.0,<6.0.0" + +[[package]] +name = "gcloud-aio-storage" +version = "9.3.0" +description = "Python Client for Google Cloud Storage" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main", "dev"] +files = [ + {file = "gcloud_aio_storage-9.3.0-py3-none-any.whl", hash = "sha256:2ef9bd22eb3545a912a495b551aa58c1c2a177e72e4ed03a64665fceb02cf650"}, + {file = "gcloud_aio_storage-9.3.0.tar.gz", hash = "sha256:23664a36b2c3ff9135035b3e9bcf512e0a0c17b874e305985098f000de4de399"}, +] + +[package.dependencies] +aiofiles = ">=0.6.0,<24.0.0" +gcloud-aio-auth = ">=5.3.0,<6.0.0" +pyasn1-modules = ">=0.2.1,<0.4.1" +rsa = ">=3.1.4,<5.0.0" + +[[package]] +name = "gcsfs" +version = "2025.2.0" +description = "Convenient Filesystem interface over GCS" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "gcsfs-2025.2.0-py2.py3-none-any.whl", hash = "sha256:293fc0bd40402f954b2f3edc7289116ece3995525abc04473834fcdd3f220bd9"}, + {file = "gcsfs-2025.2.0.tar.gz", hash = "sha256:1013b3f1213d867fffc732dbf1d963127dfa6e5e863f8077696b892696b3e3d9"}, +] + +[package.dependencies] +aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" +decorator = ">4.1.2" +fsspec = "2025.2.0" +google-auth = ">=1.2" +google-auth-oauthlib = "*" +google-cloud-storage = "*" +requests = "*" + +[package.extras] +crc = ["crcmod"] +gcsfuse = ["fusepy"] + +[[package]] +name = "google-ads" +version = "25.2.0" +description = "Client library for the Google Ads API" +optional = false +python-versions = "<3.13,>=3.8" +groups = ["main", "dev"] +files = [ + {file = "google_ads-25.2.0-py3-none-any.whl", hash = "sha256:2aa5dde2743736c6ec5ddaa1b092ce6b180b28ddcb0cd3460eebb53b40ce2701"}, + {file = "google_ads-25.2.0.tar.gz", hash = "sha256:ddcd1f910d96bc6200b93b3ee9cbef1e4ea37806128c48e9453df34a222999ce"}, +] + +[package.dependencies] +google-api-core = ">=2.13.0,<=3.0.0" +google-auth-oauthlib = ">=0.3.0,<2.0.0" +googleapis-common-protos = ">=1.56.3,<2.0.0" +grpcio = ">=1.59.0,<2.0.0" +grpcio-status = ">=1.59.0,<2.0.0" +proto-plus = ">=1.22.3,<2.0.0" +protobuf = ">=4.25.0,<6.0.0" +PyYAML = ">=5.1,<7.0" + +[package.extras] +tests = ["nox (>=2020.12.31,<2022.6)"] + +[[package]] +name = "google-analytics-admin" +version = "0.23.4" +description = "Google Analytics Admin API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_analytics_admin-0.23.4-py2.py3-none-any.whl", hash = "sha256:67892c0f6e8b68b19e7f5f6fa1575ec43db1867163f55d58ac45c56af6e6b293"}, + {file = "google_analytics_admin-0.23.4.tar.gz", hash = "sha256:bc1ed7607df95cdc6fef579122a0114c4373fa89386c103e236025131fbb9605"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + [[package]] name = "google-api-core" version = "2.24.1" description = "Google API client core library" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "google_api_core-2.24.1-py3-none-any.whl", hash = "sha256:bc78d608f5a5bf853b80bd70a795f703294de656c096c0968320830a4bc280f1"}, {file = "google_api_core-2.24.1.tar.gz", hash = "sha256:f8b36f5456ab0dd99a1b693a40a31d1e7757beea380ad1b38faaf8941eae9d8a"}, @@ -2907,11 +3248,11 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" @@ -2920,18 +3261,36 @@ requests = ">=2.18.0,<3.0.0.dev0" [package.extras] async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0) ; python_version >= \"3.11\""] grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +[[package]] +name = "google-api-python-client" +version = "2.162.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_api_python_client-2.162.0-py2.py3-none-any.whl", hash = "sha256:49365fa4f7795fe81a747f5544d6528ea94314fa59664e0ea1005f603facf1ec"}, + {file = "google_api_python_client-2.162.0.tar.gz", hash = "sha256:5f8bc934a5b6eea73a7d12d999e6585c1823179f48340234acb385e2502e735a"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + [[package]] name = "google-auth" version = "2.38.0" description = "Google Authentication Library" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, @@ -2951,26 +3310,217 @@ reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] -name = "google-cloud-bigquery" -version = "3.29.0" -description = "Google BigQuery API client library" -optional = true -python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = "*" +groups = ["main", "dev"] files = [ - {file = "google_cloud_bigquery-3.29.0-py2.py3-none-any.whl", hash = "sha256:5453a4eabe50118254eda9778f3d7dad413490de5f7046b5e66c98f5a1580308"}, - {file = "google_cloud_bigquery-3.29.0.tar.gz", hash = "sha256:fafc2b455ffce3bcc6ce0e884184ef50b6a11350a83b91e327fadda4d5566e72"}, + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, ] [package.dependencies] -db-dtypes = {version = ">=0.3.0,<2.0.0dev", optional = true, markers = "extra == \"pandas\""} -google-api-core = {version = ">=2.11.1,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" -google-cloud-core = ">=2.4.1,<3.0.0dev" -google-resumable-media = ">=2.0.0,<3.0dev" +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-auth-oauthlib" +version = "1.2.1" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "google_auth_oauthlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:2d58a27262d55aa1b87678c3ba7142a080098cbc2024f903c62355deb235d91f"}, + {file = "google_auth_oauthlib-1.2.1.tar.gz", hash = "sha256:afd0cad092a2eaa53cd8e8298557d6de1034c6cb4a740500b5357b648af97263"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-cloud-aiplatform" +version = "1.82.0" +description = "Vertex AI API client library" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_aiplatform-1.82.0-py2.py3-none-any.whl", hash = "sha256:13368a961b2bfa8f46ccd10371bb19bd5f946d8f29c411726061ed1a140ce890"}, + {file = "google_cloud_aiplatform-1.82.0.tar.gz", hash = "sha256:b7ea7379249cc1821aa46300a16e4b15aa64aa22665e2536b2bcb7e473d7438e"}, +] + +[package.dependencies] +docstring-parser = "<1" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0dev" +google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" +google-cloud-storage = ">=1.32.0,<3.0.0dev" +packaging = ">=14.3" +pandas = {version = ">=1.0.0", optional = true, markers = "extra == \"evaluation\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +pydantic = "<3" +scikit-learn = [ + {version = "<1.6.0", optional = true, markers = "python_version <= \"3.10\" and extra == \"evaluation\""}, + {version = "*", optional = true, markers = "python_version > \"3.10\" and extra == \"evaluation\""}, +] +shapely = "<3.0.0dev" +tqdm = {version = ">=4.23.0", optional = true, markers = "extra == \"evaluation\""} +typing-extensions = "*" + +[package.extras] +ag2 = ["ag2[gemini]"] +ag2-testing = ["absl-py", "ag2[gemini]", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "typing-extensions"] +agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "packaging (>=24.0)", "pydantic (>=2.10,<3)", "typing-extensions"] +autologging = ["mlflow (>=1.27.0,<=2.16.0)"] +cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +datasets = ["pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0dev) ; python_version < \"3.11\""] +endpoint = ["requests (>=2.28.1)"] +evaluation = ["pandas (>=1.0.0)", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "tqdm (>=4.23.0)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.114.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.16.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0dev) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || >=2.33.dev0,<=2.33.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.33.0) ; python_version == \"3.11\"", "requests (>=2.28.1)", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev) ; python_version <= \"3.11\"", "tensorflow (>=2.4.0,<3.0.0dev)", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] +langchain = ["langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2,<3)", "langgraph (>=0.2.45,<0.3)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] +langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2,<3)", "langgraph (>=0.2.45,<0.3)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "typing-extensions"] +lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] +metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] +pipelines = ["pyyaml (>=5.3.1,<7)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.114.0)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || >=2.33.dev0,<=2.33.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.33.0) ; python_version == \"3.11\"", "setuptools (<70.0.0)"] +ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || >=2.33.dev0,<=2.33.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.33.0) ; python_version == \"3.11\"", "ray[train]", "scikit-learn (<1.6.0)", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] +reasoningengine = ["cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "typing-extensions"] +tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0dev) ; python_version <= \"3.11\"", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +testing = ["aiohttp", "bigframes ; python_version >= \"3.10\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.114.0)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.16.0)", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0dev) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || >=2.33.dev0,<=2.33.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.33.0) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.13.0) ; python_version <= \"3.11\"", "tensorflow (==2.16.1) ; python_version > \"3.11\"", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev) ; python_version <= \"3.11\"", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +tokenization = ["sentencepiece (>=0.2.0)"] +vizier = ["google-vizier (>=0.1.6)"] +xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] + +[[package]] +name = "google-cloud-alloydb" +version = "0.4.3" +description = "Google Cloud Alloydb API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_alloydb-0.4.3-py3-none-any.whl", hash = "sha256:ae66d24b368be15a116a5579e1031de152255633092774c7fa1293aea1f57c7e"}, + {file = "google_cloud_alloydb-0.4.3.tar.gz", hash = "sha256:4302d4ca7b07971abb8988cd0310c80c5bf53a691eab753eea08ad3c9b4d0abd"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-appengine-logging" +version = "1.6.0" +description = "Google Cloud Appengine Logging API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_appengine_logging-1.6.0-py2.py3-none-any.whl", hash = "sha256:741557e5281e351ccc90f774685a1adb0e5996cc233bcd019ef072280aaad13f"}, + {file = "google_cloud_appengine_logging-1.6.0.tar.gz", hash = "sha256:2f6ef52dfa88eca3bea078bc3c2b55ea61ff08b5e0c37912027fbb2a5f2d91ce"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-audit-log" +version = "0.3.0" +description = "Google Cloud Audit Protos" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_audit_log-0.3.0-py2.py3-none-any.whl", hash = "sha256:8340793120a1d5aa143605def8704ecdcead15106f754ef1381ae3bab533722f"}, + {file = "google_cloud_audit_log-0.3.0.tar.gz", hash = "sha256:901428b257020d8c1d1133e0fa004164a555e5a395c7ca3cdbb8486513df3a65"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.56.2,<2.0dev" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-automl" +version = "2.16.2" +description = "Google Cloud Automl API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_automl-2.16.2-py2.py3-none-any.whl", hash = "sha256:e88ff560d24742b281273326cff634f7c5c96b45b1b9b3e991884146fd00301c"}, + {file = "google_cloud_automl-2.16.2.tar.gz", hash = "sha256:d464affd3dc97b1db3c6c2b7e75d0b3a876e2be6bcec8e8cadac08927b92bdb8"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] +pandas = ["pandas (>=1.0.5)"] +storage = ["google-cloud-storage (>=1.18.0,<4.0.0dev)"] + +[[package]] +name = "google-cloud-batch" +version = "0.17.34" +description = "Google Cloud Batch API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_batch-0.17.34-py2.py3-none-any.whl", hash = "sha256:7b715a69a98ce7ffc75e53dec8c1b757e6e588e215b0db82af0f59e9cb3d69ad"}, + {file = "google_cloud_batch-0.17.34.tar.gz", hash = "sha256:ea58effcbe1618ccfd3a8e40f4926448da9e9de745488cab20096cb2df6d76e8"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-bigquery" +version = "3.30.0" +description = "Google BigQuery API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_bigquery-3.30.0-py2.py3-none-any.whl", hash = "sha256:f4d28d846a727f20569c9b2d2f4fa703242daadcb2ec4240905aa485ba461877"}, + {file = "google_cloud_bigquery-3.30.0.tar.gz", hash = "sha256:7e27fbafc8ed33cc200fe05af12ecd74d279fe3da6692585a3cef7aee90575b6"}, +] + +[package.dependencies] +db-dtypes = {version = ">=0.3.0,<2.0.0dev", optional = true, markers = "extra == \"pandas\""} +google-api-core = {version = ">=2.11.1,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-core = ">=2.4.1,<3.0.0dev" +google-resumable-media = ">=2.0.0,<3.0dev" +grpcio = [ + {version = ">=1.47.0,<2.0dev", optional = true, markers = "extra == \"pandas\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"pandas\""}, +] packaging = ">=20.0.0" pandas = {version = ">=1.1.0", optional = true, markers = "extra == \"pandas\""} +pandas-gbq = {version = ">=0.26.1", optional = true, markers = "python_version >= \"3.8\" and extra == \"pandas\""} pyarrow = {version = ">=3.0.0", optional = true, markers = "extra == \"pandas\""} python-dateutil = ">=2.7.3,<3.0dev" requests = ">=2.21.0,<3.0.0dev" @@ -2978,87 +3528,726 @@ requests = ">=2.21.0,<3.0.0dev" [package.extras] all = ["google-cloud-bigquery[bigquery-v2,bqstorage,geopandas,ipython,ipywidgets,opentelemetry,pandas,tqdm]"] bigquery-v2 = ["proto-plus (>=1.22.3,<2.0.0dev)", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "pyarrow (>=3.0.0)"] geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<2.0dev)"] ipython = ["bigquery-magics (>=0.1.0)"] ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "importlib-metadata (>=1.0.0) ; python_version < \"3.8\"", "pandas (>=1.1.0)", "pandas-gbq (>=0.26.1) ; python_version >= \"3.8\"", "pyarrow (>=3.0.0)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] -name = "google-cloud-core" -version = "2.4.1" -description = "Google Cloud API client core library" -optional = true +name = "google-cloud-bigquery-datatransfer" +version = "3.19.0" +description = "Google Cloud Bigquery Datatransfer API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_bigquery_datatransfer-3.19.0-py2.py3-none-any.whl", hash = "sha256:1c11b6db5f232c77d175fe79eb75f26068427e64d903983ade4cb7c9c22ba543"}, + {file = "google_cloud_bigquery_datatransfer-3.19.0.tar.gz", hash = "sha256:a90df7d219e76720b85fe42f96b485f99fc5182b1a113ccfe3b0a0cc01c74bed"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-bigtable" +version = "2.29.0" +description = "Google Cloud Bigtable API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_bigtable-2.29.0-py2.py3-none-any.whl", hash = "sha256:7325cc847fb73bb5fd2e013bce5b7e8e01c03c1f10d8204635b1e3f73fd266fb"}, + {file = "google_cloud_bigtable-2.29.0.tar.gz", hash = "sha256:912c02a72f910afc5535f193fcc0e7d0666920b43622e957f6c76729fffbe7b2"}, +] + +[package.dependencies] +google-api-core = {version = ">=2.16.0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +google-cloud-core = ">=1.4.4,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] + +[[package]] +name = "google-cloud-build" +version = "3.31.0" +description = "Google Cloud Build API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_build-3.31.0-py2.py3-none-any.whl", hash = "sha256:9d5d66369a4d1de9a394f78a36a567aa8f55b57975962b5c807e43d2deedd148"}, + {file = "google_cloud_build-3.31.0.tar.gz", hash = "sha256:70ea9312e09a942d37aa34909b7a9748e390d05cf37af5ccf69c387725c5155d"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-compute" +version = "1.26.0" +description = "Google Cloud Compute API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_compute-1.26.0-py2.py3-none-any.whl", hash = "sha256:ba016e19d7162e92989a69cec3dac0e9a441421f3555cf2dbb76c042f02b875b"}, + {file = "google_cloud_compute-1.26.0.tar.gz", hash = "sha256:65b6c791060ac83cb8532f9336bd7e1458b06a155963b562b9b44e33eccd3030"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-container" +version = "2.56.0" +description = "Google Cloud Container API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_container-2.56.0-py2.py3-none-any.whl", hash = "sha256:afd651226eb86f3f5e00fde1d979906d30b2a710724e3e99a76b2916413bccad"}, + {file = "google_cloud_container-2.56.0.tar.gz", hash = "sha256:043d9eff86838726390acf79619c003b5b092bbb7eb3d5426306e9b2b9500e0f"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-core" +version = "2.4.2" +description = "Google Cloud API client core library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_core-2.4.2-py2.py3-none-any.whl", hash = "sha256:7459c3e83de7cb8b9ecfec9babc910efb4314030c56dd798eaad12c426f7d180"}, + {file = "google_cloud_core-2.4.2.tar.gz", hash = "sha256:a4fcb0e2fcfd4bfe963837fad6d10943754fd79c1a50097d68540b6eb3d67f35"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] + +[[package]] +name = "google-cloud-datacatalog" +version = "3.25.1" +description = "Google Cloud Datacatalog API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_datacatalog-3.25.1-py2.py3-none-any.whl", hash = "sha256:5b08a29f128df18c73890dd37b83ad2629200aeb09e12b5287f584a3a7c4a31e"}, + {file = "google_cloud_datacatalog-3.25.1.tar.gz", hash = "sha256:2e40a2f9bcc2cb0b66b442bf6b2a557ae9c0ebf142eed0c72d5ceb88f858744d"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dataflow-client" +version = "0.8.16" +description = "Google Cloud Dataflow Client API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dataflow_client-0.8.16-py2.py3-none-any.whl", hash = "sha256:f62b2d3833ad1af797d1025e547185866a7d24ba2c250263c1e5834f1c66717f"}, + {file = "google_cloud_dataflow_client-0.8.16.tar.gz", hash = "sha256:5d4a582450d96ba07630f930894146f4df4d99a68b2e8fccde471b19525136d8"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dataform" +version = "0.6.0" +description = "Google Cloud Dataform API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dataform-0.6.0-py2.py3-none-any.whl", hash = "sha256:862e129e901fd9aded826180e91aaa106dd4715525088020f52fdcdce534eafa"}, + {file = "google_cloud_dataform-0.6.0.tar.gz", hash = "sha256:bbe034925eba2e51e9ef79a62e079c248073e06aa43beba2ebc14e96d27c7891"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dataplex" +version = "2.7.1" +description = "Google Cloud Dataplex API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dataplex-2.7.1-py2.py3-none-any.whl", hash = "sha256:08fdb783cc115bfd0005965e8a3e54489926cc5d8838e7f755b3f07117ca2791"}, + {file = "google_cloud_dataplex-2.7.1.tar.gz", hash = "sha256:0e56019ce2416f2f1e3bdeeb185d8a4687f9460cb3b7e5012cdb7bb7f11df56f"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dataproc" +version = "5.18.0" +description = "Google Cloud Dataproc API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dataproc-5.18.0-py2.py3-none-any.whl", hash = "sha256:284c51ec7e0a6bb4ce2df7c0ef4371b9b6ede442dd17ca08eae3e95bef47e078"}, + {file = "google_cloud_dataproc-5.18.0.tar.gz", hash = "sha256:0ad16257a4c94f15231aa8ab92e7fe4d77a706eea8eff2c7ae094ccb0f57f71a"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dataproc-metastore" +version = "1.18.1" +description = "Google Cloud Dataproc Metastore API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dataproc_metastore-1.18.1-py2.py3-none-any.whl", hash = "sha256:0cfd19753621315da5397a79949a0d9df47a13f0f4219ed04278e8a081a937eb"}, + {file = "google_cloud_dataproc_metastore-1.18.1.tar.gz", hash = "sha256:6efc698c406ac8125562a85f12cc518014dad29d190be68bf30b3926a0091781"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-dlp" +version = "3.28.0" +description = "Google Cloud Dlp API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_dlp-3.28.0-py2.py3-none-any.whl", hash = "sha256:b899604f35089643885f47567b603fd718d440691be66bd8b3290106ea18f653"}, + {file = "google_cloud_dlp-3.28.0.tar.gz", hash = "sha256:2db67a201ac234be6342c3a1892ecc3691747ec6526aca8f4814b43b961acbaa"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-kms" +version = "3.4.0" +description = "Google Cloud Kms API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_kms-3.4.0-py2.py3-none-any.whl", hash = "sha256:fcd0e428e5d9d80fd992cfbea775363eac839bb9fe2d60873cc933528c7e7658"}, + {file = "google_cloud_kms-3.4.0.tar.gz", hash = "sha256:042a3acb35ff8c925aa8c25602c4ad9e7c204e9009a2083f0d32fe88763448c2"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-language" +version = "2.17.0" +description = "Google Cloud Language API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_language-2.17.0-py2.py3-none-any.whl", hash = "sha256:a5f5e976c371a32a64ba14264ca3f68e5ef69d30dc70435627ce823dcac6ebe6"}, + {file = "google_cloud_language-2.17.0.tar.gz", hash = "sha256:8ce21687ba72ef58ce58707aede8164258f9deb47791f249cc2a9d4f8c90761b"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-logging" +version = "3.11.4" +description = "Stackdriver Logging API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_logging-3.11.4-py2.py3-none-any.whl", hash = "sha256:1d465ac62df29fb94bba4d6b4891035e57d573d84541dd8a40eebbc74422b2f0"}, + {file = "google_cloud_logging-3.11.4.tar.gz", hash = "sha256:32305d989323f3c58603044e2ac5d9cf23e9465ede511bbe90b4309270d3195c"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +google-cloud-appengine-logging = ">=0.1.3,<2.0.0dev" +google-cloud-audit-log = ">=0.2.4,<1.0.0dev" +google-cloud-core = ">=2.0.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +opentelemetry-api = ">=1.9.0" +proto-plus = [ + {version = ">=1.22.0,<2.0.0dev"}, + {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, +] +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-managedkafka" +version = "0.1.7" +description = "Google Cloud Managedkafka API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_managedkafka-0.1.7-py3-none-any.whl", hash = "sha256:48a0cf89e62513f8c3efbc128e6ba55e09573e3939bef0bec9b5732a0da70685"}, + {file = "google_cloud_managedkafka-0.1.7.tar.gz", hash = "sha256:cc431c9082cceb4f6838c76f18302fed5d1c81a119ca0d5abfadd8d1001c66cc"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-memcache" +version = "1.12.0" +description = "Google Cloud Memcache API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_memcache-1.12.0-py2.py3-none-any.whl", hash = "sha256:8c166c83604239fbf905502d9cf387ec74e6c789f3ed6b7165ba0fbc6d8a36c9"}, + {file = "google_cloud_memcache-1.12.0.tar.gz", hash = "sha256:7a82ed5ab3a199ea11a70db16608730488edb4f93a621d8876d6cc2f558a0bde"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-monitoring" +version = "2.27.0" +description = "Google Cloud Monitoring API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_monitoring-2.27.0-py2.py3-none-any.whl", hash = "sha256:d51c006b778d2873955c23144a0a13de839c5ebe619e8fca77e1f3aa2643db35"}, + {file = "google_cloud_monitoring-2.27.0.tar.gz", hash = "sha256:f66552528812e7b6a9f2fb7e0b7c3e7904cc0c13504f4fcb42035722b5da2bc4"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[package.extras] +pandas = ["pandas (>=0.23.2)"] + +[[package]] +name = "google-cloud-orchestration-airflow" +version = "1.17.0" +description = "Google Cloud Orchestration Airflow API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_orchestration_airflow-1.17.0-py2.py3-none-any.whl", hash = "sha256:19e8850a8fe2fc6d07481bc5b5eb4dc462546f03709d3e55b72d682db40cf675"}, + {file = "google_cloud_orchestration_airflow-1.17.0.tar.gz", hash = "sha256:a7a4bfcd9864d007bd038fdd04e757734d3752801fcd5fda89a0722c91ed8f99"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-os-login" +version = "2.17.0" +description = "Google Cloud Os Login API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_os_login-2.17.0-py2.py3-none-any.whl", hash = "sha256:580172503bd2ac08f9d3d50572a7241c8773a59f2071c391b5e7caf0924c28f6"}, + {file = "google_cloud_os_login-2.17.0.tar.gz", hash = "sha256:1b75fa0e892a5fba89abb5888d6e77665ccbe23547e5f39ec3bf9ff640792185"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-pubsub" +version = "2.28.0" +description = "Google Cloud Pub/Sub API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_pubsub-2.28.0-py2.py3-none-any.whl", hash = "sha256:76b41a322b43bc845fb06ffe238758726324d957d0161bae3ff4b14339da144b"}, + {file = "google_cloud_pubsub-2.28.0.tar.gz", hash = "sha256:904e894b4e15121521077ac85c9aa8f4e7b8517bc5fb409ddb2aac8df1a02b3c"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +grpcio = ">=1.51.3,<2.0dev" +grpcio-status = ">=1.33.2" +opentelemetry-api = {version = ">=1.27.0", markers = "python_version >= \"3.8\""} +opentelemetry-sdk = {version = ">=1.27.0", markers = "python_version >= \"3.8\""} +proto-plus = [ + {version = ">=1.22.0,<2.0.0dev"}, + {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, +] +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[package.extras] +libcst = ["libcst (>=0.3.10)"] + +[[package]] +name = "google-cloud-redis" +version = "2.18.0" +description = "Google Cloud Redis API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_redis-2.18.0-py2.py3-none-any.whl", hash = "sha256:9c969a1cd2d5e0f9eb56dd0ad3407aa21eed05f5eba053d4ad133783841f55d2"}, + {file = "google_cloud_redis-2.18.0.tar.gz", hash = "sha256:beccefb706d5c565cd99acfeeb2cb75f1368a7bc7f7f8d96b60e02b8ec054e8a"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-resource-manager" +version = "1.14.1" +description = "Google Cloud Resource Manager API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_resource_manager-1.14.1-py2.py3-none-any.whl", hash = "sha256:68340599f85ebf07a6e18487e460ea07cc15e132068f6b188786d01c2cf25518"}, + {file = "google_cloud_resource_manager-1.14.1.tar.gz", hash = "sha256:41e9e546aaa03d5160cdfa2341dbe81ef7596706c300a89b94c429f1f3411f87"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-run" +version = "0.10.16" +description = "Google Cloud Run API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_run-0.10.16-py2.py3-none-any.whl", hash = "sha256:bc66cc3000c4df9b607802edf955c1979c53004cc31c850ea9ccacf8d3f5e764"}, + {file = "google_cloud_run-0.10.16.tar.gz", hash = "sha256:81e488956f71d39ec11fdbddd550ae9bfd9b8d72b82b42c8be42a2d56ac2deef"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-secret-manager" +version = "2.23.1" +description = "Google Cloud Secret Manager API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_secret_manager-2.23.1-py2.py3-none-any.whl", hash = "sha256:ed9a58750ec24be46dc17ea9b6cb1e7088490921b810a3c365b3e28be82984a1"}, + {file = "google_cloud_secret_manager-2.23.1.tar.gz", hash = "sha256:4d779ed5666b5c4a4e24e52f808b2e159b60fc68ed7b1f230ca491918632a114"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-spanner" +version = "3.52.0" +description = "Google Cloud Spanner API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_spanner-3.52.0-py2.py3-none-any.whl", hash = "sha256:d6c30a7ad9742bbe93dc5fc11293f0b339714d1dbf395b541ca9c8942d5ecf3f"}, + {file = "google_cloud_spanner-3.52.0.tar.gz", hash = "sha256:b18cc9b8d97866c80297c878175fa86af9244cd0c13455970192f8318d646e8a"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.4.4,<3.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +grpc-interceptor = ">=0.15.4" +proto-plus = [ + {version = ">=1.22.0,<2.0.0dev"}, + {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, +] +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +sqlparse = ">=0.4.4" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] +tracing = ["google-cloud-monitoring (>=2.16.0)", "opentelemetry-api (>=1.22.0)", "opentelemetry-sdk (>=1.22.0)", "opentelemetry-semantic-conventions (>=0.43b0)"] + +[[package]] +name = "google-cloud-speech" +version = "2.31.0" +description = "Google Cloud Speech API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_speech-2.31.0-py2.py3-none-any.whl", hash = "sha256:1e1d61db8110f3c2b9b2ab108deefc3f47d6ba7fe5ad44eb623a5305a68f3cd1"}, + {file = "google_cloud_speech-2.31.0.tar.gz", hash = "sha256:d7998c26a945f58933c60e2d3803ed0593eb416bac9d4381c03059d10272ef03"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-storage" +version = "2.19.0" +description = "Google Cloud Storage API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_storage-2.19.0-py2.py3-none-any.whl", hash = "sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba"}, + {file = "google_cloud_storage-2.19.0.tar.gz", hash = "sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2"}, +] + +[package.dependencies] +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.7.2" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<6.0.0dev)"] +tracing = ["opentelemetry-api (>=1.1.0)"] + +[[package]] +name = "google-cloud-storage-transfer" +version = "1.16.0" +description = "Google Cloud Storage Transfer API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_storage_transfer-1.16.0-py2.py3-none-any.whl", hash = "sha256:5b156c107100864278a47641d75e47de93e0f9c3a24233bc677a292fed39e2db"}, + {file = "google_cloud_storage_transfer-1.16.0.tar.gz", hash = "sha256:fa63463c2f4aabd7b864d47c2243cb2057dd82188a7fa5fde309cb58d4557c18"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-tasks" +version = "2.19.1" +description = "Google Cloud Tasks API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_tasks-2.19.1-py2.py3-none-any.whl", hash = "sha256:0feee406db1395c80175aea3d35846222522ad937f384dc565e6c0a11373a1ad"}, + {file = "google_cloud_tasks-2.19.1.tar.gz", hash = "sha256:c2f22a7dd315369dc2ff76a98d1f5dfda877970ada28d829a149cbe7b1463c06"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-texttospeech" +version = "2.25.0" +description = "Google Cloud Texttospeech API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_texttospeech-2.25.0-py2.py3-none-any.whl", hash = "sha256:5066b486111d450aedf49a84824c7699fd3ce7fbc56a416c358f9cde25e82c90"}, + {file = "google_cloud_texttospeech-2.25.0.tar.gz", hash = "sha256:776e70b58385c8c34b8425c7adb27e946a858377c227b95153315d75263c1e23"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-translate" +version = "3.20.1" +description = "Google Cloud Translate API client library" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "google_cloud_translate-3.20.1-py2.py3-none-any.whl", hash = "sha256:5a54f61fd9841473581187f6da41b88189149507a7e63fd331bda310326c348f"}, + {file = "google_cloud_translate-3.20.1.tar.gz", hash = "sha256:83a28ef97c4af2744acbdfe662439728741a56d89548522b4fab008663c91901"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +google-cloud-core = ">=1.4.4,<3.0.0dev" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-cloud-videointelligence" +version = "2.16.0" +description = "Google Cloud Videointelligence API client library" +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, - {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, + {file = "google_cloud_videointelligence-2.16.0-py2.py3-none-any.whl", hash = "sha256:b7e7e256970657fa06856e1a60ae9b95acb879bdf98038fa891366688690169c"}, + {file = "google_cloud_videointelligence-2.16.0.tar.gz", hash = "sha256:7aa1cda9af6914713e328787eab3aba361b413488b08e0aac57a8da22ded1f62"}, ] [package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] -name = "google-cloud-dataproc" -version = "5.16.0" -description = "Google Cloud Dataproc API client library" -optional = true +name = "google-cloud-vision" +version = "3.10.0" +description = "Google Cloud Vision API client library" +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "google_cloud_dataproc-5.16.0-py2.py3-none-any.whl", hash = "sha256:3fae8b702ad8446f22bf6c7528dfe201df9596089ec25b65a30bb0942e1a0f60"}, - {file = "google_cloud_dataproc-5.16.0.tar.gz", hash = "sha256:23b2d8ae4f648e01b66fed0abea114b600d3363d955b8558c7645a93f28d6e3c"}, + {file = "google_cloud_vision-3.10.0-py2.py3-none-any.whl", hash = "sha256:cac9705a21374dcd4a62281e93dae5a2cb7eaf161fdd0aa5585e66c6c1d42f44"}, + {file = "google_cloud_vision-3.10.0.tar.gz", hash = "sha256:1f0b1e17ada68f7b257eef3cb7c91a02c8f21e254f8bdb8ff38b0e67d25ce3a5"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] -name = "google-cloud-storage" -version = "2.19.0" -description = "Google Cloud Storage API client library" -optional = true +name = "google-cloud-workflows" +version = "1.17.0" +description = "Google Cloud Workflows API client library" +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "google_cloud_storage-2.19.0-py2.py3-none-any.whl", hash = "sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba"}, - {file = "google_cloud_storage-2.19.0.tar.gz", hash = "sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2"}, + {file = "google_cloud_workflows-1.17.0-py2.py3-none-any.whl", hash = "sha256:217f0c6a88c9b9bbdce5a474756a8b3f37bb89cf9ee22343f9e363b6dd3046d4"}, + {file = "google_cloud_workflows-1.17.0.tar.gz", hash = "sha256:44f40b322cd42c6401c3174a7ef2276c403d3bbf89b168e0f5d1709058f6f483"}, ] [package.dependencies] -google-api-core = ">=2.15.0,<3.0.0dev" -google-auth = ">=2.26.1,<3.0dev" -google-cloud-core = ">=2.3.0,<3.0dev" -google-crc32c = ">=1.0,<2.0dev" -google-resumable-media = ">=2.7.2" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -protobuf = ["protobuf (<6.0.0dev)"] -tracing = ["opentelemetry-api (>=1.1.0)"] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] name = "google-crc32c" version = "1.6.0" description = "A python wrapper of the C library 'Google CRC32C'" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "google_crc32c-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5bcc90b34df28a4b38653c36bb5ada35671ad105c99cfe915fb5bed7ad6924aa"}, {file = "google_crc32c-1.6.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d9e9913f7bd69e093b81da4535ce27af842e7bf371cde42d1ae9e9bd382dc0e9"}, @@ -3099,7 +4288,6 @@ description = "RE2 Python bindings" optional = false python-versions = "~=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "google_re2-1.1.20240702-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:46e7ed614ffaafccae017542d68e9bbf664c8c1e5ca37046adee640bbee4846e"}, {file = "google_re2-1.1.20240702-1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3c8d2c0a03e9fd24f78b624cf7e40ac32aaf4837fda7339e2c22ca42e3dca512"}, @@ -3158,10 +4346,9 @@ files = [ name = "google-resumable-media" version = "2.7.2" description = "Utilities for Google Media Downloads and Resumable Uploads" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa"}, {file = "google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0"}, @@ -3176,15 +4363,14 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.66.0" +version = "1.69.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, - {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, + {file = "googleapis_common_protos-1.69.0-py2.py3-none-any.whl", hash = "sha256:17835fdc4fa8da1d61cfe2d4d5d57becf7c61d4112f8d81c67eaa9d7ce43042d"}, + {file = "googleapis_common_protos-1.69.0.tar.gz", hash = "sha256:5a46d58af72846f59009b9c4710425b9af2139555c71837081706b213b298187"}, ] [package.dependencies] @@ -3201,7 +4387,7 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "(platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") and (python_version <= \"3.11\" or python_version >= \"3.12\")" +markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\"" files = [ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, @@ -3284,15 +4470,14 @@ test = ["objgraph", "psutil"] [[package]] name = "grpc-google-iam-v1" -version = "0.14.0" +version = "0.14.1" description = "IAM API client library" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "grpc_google_iam_v1-0.14.0-py2.py3-none-any.whl", hash = "sha256:fb4a084b30099ba3ab07d61d620a0d4429570b13ff53bd37bac75235f98b7da4"}, - {file = "grpc_google_iam_v1-0.14.0.tar.gz", hash = "sha256:c66e07aa642e39bb37950f9e7f491f70dad150ac9801263b42b2814307c2df99"}, + {file = "grpc_google_iam_v1-0.14.1-py2.py3-none-any.whl", hash = "sha256:b4eca35b2231dd76066ebf1728f3cd30d51034db946827ef63ef138da14eea16"}, + {file = "grpc_google_iam_v1-0.14.1.tar.gz", hash = "sha256:14149f37af0e5779fa8a22a8ae588663269e8a479d9c2e69a5056e589bf8a891"}, ] [package.dependencies] @@ -3300,14 +4485,31 @@ googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} grpcio = ">=1.44.0,<2.0.0dev" protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +[[package]] +name = "grpc-interceptor" +version = "0.15.4" +description = "Simplifies gRPC interceptors" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main", "dev"] +files = [ + {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"}, + {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"}, +] + +[package.dependencies] +grpcio = ">=1.49.1,<2.0.0" + +[package.extras] +testing = ["protobuf (>=4.21.9)"] + [[package]] name = "grpcio" version = "1.70.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"}, {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"}, @@ -3369,14 +4571,28 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.70.0)"] +[[package]] +name = "grpcio-gcp" +version = "0.2.2" +description = "gRPC extensions for Google Cloud Platform" +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "grpcio-gcp-0.2.2.tar.gz", hash = "sha256:e292605effc7da39b7a8734c719afb12ec4b5362add3528d8afad3aa3aa9057c"}, + {file = "grpcio_gcp-0.2.2-py2.py3-none-any.whl", hash = "sha256:1ef8e8531eab11356a3eb4c5b84e79e0d923d6782d19e1b1a45e1cabe4e783d7"}, +] + +[package.dependencies] +grpcio = ">=1.12.0" + [[package]] name = "grpcio-status" version = "1.70.0" description = "Status proto mapping for gRPC" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "grpcio_status-1.70.0-py3-none-any.whl", hash = "sha256:fc5a2ae2b9b1c1969cc49f3262676e6854aa2398ec69cb5bd6c47cd501904a85"}, {file = "grpcio_status-1.70.0.tar.gz", hash = "sha256:0e7b42816512433b18b9d764285ff029bde059e9d41f8fe10a60631bd8348101"}, @@ -3394,7 +4610,6 @@ description = "WSGI HTTP Server for UNIX" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -3417,7 +4632,6 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -3430,7 +4644,6 @@ description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -3446,6 +4659,21 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<1.0)"] +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main", "dev"] +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + [[package]] name = "httpx" version = "0.28.1" @@ -3453,7 +4681,6 @@ description = "The next generation HTTP client." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -3466,7 +4693,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -3474,15 +4701,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.6" +version = "2.6.8" description = "File identification library for Python" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881"}, - {file = "identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251"}, + {file = "identify-2.6.8-py2.py3-none-any.whl", hash = "sha256:83657f0f766a3c8d0eaea16d4ef42494b39b34629a4b3192a9d020d349b3e255"}, + {file = "identify-2.6.8.tar.gz", hash = "sha256:61491417ea2c0c5c670484fd8abbb34de34cdae1e5f39a73ee65e48e4bb663fc"}, ] [package.extras] @@ -3494,8 +4720,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -3511,24 +4736,35 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] +[[package]] +name = "immutabledict" +version = "4.2.1" +description = "Immutable wrapper around dictionaries (a fork of frozendict)" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "immutabledict-4.2.1-py3-none-any.whl", hash = "sha256:c56a26ced38c236f79e74af3ccce53772827cef5c3bce7cab33ff2060f756373"}, + {file = "immutabledict-4.2.1.tar.gz", hash = "sha256:d91017248981c72eb66c8ff9834e99c2f53562346f23e7f51e7a5ebcf66a3bcc"}, +] + [[package]] name = "importlib-metadata" version = "6.11.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev", "docs"] +groups = ["main", "dev", "docs"] files = [ {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] -markers = {main = "python_version <= \"3.11\" or python_version >= \"3.12\"", adapters = "python_version <= \"3.11\" or python_version >= \"3.12\"", dev = "python_version <= \"3.11\" or python_version >= \"3.12\"", docs = "python_version < \"3.10\""} +markers = {docs = "python_version < \"3.10\""} [package.dependencies] zipp = ">=0.5" @@ -3536,7 +4772,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "inflection" @@ -3545,7 +4781,6 @@ description = "A port of Ruby on Rails inflector to Python" optional = false python-versions = ">=3.5" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, @@ -3558,7 +4793,6 @@ description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -3570,8 +4804,7 @@ version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" optional = false python-versions = "*" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, @@ -3587,7 +4820,6 @@ description = "Safely pass data to untrusted environments and back." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, @@ -3599,8 +4831,8 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -3619,8 +4851,8 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -3631,7 +4863,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] [[package]] name = "jaraco-functools" @@ -3639,8 +4871,8 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -3650,7 +4882,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -3659,20 +4891,20 @@ type = ["pytest-mypy"] [[package]] name = "jeepney" -version = "0.8.0" +version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = true python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"linux\"" +groups = ["main"] +markers = "(extra == \"adapters\" or extra == \"snowflake\") and sys_platform == \"linux\"" files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, + {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, + {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] +test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["trio"] [[package]] name = "jinja2" @@ -3680,8 +4912,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -3699,13 +4930,35 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "json-merge-patch" +version = "0.2" +description = "JSON Merge Patch library (https://tools.ietf.org/html/rfc7386)" +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "json-merge-patch-0.2.tar.gz", hash = "sha256:09898b6d427c08754e2a97c709cf2dfd7e28bd10c5683a538914975eab778d39"}, +] + [[package]] name = "jsonpath-ng" version = "1.7.0" @@ -3713,7 +4966,6 @@ description = "A final implementation of JSONPath for Python that aims to be sta optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, @@ -3729,8 +4981,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -3752,8 +5003,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -3768,8 +5018,8 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = true python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -3785,7 +5035,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -3800,7 +5050,6 @@ description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -3845,10 +5094,9 @@ files = [ name = "leather" version = "0.4.0" description = "Python charting for 80% of humans." -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "leather-0.4.0-py2.py3-none-any.whl", hash = "sha256:18290bc93749ae39039af5e31e871fcfad74d26c4c3ea28ea4f681f4571b3a2b"}, {file = "leather-0.4.0.tar.gz", hash = "sha256:f964bec2086f3153a6c16e707f20cb718f811f57af116075f4c0f4805c608b95"}, @@ -3864,7 +5112,6 @@ description = "Rate limiting utilities" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "limits-4.0.1-py3-none-any.whl", hash = "sha256:67667e669f570cf7be4e2c2bc52f763b3f93bdf66ea945584360bc1a3f251901"}, {file = "limits-4.0.1.tar.gz", hash = "sha256:a54f5c058dfc965319ae3ee78faf222294659e371b46d22cd7456761f7e46d5a"}, @@ -3876,9 +5123,9 @@ packaging = ">=21,<25" typing-extensions = "*" [package.extras] -all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] +all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1) ; python_version < \"3.11\"", "emcache (>=1) ; python_version >= \"3.11\" and python_version < \"3.13.0\"", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] async-etcd = ["aetcd"] -async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] +async-memcached = ["emcache (>=0.6.1) ; python_version < \"3.11\"", "emcache (>=1) ; python_version >= \"3.11\" and python_version < \"3.13.0\""] async-mongodb = ["motor (>=3,<4)"] async-redis = ["coredis (>=3.4.0,<5)"] etcd = ["etcd3"] @@ -3894,7 +5141,6 @@ description = "Links recognition library with FULL unicode support." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, @@ -3916,167 +5162,183 @@ description = "Platform-independent file locking module" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, ] +[[package]] +name = "looker-sdk" +version = "25.2.0" +description = "Looker REST API" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "looker_sdk-25.2.0-py3-none-any.whl", hash = "sha256:08fa5a181ac12c192f52f3637c751f09165935713eeb21c52b7a62b61fc8abca"}, + {file = "looker_sdk-25.2.0.tar.gz", hash = "sha256:a71bf1ce23ca5edb282d6d214d83995573a22882c2ca4c63e5f5fdf67f6b04e9"}, +] + +[package.dependencies] +attrs = {version = ">=20.1.0", markers = "python_version >= \"3.7\""} +cattrs = {version = ">=1.3", markers = "python_version >= \"3.7\""} +requests = ">=2.22" +typing-extensions = ">=4.1.1" + [[package]] name = "lxml" -version = "5.3.0" +version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, - {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, - {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, - {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, - {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, - {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, - {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, - {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, - {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, - {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, - {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, - {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, - {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, - {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, - {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, - {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, - {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, - {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, - {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, - {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, - {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, - {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, - {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, - {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, - {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, - {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, - {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, - {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, - {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, - {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, - {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, - {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, - {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, +groups = ["main", "dev"] +files = [ + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:528f3a0498a8edc69af0559bdcf8a9f5a8bf7c00051a6ef3141fdcf27017bbf5"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4743e30d6f5f92b6d2b7c86b3ad250e0bad8dee4b7ad8a0c44bfb276af89a3"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b5d7f8acf809465086d498d62a981fa6a56d2718135bb0e4aa48c502055f5c"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:928e75a7200a4c09e6efc7482a1337919cc61fe1ba289f297827a5b76d8969c2"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a997b784a639e05b9d4053ef3b20c7e447ea80814a762f25b8ed5a89d261eac"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7b82e67c5feb682dbb559c3e6b78355f234943053af61606af126df2183b9ef9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:f1de541a9893cf8a1b1db9bf0bf670a2decab42e3e82233d36a74eda7822b4c9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:de1fc314c3ad6bc2f6bd5b5a5b9357b8c6896333d27fdbb7049aea8bd5af2d79"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7c0536bd9178f754b277a3e53f90f9c9454a3bd108b1531ffff720e082d824f2"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68018c4c67d7e89951a91fbd371e2e34cd8cfc71f0bb43b5332db38497025d51"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa826340a609d0c954ba52fd831f0fba2a4165659ab0ee1a15e4aac21f302406"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:796520afa499732191e39fc95b56a3b07f95256f2d22b1c26e217fb69a9db5b5"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3effe081b3135237da6e4c4530ff2a868d3f80be0bda027e118a5971285d42d0"}, + {file = "lxml-5.3.1-cp310-cp310-win32.whl", hash = "sha256:a22f66270bd6d0804b02cd49dae2b33d4341015545d17f8426f2c4e22f557a23"}, + {file = "lxml-5.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bcfadea3cdc68e678d2b20cb16a16716887dd00a881e16f7d806c2138b8ff0c"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e220f7b3e8656ab063d2eb0cd536fafef396829cafe04cb314e734f87649058f"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f2cfae0688fd01f7056a17367e3b84f37c545fb447d7282cf2c242b16262607"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67d2f8ad9dcc3a9e826bdc7802ed541a44e124c29b7d95a679eeb58c1c14ade8"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db0c742aad702fd5d0c6611a73f9602f20aec2007c102630c06d7633d9c8f09a"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:198bb4b4dd888e8390afa4f170d4fa28467a7eaf857f1952589f16cfbb67af27"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2a3e412ce1849be34b45922bfef03df32d1410a06d1cdeb793a343c2f1fd666"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8969dbc8d09d9cd2ae06362c3bad27d03f433252601ef658a49bd9f2b22d79"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5be8f5e4044146a69c96077c7e08f0709c13a314aa5315981185c1f00235fe65"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:133f3493253a00db2c870d3740bc458ebb7d937bd0a6a4f9328373e0db305709"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:52d82b0d436edd6a1d22d94a344b9a58abd6c68c357ed44f22d4ba8179b37629"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b6f92e35e2658a5ed51c6634ceb5ddae32053182851d8cad2a5bc102a359b33"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:203b1d3eaebd34277be06a3eb880050f18a4e4d60861efba4fb946e31071a295"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:155e1a5693cf4b55af652f5c0f78ef36596c7f680ff3ec6eb4d7d85367259b2c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22ec2b3c191f43ed21f9545e9df94c37c6b49a5af0a874008ddc9132d49a2d9c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7eda194dd46e40ec745bf76795a7cccb02a6a41f445ad49d3cf66518b0bd9cff"}, + {file = "lxml-5.3.1-cp311-cp311-win32.whl", hash = "sha256:fb7c61d4be18e930f75948705e9718618862e6fc2ed0d7159b2262be73f167a2"}, + {file = "lxml-5.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c809eef167bf4a57af4b03007004896f5c60bd38dc3852fcd97a26eae3d4c9e6"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645"}, + {file = "lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5"}, + {file = "lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252"}, + {file = "lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78"}, + {file = "lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332"}, + {file = "lxml-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:016b96c58e9a4528219bb563acf1aaaa8bc5452e7651004894a973f03b84ba81"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82a4bb10b0beef1434fb23a09f001ab5ca87895596b4581fd53f1e5145a8934a"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d68eeef7b4d08a25e51897dac29bcb62aba830e9ac6c4e3297ee7c6a0cf6439"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:f12582b8d3b4c6be1d298c49cb7ae64a3a73efaf4c2ab4e37db182e3545815ac"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2df7ed5edeb6bd5590914cd61df76eb6cce9d590ed04ec7c183cf5509f73530d"}, + {file = "lxml-5.3.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:585c4dc429deebc4307187d2b71ebe914843185ae16a4d582ee030e6cfbb4d8a"}, + {file = "lxml-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:06a20d607a86fccab2fc15a77aa445f2bdef7b49ec0520a842c5c5afd8381576"}, + {file = "lxml-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:057e30d0012439bc54ca427a83d458752ccda725c1c161cc283db07bcad43cf9"}, + {file = "lxml-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4867361c049761a56bd21de507cab2c2a608c55102311d142ade7dab67b34f32"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dddf0fb832486cc1ea71d189cb92eb887826e8deebe128884e15020bb6e3f61"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bcc211542f7af6f2dfb705f5f8b74e865592778e6cafdfd19c792c244ccce19"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaca5a812f050ab55426c32177091130b1e49329b3f002a32934cd0245571307"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:236610b77589faf462337b3305a1be91756c8abc5a45ff7ca8f245a71c5dab70"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:aed57b541b589fa05ac248f4cb1c46cbb432ab82cbd467d1c4f6a2bdc18aecf9"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:75fa3d6946d317ffc7016a6fcc44f42db6d514b7fdb8b4b28cbe058303cb6e53"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:96eef5b9f336f623ffc555ab47a775495e7e8846dde88de5f941e2906453a1ce"}, + {file = "lxml-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:ef45f31aec9be01379fc6c10f1d9c677f032f2bac9383c827d44f620e8a88407"}, + {file = "lxml-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0611da6b07dd3720f492db1b463a4d1175b096b49438761cc9f35f0d9eaaef5"}, + {file = "lxml-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2aca14c235c7a08558fe0a4786a1a05873a01e86b474dfa8f6df49101853a4e"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82fce1d964f065c32c9517309f0c7be588772352d2f40b1574a214bd6e6098"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7aae7a3d63b935babfdc6864b31196afd5145878ddd22f5200729006366bc4d5"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8e0d177b1fe251c3b1b914ab64135475c5273c8cfd2857964b2e3bb0fe196a7"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:6c4dd3bfd0c82400060896717dd261137398edb7e524527438c54a8c34f736bf"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f1208c1c67ec9e151d78aa3435aa9b08a488b53d9cfac9b699f15255a3461ef2"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c6aacf00d05b38a5069826e50ae72751cb5bc27bdc4d5746203988e429b385bb"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5881aaa4bf3a2d086c5f20371d3a5856199a0d8ac72dd8d0dbd7a2ecfc26ab73"}, + {file = "lxml-5.3.1-cp38-cp38-win32.whl", hash = "sha256:45fbb70ccbc8683f2fb58bea89498a7274af1d9ec7995e9f4af5604e028233fc"}, + {file = "lxml-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:7512b4d0fc5339d5abbb14d1843f70499cab90d0b864f790e73f780f041615d7"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5885bc586f1edb48e5d68e7a4b4757b5feb2a496b64f462b4d65950f5af3364f"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b92fe86e04f680b848fff594a908edfa72b31bfc3499ef7433790c11d4c8cd8"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a091026c3bf7519ab1e64655a3f52a59ad4a4e019a6f830c24d6430695b1cf6a"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ffb141361108e864ab5f1813f66e4e1164181227f9b1f105b042729b6c15125"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3715cdf0dd31b836433af9ee9197af10e3df41d273c19bb249230043667a5dfd"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88b72eb7222d918c967202024812c2bfb4048deeb69ca328363fb8e15254c549"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa59974880ab5ad8ef3afaa26f9bda148c5f39e06b11a8ada4660ecc9fb2feb3"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3bb8149840daf2c3f97cebf00e4ed4a65a0baff888bf2605a8d0135ff5cf764e"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:0d6b2fa86becfa81f0a0271ccb9eb127ad45fb597733a77b92e8a35e53414914"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:136bf638d92848a939fd8f0e06fcf92d9f2e4b57969d94faae27c55f3d85c05b"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:89934f9f791566e54c1d92cdc8f8fd0009447a5ecdb1ec6b810d5f8c4955f6be"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8ade0363f776f87f982572c2860cc43c65ace208db49c76df0a21dde4ddd16e"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfbbab9316330cf81656fed435311386610f78b6c93cc5db4bebbce8dd146675"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:172d65f7c72a35a6879217bcdb4bb11bc88d55fb4879e7569f55616062d387c2"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3c623923967f3e5961d272718655946e5322b8d058e094764180cdee7bab1af"}, + {file = "lxml-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ce0930a963ff593e8bb6fda49a503911accc67dee7e5445eec972668e672a0f0"}, + {file = "lxml-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f7b64fcd670bca8800bc10ced36620c6bbb321e7bc1214b9c0c0df269c1dddc2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:afa578b6524ff85fb365f454cf61683771d0170470c48ad9d170c48075f86725"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f5e80adf0aafc7b5454f2c1cb0cde920c9b1f2cbd0485f07cc1d0497c35c5d"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd0b80ac2d8f13ffc906123a6f20b459cb50a99222d0da492360512f3e50f84"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:422c179022ecdedbe58b0e242607198580804253da220e9454ffe848daa1cfd2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:524ccfded8989a6595dbdda80d779fb977dbc9a7bc458864fc9a0c2fc15dc877"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:48fd46bf7155def2e15287c6f2b133a2f78e2d22cdf55647269977b873c65499"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:05123fad495a429f123307ac6d8fd6f977b71e9a0b6d9aeeb8f80c017cb17131"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a243132767150a44e6a93cd1dde41010036e1cbc63cc3e9fe1712b277d926ce3"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c92ea6d9dd84a750b2bae72ff5e8cf5fdd13e58dda79c33e057862c29a8d5b50"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2f1be45d4c15f237209bbf123a0e05b5d630c8717c42f59f31ea9eae2ad89394"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a83d3adea1e0ee36dac34627f78ddd7f093bb9cfc0a8e97f1572a949b695cb98"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3edbb9c9130bac05d8c3fe150c51c337a471cc7fdb6d2a0a7d3a88e88a829314"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f23cf50eccb3255b6e913188291af0150d89dab44137a69e14e4dcb7be981f1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7e5edac4778127f2bf452e0721a58a1cfa4d1d9eac63bdd650535eb8543615"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:094b28ed8a8a072b9e9e2113a81fda668d2053f2ca9f2d202c2c8c7c2d6516b1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:514fe78fc4b87e7a7601c92492210b20a1b0c6ab20e71e81307d9c2e377c64de"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8fffc08de02071c37865a155e5ea5fce0282e1546fd5bde7f6149fcaa32558ac"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4b0d5cdba1b655d5b18042ac9c9ff50bda33568eb80feaaca4fc237b9c4fbfde"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3031e4c16b59424e8d78522c69b062d301d951dc55ad8685736c3335a97fc270"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb659702a45136c743bc130760c6f137870d4df3a9e14386478b8a0511abcfca"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a11b16a33656ffc43c92a5343a28dc71eefe460bcc2a4923a96f292692709f6"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5ae125276f254b01daa73e2c103363d3e99e3e10505686ac7d9d2442dd4627a"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76722b5ed4a31ba103e0dc77ab869222ec36efe1a614e42e9bcea88a36186fe"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:33e06717c00c788ab4e79bc4726ecc50c54b9bfb55355eae21473c145d83c2d2"}, + {file = "lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] -html-clean = ["lxml-html-clean"] +html-clean = ["lxml_html_clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.11)"] +source = ["Cython (>=3.0.11,<3.1.0)"] [[package]] name = "mako" @@ -4085,7 +5347,6 @@ description = "A super-fast templating language that borrows the best ideas from optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Mako-1.3.9-py3-none-any.whl", hash = "sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1"}, {file = "mako-1.3.9.tar.gz", hash = "sha256:b5d65ff3462870feec922dbccf38f6efb44e5714d7b593a656be86663d8600ac"}, @@ -4106,7 +5367,6 @@ description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -4131,8 +5391,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -4204,7 +5463,6 @@ description = "A lightweight library for converting complex datatypes to and fro optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c"}, {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"}, @@ -4225,7 +5483,6 @@ description = "marshmallow multiplexing schema" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "marshmallow_oneofschema-3.1.1-py3-none-any.whl", hash = "sha256:ff4cb2a488785ee8edd521a765682c2c80c78b9dc48894124531bdfa1ec9303b"}, {file = "marshmallow_oneofschema-3.1.1.tar.gz", hash = "sha256:68b4a57d0281a04ac25d4eb7a4c5865a57090a0a8fd30fd6362c8e833ac6a6d9"}, @@ -4245,7 +5502,6 @@ description = "SQLAlchemy integration with the marshmallow (de)serialization lib optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "marshmallow-sqlalchemy-0.28.2.tar.gz", hash = "sha256:2ab0f1280c793e5aec81deab3e63ec23688ddfe05e5f38ac960368a1079520a1"}, {file = "marshmallow_sqlalchemy-0.28.2-py2.py3-none-any.whl", hash = "sha256:c31b3bdf794de1d78c53e1c495502cbb3eeb06ed216869980c71d6159e7e9e66"}, @@ -4266,10 +5522,9 @@ tests = ["pytest", "pytest-lazy-fixture (>=0.6.2)"] name = "mashumaro" version = "3.14" description = "Fast and well tested serialization library" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "mashumaro-3.14-py3-none-any.whl", hash = "sha256:c12a649599a8f7b1a0b35d18f12e678423c3066189f7bc7bd8dd431c5c8132c3"}, {file = "mashumaro-3.14.tar.gz", hash = "sha256:5ef6f2b963892cbe9a4ceb3441dfbea37f8c3412523f25d42e9b3a7186555f1d"}, @@ -4282,7 +5537,7 @@ typing-extensions = ">=4.1.0" [package.extras] msgpack = ["msgpack (>=0.5.6)"] orjson = ["orjson"] -toml = ["tomli (>=1.1.0)", "tomli-w (>=1.0)"] +toml = ["tomli (>=1.1.0) ; python_version < \"3.11\"", "tomli-w (>=1.0)"] yaml = ["pyyaml (>=3.13)"] [[package]] @@ -4292,7 +5547,6 @@ description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, @@ -4313,7 +5567,6 @@ description = "Markdown URL utilities" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -4326,7 +5579,6 @@ description = "Expand standard functools to methods" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "methodtools-0.4.7.tar.gz", hash = "sha256:e213439dd64cfe60213f7015da6efe5dd4003fd89376db3baa09fe13ec2bb0ba"}, ] @@ -4336,32 +5588,49 @@ wirerope = ">=0.4.7" [package.extras] doc = ["sphinx"] -test = ["functools32 (>=3.2.3-2)", "pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] +test = ["functools32 (>=3.2.3-2) ; python_version < \"3\"", "pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] [[package]] name = "mirakuru" -version = "2.5.3" +version = "2.6.0" description = "Process executor (not only) for tests." optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "mirakuru-2.5.3-py3-none-any.whl", hash = "sha256:2fab68356fb98fb5358ea3ab65f5e511f34b5a0b16cfd0a0935ef15a3393f025"}, - {file = "mirakuru-2.5.3.tar.gz", hash = "sha256:39b33f8fcdf13764a6cfe936e0feeead3902a161fec438df3be7cce98f7933c6"}, + {file = "mirakuru-2.6.0-py3-none-any.whl", hash = "sha256:0ff7080997e63289dc309d0237e137ca2cfa863b3d26b3d5e8fd4e1c2b2ef659"}, + {file = "mirakuru-2.6.0.tar.gz", hash = "sha256:3256fcf81ef090a30be97a8ce50ff0c178292d7e542866c5fedc5ae6801e3a17"}, ] [package.dependencies] psutil = {version = ">=4.0.0", markers = "sys_platform != \"cygwin\""} +[[package]] +name = "mock-gcp" +version = "0.2.0" +description = "A library that allows to mock out GCP services in unit tests." +optional = false +python-versions = "<3.14,>=3.9" +groups = ["dev"] +files = [] +develop = false + +[package.dependencies] +google-cloud-storage = ">=2.4,<3.0" + +[package.source] +type = "git" +url = "https://github.com/millin/mock-gcp.git" +reference = "0d972df9b6cce164b49f09ec4417a4eb77beb960" +resolved_reference = "0d972df9b6cce164b49f09ec4417a4eb77beb960" + [[package]] name = "more-itertools" version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -4369,15 +5638,14 @@ files = [ [[package]] name = "moto" -version = "5.0.28" +version = "5.1.1" description = "A library that allows you to easily mock out tests based on AWS infrastructure" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "moto-5.0.28-py3-none-any.whl", hash = "sha256:2dfbea1afe3b593e13192059a1a7fc4b3cf7fdf92e432070c22346efa45aa0f0"}, - {file = "moto-5.0.28.tar.gz", hash = "sha256:4d3437693411ec943c13c77de5b0b520c4b0a9ac850fead4ba2a54709e086e8b"}, + {file = "moto-5.1.1-py3-none-any.whl", hash = "sha256:615904d6210431950a59a2bdec365d60e791eacbe3dd07a3a5d742c88ef847dd"}, + {file = "moto-5.1.1.tar.gz", hash = "sha256:5b25dbc62cccd9f36ef062c870db49d976b241129024fab049e2d3d1296e2a57"}, ] [package.dependencies] @@ -4392,7 +5660,7 @@ werkzeug = ">=0.5,<2.2.0 || >2.2.0,<2.2.1 || >2.2.1" xmltodict = "*" [package.extras] -all = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "graphql-core", "joserfc (>=0.9.0)", "jsonpath-ng", "jsonschema", "multipart", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] +all = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "graphql-core", "joserfc (>=0.9.0)", "jsonpath_ng", "jsonschema", "multipart", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] apigateway = ["PyYAML (>=5.1)", "joserfc (>=0.9.0)", "openapi-spec-validator (>=0.5.0)"] apigatewayv2 = ["PyYAML (>=5.1)", "openapi-spec-validator (>=0.5.0)"] appsync = ["graphql-core"] @@ -4402,26 +5670,25 @@ cloudformation = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (> cognitoidp = ["joserfc (>=0.9.0)"] dynamodb = ["docker (>=3.0.0)", "py-partiql-parser (==0.6.1)"] dynamodbstreams = ["docker (>=3.0.0)", "py-partiql-parser (==0.6.1)"] -events = ["jsonpath-ng"] +events = ["jsonpath_ng"] glue = ["pyparsing (>=3.0.7)"] -proxy = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=2.5.1)", "graphql-core", "joserfc (>=0.9.0)", "jsonpath-ng", "multipart", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] +proxy = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=2.5.1)", "graphql-core", "joserfc (>=0.9.0)", "jsonpath_ng", "multipart", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] quicksight = ["jsonschema"] resourcegroupstaggingapi = ["PyYAML (>=5.1)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "graphql-core", "joserfc (>=0.9.0)", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)"] s3 = ["PyYAML (>=5.1)", "py-partiql-parser (==0.6.1)"] s3crc32c = ["PyYAML (>=5.1)", "crc32c", "py-partiql-parser (==0.6.1)"] -server = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "flask (!=2.2.0,!=2.2.1)", "flask-cors", "graphql-core", "joserfc (>=0.9.0)", "jsonpath-ng", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] +server = ["PyYAML (>=5.1)", "antlr4-python3-runtime", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "flask (!=2.2.0,!=2.2.1)", "flask-cors", "graphql-core", "joserfc (>=0.9.0)", "jsonpath_ng", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.6.1)", "pyparsing (>=3.0.7)", "setuptools"] ssm = ["PyYAML (>=5.1)"] -stepfunctions = ["antlr4-python3-runtime", "jsonpath-ng"] +stepfunctions = ["antlr4-python3-runtime", "jsonpath_ng"] xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] name = "msgpack" version = "1.1.0" description = "MessagePack serializer" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, @@ -4496,7 +5763,6 @@ description = "multidict implementation" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -4602,7 +5868,6 @@ description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -4652,15 +5917,14 @@ reports = ["lxml"] [[package]] name = "mypy-boto3-s3" -version = "1.36.9" -description = "Type annotations for boto3 S3 1.36.9 service generated with mypy-boto3-builder 8.8.0" +version = "1.37.0" +description = "Type annotations for boto3 S3 1.37.0 service generated with mypy-boto3-builder 8.9.2" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "mypy_boto3_s3-1.36.9-py3-none-any.whl", hash = "sha256:506edd56892452dff5b673e3c79a11b6f8935076ce4a9daaac4cda708a176201"}, - {file = "mypy_boto3_s3-1.36.9.tar.gz", hash = "sha256:368c963969eda65bb3a9df61e87510dd8b3247cce59f559c2ec6c43d5796bef5"}, + {file = "mypy_boto3_s3-1.37.0-py3-none-any.whl", hash = "sha256:d2b702649d7ebb2bd2b8f574fd51b35fc2a2ec4a8efb590db5eb0d0d9f74be6f"}, + {file = "mypy_boto3_s3-1.37.0.tar.gz", hash = "sha256:bc6ec4cbbd8e0206143d9b1f24927e086a2467a2c6a641feb978599d75954e82"}, ] [package.dependencies] @@ -4673,7 +5937,6 @@ description = "Type system extensions for programs checked with the mypy type ch optional = false python-versions = ">=3.5" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -4683,10 +5946,10 @@ files = [ name = "networkx" version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -4699,6 +5962,27 @@ doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9. extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] +[[package]] +name = "networkx" +version = "3.4.2" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, + {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, +] + +[package.extras] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + [[package]] name = "nodeenv" version = "1.9.1" @@ -4706,7 +5990,6 @@ description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -4714,125 +5997,66 @@ files = [ [[package]] name = "numpy" -version = "2.0.2" +version = "1.26.4" description = "Fundamental package for array computing in Python" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version < \"3.11\"" -files = [ - {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, - {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, - {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, - {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, - {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, - {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, - {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, - {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, - {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, - {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +groups = ["main", "dev"] +files = [ + {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 = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, ] -[[package]] -name = "numpy" -version = "2.2.2" -description = "Fundamental package for array computing in Python" -optional = true -python-versions = ">=3.10" -groups = ["main", "adapters"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, - {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, - {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, - {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, - {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, - {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, - {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, - {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, - {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, - {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, - {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, - {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, -] +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "opentelemetry-api" @@ -4841,7 +6065,6 @@ description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09"}, {file = "opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240"}, @@ -4858,7 +6081,6 @@ description = "OpenTelemetry Collector Exporters" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_exporter_otlp-1.30.0-py3-none-any.whl", hash = "sha256:44e11054ec571ccfed73a83c6429dee5d334d061d0e0572e3160d6de97156dbc"}, {file = "opentelemetry_exporter_otlp-1.30.0.tar.gz", hash = "sha256:da7769f95cd5be5b09dd4188ac153a33709eda652217f2d10aed6518c8e60f0d"}, @@ -4875,7 +6097,6 @@ description = "OpenTelemetry Protobuf encoding" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_exporter_otlp_proto_common-1.30.0-py3-none-any.whl", hash = "sha256:5468007c81aa9c44dc961ab2cf368a29d3475977df83b4e30aeed42aa7bc3b38"}, {file = "opentelemetry_exporter_otlp_proto_common-1.30.0.tar.gz", hash = "sha256:ddbfbf797e518411857d0ca062c957080279320d6235a279f7b64ced73c13897"}, @@ -4891,7 +6112,6 @@ description = "OpenTelemetry Collector Protobuf over gRPC Exporter" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0-py3-none-any.whl", hash = "sha256:2906bcae3d80acc54fd1ffcb9e44d324e8631058b502ebe4643ca71d1ff30830"}, {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0.tar.gz", hash = "sha256:d0f10f0b9b9a383b7d04a144d01cb280e70362cccc613987e234183fd1f01177"}, @@ -4913,7 +6133,6 @@ description = "OpenTelemetry Collector Protobuf over HTTP Exporter" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_exporter_otlp_proto_http-1.30.0-py3-none-any.whl", hash = "sha256:9578e790e579931c5ffd50f1e6975cbdefb6a0a0a5dea127a6ae87df10e0a589"}, {file = "opentelemetry_exporter_otlp_proto_http-1.30.0.tar.gz", hash = "sha256:c3ae75d4181b1e34a60662a6814d0b94dd33b628bee5588a878bed92cee6abdc"}, @@ -4935,7 +6154,6 @@ description = "OpenTelemetry Python Proto" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_proto-1.30.0-py3-none-any.whl", hash = "sha256:c6290958ff3ddacc826ca5abbeb377a31c2334387352a259ba0df37c243adc11"}, {file = "opentelemetry_proto-1.30.0.tar.gz", hash = "sha256:afe5c9c15e8b68d7c469596e5b32e8fc085eb9febdd6fb4e20924a93a0389179"}, @@ -4951,7 +6169,6 @@ description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091"}, {file = "opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18"}, @@ -4969,7 +6186,6 @@ description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae"}, {file = "opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47"}, @@ -4985,8 +6201,7 @@ version = "4.1.0" description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, @@ -5001,8 +6216,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -5010,91 +6224,102 @@ files = [ [[package]] name = "pandas" -version = "2.2.3" +version = "2.1.4" description = "Powerful data structures for data analysis, time series, and statistics" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, - {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, - {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, - {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, - {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, - {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, - {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, - {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +groups = ["main", "dev"] +files = [ + {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, + {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, + {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, + {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, + {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, + {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, + {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, + {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, + {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, + {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, + {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, ] [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] 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)"] -pyarrow = ["pyarrow (>=10.0.1)"] -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-gbq" +version = "0.28.0" +description = "Google BigQuery connector for pandas" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "pandas_gbq-0.28.0-py2.py3-none-any.whl", hash = "sha256:6be441dff24cde87ebf1e61ee66a3a7c51c4894aa1db0f9983a2c927f57caad3"}, + {file = "pandas_gbq-0.28.0.tar.gz", hash = "sha256:daa4ffb80c1c262185059adb4551ac0cc52013ca3b7ab72c11cec1011f242ae5"}, +] + +[package.dependencies] +db-dtypes = ">=1.0.4,<2.0.0" +google-api-core = ">=2.10.2,<3.0.0dev" +google-auth = ">=2.13.0" +google-auth-oauthlib = ">=0.7.0" +google-cloud-bigquery = ">=3.4.2,<4.0.0dev" +numpy = ">=1.18.1" +packaging = ">=22.0.0" +pandas = ">=1.1.4" +pyarrow = ">=4.0.0" +pydata-google-auth = ">=1.5.0" +setuptools = "*" + +[package.extras] +bqstorage = ["google-cloud-bigquery-storage (>=2.16.2,<3.0.0dev)"] +geopandas = ["Shapely (>=1.8.4)", "geopandas (>=0.9.0)"] +tqdm = ["tqdm (>=4.23.0)"] [[package]] name = "paramiko" @@ -5103,7 +6328,6 @@ description = "SSH2 protocol library" optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61"}, {file = "paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822"}, @@ -5115,18 +6339,17 @@ cryptography = ">=3.3" pynacl = ">=1.5" [package.extras] -all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +all = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] +gssapi = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] invoke = ["invoke (>=2.0)"] [[package]] name = "parsedatetime" version = "2.6" description = "Parse human-readable date/time text." -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "parsedatetime-2.6-py3-none-any.whl", hash = "sha256:cb96edd7016872f58479e35879294258c71437195760746faffedb692aef000b"}, {file = "parsedatetime-2.6.tar.gz", hash = "sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455"}, @@ -5138,8 +6361,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -5152,7 +6374,6 @@ description = "Python datetimes made easy" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, @@ -5244,7 +6465,7 @@ python-dateutil = ">=2.6" tzdata = ">=2020.1" [package.extras] -test = ["time-machine (>=2.6.0)"] +test = ["time-machine (>=2.6.0) ; implementation_name != \"pypy\""] [[package]] name = "platformdirs" @@ -5252,12 +6473,12 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] +markers = {main = "extra == \"adapters\" or extra == \"snowflake\""} [package.extras] docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] @@ -5271,7 +6492,6 @@ description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -5288,7 +6508,6 @@ description = "Python Lex & Yacc" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -5301,7 +6520,6 @@ description = "Utility that helps with local TCP ports management. It can find a optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "port_for-0.7.4-py3-none-any.whl", hash = "sha256:08404aa072651a53dcefe8d7a598ee8a1dca320d9ac44ac464da16ccf2a02c4a"}, {file = "port_for-0.7.4.tar.gz", hash = "sha256:fc7713e7b22f89442f335ce12536653656e8f35146739eccaeff43d28436028d"}, @@ -5314,7 +6532,6 @@ description = "A framework for managing and maintaining multi-language pre-commi optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"}, {file = "pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4"}, @@ -5334,7 +6551,6 @@ description = "Rison encoder/decoder" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "prison-0.2.1-py2.py3-none-any.whl", hash = "sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5"}, {file = "prison-0.2.1.tar.gz", hash = "sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599"}, @@ -5348,105 +6564,119 @@ dev = ["nose", "pipreqs", "twine"] [[package]] name = "propcache" -version = "0.2.1" +version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, - {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, - {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, - {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, - {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, - {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, - {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, - {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, - {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, - {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, - {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, - {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, - {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +files = [ + {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, + {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, + {file = "propcache-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc"}, + {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d"}, + {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f"}, + {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf"}, + {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9"}, + {file = "propcache-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25"}, + {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f"}, + {file = "propcache-0.3.0-cp310-cp310-win32.whl", hash = "sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c"}, + {file = "propcache-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340"}, + {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51"}, + {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e"}, + {file = "propcache-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa"}, + {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf"}, + {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b"}, + {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9"}, + {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6"}, + {file = "propcache-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7"}, + {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c"}, + {file = "propcache-0.3.0-cp311-cp311-win32.whl", hash = "sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d"}, + {file = "propcache-0.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32"}, + {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e"}, + {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af"}, + {file = "propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5"}, + {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b"}, + {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667"}, + {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7"}, + {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7"}, + {file = "propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64"}, + {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c"}, + {file = "propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d"}, + {file = "propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57"}, + {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568"}, + {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9"}, + {file = "propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767"}, + {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8"}, + {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0"}, + {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d"}, + {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05"}, + {file = "propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e"}, + {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626"}, + {file = "propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374"}, + {file = "propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a"}, + {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf"}, + {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0"}, + {file = "propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829"}, + {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa"}, + {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6"}, + {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db"}, + {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54"}, + {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e"}, + {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf"}, + {file = "propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863"}, + {file = "propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46"}, + {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03c091bb752349402f23ee43bb2bff6bd80ccab7c9df6b88ad4322258d6960fc"}, + {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46ed02532cb66612d42ae5c3929b5e98ae330ea0f3900bc66ec5f4862069519b"}, + {file = "propcache-0.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11ae6a8a01b8a4dc79093b5d3ca2c8a4436f5ee251a9840d7790dccbd96cb649"}, + {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df03cd88f95b1b99052b52b1bb92173229d7a674df0ab06d2b25765ee8404bce"}, + {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03acd9ff19021bd0567582ac88f821b66883e158274183b9e5586f678984f8fe"}, + {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd54895e4ae7d32f1e3dd91261df46ee7483a735017dc6f987904f194aa5fd14"}, + {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a67e5c04e3119594d8cfae517f4b9330c395df07ea65eab16f3d559b7068fe"}, + {file = "propcache-0.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee25f1ac091def37c4b59d192bbe3a206298feeb89132a470325bf76ad122a1e"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58e6d2a5a7cb3e5f166fd58e71e9a4ff504be9dc61b88167e75f835da5764d07"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:be90c94570840939fecedf99fa72839aed70b0ced449b415c85e01ae67422c90"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49ea05212a529c2caffe411e25a59308b07d6e10bf2505d77da72891f9a05641"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:119e244ab40f70a98c91906d4c1f4c5f2e68bd0b14e7ab0a06922038fae8a20f"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:507c5357a8d8b4593b97fb669c50598f4e6cccbbf77e22fa9598aba78292b4d7"}, + {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8526b0941ec5a40220fc4dfde76aed58808e2b309c03e9fa8e2260083ef7157f"}, + {file = "propcache-0.3.0-cp39-cp39-win32.whl", hash = "sha256:7cedd25e5f678f7738da38037435b340694ab34d424938041aa630d8bac42663"}, + {file = "propcache-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf4298f366ca7e1ad1d21bbb58300a6985015909964077afd37559084590c929"}, + {file = "propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043"}, + {file = "propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5"}, ] [[package]] name = "proto-plus" version = "1.26.0" description = "Beautiful, Pythonic protocol buffers" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "proto_plus-1.26.0-py3-none-any.whl", hash = "sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7"}, {file = "proto_plus-1.26.0.tar.gz", hash = "sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22"}, @@ -5464,8 +6694,7 @@ version = "5.29.3" description = "" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -5482,47 +6711,38 @@ files = [ [[package]] name = "psutil" -version = "6.1.1" -description = "Cross-platform lib for process and system monitoring in Python." +version = "7.0.0" +description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, - {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, - {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, - {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, - {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, - {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, - {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, - {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, - {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, - {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, - {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, - {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, - {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, - {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, -] - -[package.extras] -dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +files = [ + {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, + {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, + {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, + {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, + {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, + {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, +] + +[package.extras] +dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "psycopg" -version = "3.2.4" +version = "3.2.5" description = "PostgreSQL database adapter for Python" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "psycopg-3.2.4-py3-none-any.whl", hash = "sha256:43665368ccd48180744cab26b74332f46b63b7e06e8ce0775547a3533883d381"}, - {file = "psycopg-3.2.4.tar.gz", hash = "sha256:f26f1346d6bf1ef5f5ef1714dd405c67fb365cfd1c6cea07de1792747b167b92"}, + {file = "psycopg-3.2.5-py3-none-any.whl", hash = "sha256:b782130983e5b3de30b4c529623d3687033b4dafa05bb661fc6bf45837ca5879"}, + {file = "psycopg-3.2.5.tar.gz", hash = "sha256:f5f750611c67cb200e85b408882f29265c66d1de7f813add4f8125978bfd70e8"}, ] [package.dependencies] @@ -5530,9 +6750,9 @@ typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.2.4)"] -c = ["psycopg-c (==3.2.4)"] -dev = ["ast-comments (>=1.1.2)", "black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.14)", "pre-commit (>=4.0.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +binary = ["psycopg-binary (==3.2.5) ; implementation_name != \"pypy\""] +c = ["psycopg-c (==3.2.5) ; implementation_name != \"pypy\""] +dev = ["ast-comments (>=1.1.2)", "black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "isort-psycopg", "isort[colors] (>=6.0)", "mypy (>=1.14)", "pre-commit (>=4.0.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 (>=4.0)", "mypy (>=1.14)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] @@ -5543,8 +6763,8 @@ version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"redshift\" or extra == \"postgres\"" files = [ {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, @@ -5593,7 +6813,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -5616,57 +6835,85 @@ files = [ {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] +[[package]] +name = "pure-sasl" +version = "0.6.2" +description = "Pure Python client SASL implementation" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "pure-sasl-0.6.2.tar.gz", hash = "sha256:53c1355f5da95e2b85b2cc9a6af435518edc20c81193faa0eea65fdc835138f4"}, + {file = "pure_sasl-0.6.2-py2-none-any.whl", hash = "sha256:edb33b1a46eb3c602c0166de0442c0fb41f5ac2bfccbde4775183b105ad89ab2"}, +] + +[package.extras] +gssapi = ["kerberos (>=1.3.0)"] + +[[package]] +name = "py4j" +version = "0.10.9.7" +description = "Enables Python programs to dynamically access arbitrary Java objects" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, + {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, +] + [[package]] name = "pyarrow" -version = "19.0.0" +version = "19.0.1" description = "Python library for Apache Arrow" -optional = true +optional = false python-versions = ">=3.9" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pyarrow-19.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c318eda14f6627966997a7d8c374a87d084a94e4e38e9abbe97395c215830e0c"}, - {file = "pyarrow-19.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:62ef8360ff256e960f57ce0299090fb86423afed5e46f18f1225f960e05aae3d"}, - {file = "pyarrow-19.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2795064647add0f16563e57e3d294dbfc067b723f0fd82ecd80af56dad15f503"}, - {file = "pyarrow-19.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a218670b26fb1bc74796458d97bcab072765f9b524f95b2fccad70158feb8b17"}, - {file = "pyarrow-19.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:66732e39eaa2247996a6b04c8aa33e3503d351831424cdf8d2e9a0582ac54b34"}, - {file = "pyarrow-19.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e675a3ad4732b92d72e4d24009707e923cab76b0d088e5054914f11a797ebe44"}, - {file = "pyarrow-19.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:f094742275586cdd6b1a03655ccff3b24b2610c3af76f810356c4c71d24a2a6c"}, - {file = "pyarrow-19.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8e3a839bf36ec03b4315dc924d36dcde5444a50066f1c10f8290293c0427b46a"}, - {file = "pyarrow-19.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ce42275097512d9e4e4a39aade58ef2b3798a93aa3026566b7892177c266f735"}, - {file = "pyarrow-19.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9348a0137568c45601b031a8d118275069435f151cbb77e6a08a27e8125f59d4"}, - {file = "pyarrow-19.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0144a712d990d60f7f42b7a31f0acaccf4c1e43e957f7b1ad58150d6f639c1"}, - {file = "pyarrow-19.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2a1a109dfda558eb011e5f6385837daffd920d54ca00669f7a11132d0b1e6042"}, - {file = "pyarrow-19.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:be686bf625aa7b9bada18defb3a3ea3981c1099697239788ff111d87f04cd263"}, - {file = "pyarrow-19.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:239ca66d9a05844bdf5af128861af525e14df3c9591bcc05bac25918e650d3a2"}, - {file = "pyarrow-19.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a7bbe7109ab6198688b7079cbad5a8c22de4d47c4880d8e4847520a83b0d1b68"}, - {file = "pyarrow-19.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:4624c89d6f777c580e8732c27bb8e77fd1433b89707f17c04af7635dd9638351"}, - {file = "pyarrow-19.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b6d3ce4288793350dc2d08d1e184fd70631ea22a4ff9ea5c4ff182130249d9b"}, - {file = "pyarrow-19.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450a7d27e840e4d9a384b5c77199d489b401529e75a3b7a3799d4cd7957f2f9c"}, - {file = "pyarrow-19.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a08e2a8a039a3f72afb67a6668180f09fddaa38fe0d21f13212b4aba4b5d2451"}, - {file = "pyarrow-19.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f43f5aef2a13d4d56adadae5720d1fed4c1356c993eda8b59dace4b5983843c1"}, - {file = "pyarrow-19.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f672f5364b2d7829ef7c94be199bb88bf5661dd485e21d2d37de12ccb78a136"}, - {file = "pyarrow-19.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:cf3bf0ce511b833f7bc5f5bb3127ba731e97222023a444b7359f3a22e2a3b463"}, - {file = "pyarrow-19.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:4d8b0c0de0a73df1f1bf439af1b60f273d719d70648e898bc077547649bb8352"}, - {file = "pyarrow-19.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92aff08e23d281c69835e4a47b80569242a504095ef6a6223c1f6bb8883431d"}, - {file = "pyarrow-19.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3b78eff5968a1889a0f3bc81ca57e1e19b75f664d9c61a42a604bf9d8402aae"}, - {file = "pyarrow-19.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b34d3bde38eba66190b215bae441646330f8e9da05c29e4b5dd3e41bde701098"}, - {file = "pyarrow-19.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5418d4d0fab3a0ed497bad21d17a7973aad336d66ad4932a3f5f7480d4ca0c04"}, - {file = "pyarrow-19.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e82c3d5e44e969c217827b780ed8faf7ac4c53f934ae9238872e749fa531f7c9"}, - {file = "pyarrow-19.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f208c3b58a6df3b239e0bb130e13bc7487ed14f39a9ff357b6415e3f6339b560"}, - {file = "pyarrow-19.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:c751c1c93955b7a84c06794df46f1cec93e18610dcd5ab7d08e89a81df70a849"}, - {file = "pyarrow-19.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b903afaa5df66d50fc38672ad095806443b05f202c792694f3a604ead7c6ea6e"}, - {file = "pyarrow-19.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22a4bc0937856263df8b94f2f2781b33dd7f876f787ed746608e06902d691a5"}, - {file = "pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:5e8a28b918e2e878c918f6d89137386c06fe577cd08d73a6be8dafb317dc2d73"}, - {file = "pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89"}, - {file = "pyarrow-19.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c0423393e4a07ff6fea08feb44153302dd261d0551cc3b538ea7a5dc853af43a"}, - {file = "pyarrow-19.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:718947fb6d82409013a74b176bf93e0f49ef952d8a2ecd068fecd192a97885b7"}, - {file = "pyarrow-19.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1c162c4660e0978411a4761f91113dde8da3433683efa473501254563dcbe8"}, - {file = "pyarrow-19.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c73268cf557e688efb60f1ccbc7376f7e18cd8e2acae9e663e98b194c40c1a2d"}, - {file = "pyarrow-19.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:edfe6d3916e915ada9acc4e48f6dafca7efdbad2e6283db6fd9385a1b23055f1"}, - {file = "pyarrow-19.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:da410b70a7ab8eb524112f037a7a35da7128b33d484f7671a264a4c224ac131d"}, - {file = "pyarrow-19.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:597360ffc71fc8cceea1aec1fb60cb510571a744fffc87db33d551d5de919bec"}, - {file = "pyarrow-19.0.0.tar.gz", hash = "sha256:8d47c691765cf497aaeed4954d226568563f1b3b74ff61139f2d77876717084b"}, +groups = ["main", "dev"] +files = [ + {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, + {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, + {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89"}, + {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a"}, + {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a"}, + {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608"}, + {file = "pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866"}, + {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90"}, + {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00"}, + {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae"}, + {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5"}, + {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3"}, + {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6"}, + {file = "pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466"}, + {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b"}, + {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294"}, + {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14"}, + {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34"}, + {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6"}, + {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832"}, + {file = "pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960"}, + {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c"}, + {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae"}, + {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4"}, + {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2"}, + {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6"}, + {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136"}, + {file = "pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef"}, + {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0"}, + {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9"}, + {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3"}, + {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6"}, + {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a"}, + {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8"}, + {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46"}, + {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755"}, + {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8"}, + {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972"}, + {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f"}, + {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911"}, + {file = "pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429"}, + {file = "pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e"}, ] [package.extras] @@ -5676,10 +6923,9 @@ test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] name = "pyasn1" version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -5687,15 +6933,14 @@ files = [ [[package]] name = "pyasn1-modules" -version = "0.4.1" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, - {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] @@ -5708,7 +6953,6 @@ description = "Python DB API 2.0 (PEP 249) client for Amazon Athena" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyathena-3.12.2-py3-none-any.whl", hash = "sha256:f27f89a04c2278a6e898c25a1ef64892bfacfb38134b5c69f646a5034dd67eb6"}, {file = "pyathena-3.12.2.tar.gz", hash = "sha256:035ebad637c64c26fc83c1da87b46134e52c58c95186899f9ec6b110c4ea8658"}, @@ -5733,8 +6977,7 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -5744,10 +6987,9 @@ files = [ name = "pydantic" version = "2.10.6" description = "Data validation using Python type hints" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -5760,16 +7002,15 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" -optional = true +optional = false python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -5876,6 +7117,23 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydata-google-auth" +version = "1.9.1" +description = "PyData helpers for authenticating to Google APIs" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "pydata-google-auth-1.9.1.tar.gz", hash = "sha256:0a51ce41c601ca0bc69b8795bf58bedff74b4a6a007c9106c7cbcdec00eaced2"}, + {file = "pydata_google_auth-1.9.1-py2.py3-none-any.whl", hash = "sha256:75ffce5d106e34b717b31844c1639ea505b7d9550dc23b96fb6c20d086b53fa3"}, +] + +[package.dependencies] +google-auth = ">=1.25.0,<3.0dev" +google-auth-oauthlib = ">=0.4.0" +setuptools = "*" + [[package]] name = "pygments" version = "2.19.1" @@ -5883,7 +7141,6 @@ description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" groups = ["main", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -5892,14 +7149,40 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyhive" +version = "0.7.0" +description = "Python interface to Hive" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "PyHive-0.7.0.tar.gz", hash = "sha256:585beff9578a61b99aed47140fec97e26323e8c685a5b5d0c8550a8ebf8a24e0"}, +] + +[package.dependencies] +future = "*" +pure-sasl = {version = ">=0.6.2", optional = true, markers = "extra == \"hive_pure_sasl\""} +python-dateutil = "*" +thrift = {version = ">=0.10.0", optional = true, markers = "extra == \"hive_pure_sasl\""} +thrift_sasl = {version = ">=0.1.0", optional = true, markers = "extra == \"hive_pure_sasl\""} + +[package.extras] +hive = ["sasl (>=0.2.1)", "thrift (>=0.10.0)", "thrift_sasl (>=0.1.0)"] +hive-pure-sasl = ["pure-sasl (>=0.6.2)", "thrift (>=0.10.0)", "thrift_sasl (>=0.1.0)"] +kerberos = ["requests_kerberos (>=0.12.0)"] +presto = ["requests (>=1.0.0)"] +sqlalchemy = ["sqlalchemy (>=1.3.0)"] +trino = ["requests (>=1.0.0)"] + [[package]] name = "pyjwt" version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -5918,7 +7201,6 @@ description = "Python binding to the Networking and Cryptography (NaCl) library" optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, @@ -5939,37 +7221,115 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pyodbc" +version = "5.1.0" +description = "DB API module for ODBC" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "pyodbc-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02fe9821711a2d14415eaeb4deab471d2c8b7034b107e524e414c0e133c42248"}, + {file = "pyodbc-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2cbdbd019756285dc44bc35238a3ed8dfaa454e8c8b2c3462f1710cfeebfb290"}, + {file = "pyodbc-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84df3bbce9bafe65abd25788d55c9f1da304f6115d70f25758ff8c85f3ce0517"}, + {file = "pyodbc-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218bb75d4bc67075529a65ce8ec7daeed1d83c33dd7410450fbf68d43d184d28"}, + {file = "pyodbc-5.1.0-cp310-cp310-win32.whl", hash = "sha256:eae576b3b67d21d6f237e18bb5f3df8323a2258f52c3e3afeef79269704072a9"}, + {file = "pyodbc-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3b65343557f4c7753204e06f4c82c97ed212a636501f4bc27c5ce0e549eb3e8"}, + {file = "pyodbc-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa6f46377da303bf79bcb4b559899507df4b2559f30dcfdf191358ee4b99f3ab"}, + {file = "pyodbc-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b19d7f44cfee89901e482f554a88177e83fae76b03c3f830e0023a195d840220"}, + {file = "pyodbc-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c36448322f8d6479d87c528cf52401a6ea4f509b9637750b67340382b4e1b40"}, + {file = "pyodbc-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c5e0cb79222aad4b31a3602e39b242683c29c6221a16ed43f45f18fd0b73659"}, + {file = "pyodbc-5.1.0-cp311-cp311-win32.whl", hash = "sha256:92caed9d445815ed3f7e5a1249e29a4600ebc1e99404df81b6ed7671074c9227"}, + {file = "pyodbc-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1bd14633e91b7a9814f4fd944c9ebb89fb7f1fd4710c4e3999b5ef041536347"}, + {file = "pyodbc-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3d9cc4af703c4817b6e604315910b0cf5dcb68056d52b25ca072dd59c52dcbc"}, + {file = "pyodbc-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:406b8fa2133a7b6a713aa5187dba2d08cf763b5884606bed77610a7660fdfabe"}, + {file = "pyodbc-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8488c3818f12207650836c5c6f7352f9ff9f56a05a05512145995e497c0bbb1"}, + {file = "pyodbc-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0df69e3a500791b70b5748c68a79483b24428e4c16027b56aa0305e95c143a4"}, + {file = "pyodbc-5.1.0-cp312-cp312-win32.whl", hash = "sha256:aa4e02d3a9bf819394510b726b25f1566f8b3f0891ca400ad2d4c8b86b535b78"}, + {file = "pyodbc-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:33f4984af38872e7bdec78007a34e4d43ae72bf9d0bae3344e79d9d0db157c0e"}, + {file = "pyodbc-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29425e2d366e7f5828b76c7993f412a3db4f18bd5bcee00186c00b5a5965e205"}, + {file = "pyodbc-5.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2bbd2e75c77dee9f3cd100c3246110abaeb9af3f7fa304ccc2934ff9c6a4fa4"}, + {file = "pyodbc-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3602136a936bc0c1bb9722eb2fbf2042b3ff1ddccdc4688e514b82d4b831563b"}, + {file = "pyodbc-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bed1c843565d3a4fd8c332ebceaf33efe817657a0505eacb97dd1b786a985b0b"}, + {file = "pyodbc-5.1.0-cp38-cp38-win32.whl", hash = "sha256:735f6da3762e5856b5580be0ed96bb946948346ebd1e526d5169a5513626a67a"}, + {file = "pyodbc-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c5bb4e43f6c72f5fa2c634570e0d761767d8ea49f39205229b812fb4d3fe05aa"}, + {file = "pyodbc-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33f0f1d7764cefef6f787936bd6359670828a6086be67518ab951f1f7f503cda"}, + {file = "pyodbc-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be3b1c36c31ec7d73d0b34a8ad8743573763fadd8f2bceef1e84408252b48dce"}, + {file = "pyodbc-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e71a51c252b503b4d753e21ed31e640015fc0d00202d42ea42f2396fcc924b4a"}, + {file = "pyodbc-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af5282cc8b667af97d76f4955250619a53f25486cbb6b1f45a06b781006ffa0b"}, + {file = "pyodbc-5.1.0-cp39-cp39-win32.whl", hash = "sha256:96b2a8dc27693a517e3aad3944a7faa8be95d40d7ec1eda51a1885162eedfa33"}, + {file = "pyodbc-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:e738c5eedb4a0cbab20cc008882f49b106054499db56864057c2530ff208cf32"}, + {file = "pyodbc-5.1.0.tar.gz", hash = "sha256:397feee44561a6580be08cedbe986436859563f4bb378f48224655c8e987ea60"}, +] + [[package]] name = "pyopenssl" -version = "24.3.0" +version = "25.0.0" description = "Python wrapper module around the OpenSSL library" -optional = true +optional = false python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a"}, - {file = "pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36"}, + {file = "pyOpenSSL-25.0.0-py3-none-any.whl", hash = "sha256:424c247065e46e76a37411b9ab1782541c23bb658bf003772c3405fbaa128e90"}, + {file = "pyopenssl-25.0.0.tar.gz", hash = "sha256:cd2cef799efa3936bb08e8ccb9433a575722b9dd986023f1cabc4ae64e9dac16"}, ] [package.dependencies] cryptography = ">=41.0.5,<45" +typing-extensions = {version = ">=4.9", markers = "python_version < \"3.13\" and python_version >= \"3.8\""} [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx_rtd_theme"] test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyspark" +version = "3.5.5" +description = "Apache Spark Python API" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "pyspark-3.5.5.tar.gz", hash = "sha256:6effc9ce98edf231f4d683fd14f7270629bf8458c628d6a2620ded4bb34f3cb9"}, +] + +[package.dependencies] +py4j = "0.10.9.7" + +[package.extras] +connect = ["googleapis-common-protos (>=1.56.4)", "grpcio (>=1.56.0)", "grpcio-status (>=1.56.0)", "numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] +ml = ["numpy (>=1.15,<2)"] +mllib = ["numpy (>=1.15,<2)"] +pandas-on-spark = ["numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] +sql = ["numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] + [[package]] name = "pytest" -version = "8.3.4" +version = "8.3.5" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, - {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, ] [package.dependencies] @@ -5983,25 +7343,42 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "pytest-postgresql" -version = "6.1.1" +version = "7.0.0" description = "Postgresql fixtures and fixture factories for Pytest." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pytest_postgresql-6.1.1-py3-none-any.whl", hash = "sha256:bd4c0970d25685ac3d34d42263fcbfbf134bf02d22519fce7e1ccf4122d8b99a"}, - {file = "pytest_postgresql-6.1.1.tar.gz", hash = "sha256:f996637367e6aecebba1349da52eea95340bdb434c90e4b79739e62c656056e2"}, + {file = "pytest_postgresql-7.0.0-py3-none-any.whl", hash = "sha256:aaebadbf060b85cca7755fdf5ed7aa2929edd0f842c9b7f56ffe1e58e0d3b749"}, + {file = "pytest_postgresql-7.0.0.tar.gz", hash = "sha256:cf0016cee5d9ac06f50cfc61bb0597d1fa90780d77c4453bc18e4930cae04aaa"}, ] [package.dependencies] -mirakuru = "*" +mirakuru = ">=2.6.0" +packaging = "*" port-for = ">=0.7.3" psycopg = ">=3.0.0" pytest = ">=6.2" -setuptools = "*" [[package]] name = "python-daemon" @@ -6010,7 +7387,6 @@ description = "Library to implement a well-behaved Unix daemon process." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "python_daemon-3.1.2-py3-none-any.whl", hash = "sha256:b906833cef63502994ad48e2eab213259ed9bb18d54fa8774dcba2ff7864cec6"}, {file = "python_daemon-3.1.2.tar.gz", hash = "sha256:f7b04335adc473de877f5117e26d5f1142f4c9f7cd765408f0877757be5afbf4"}, @@ -6032,8 +7408,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -6049,7 +7424,6 @@ description = "Python NVD3 - Chart Library for d3.js" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "python-nvd3-0.16.0.tar.gz", hash = "sha256:0115887289b3f751716ddd05c7b53ac5f05e71201e52496decdac453a50dcf7e"}, ] @@ -6064,8 +7438,7 @@ version = "8.0.4" description = "A Python slugify application that also handles Unicode" optional = false python-versions = ">=3.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, @@ -6084,7 +7457,6 @@ description = "Saml Python Toolkit. Add SAML support to your Python software usi optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "python3-saml-1.16.0.tar.gz", hash = "sha256:97c9669aecabc283c6e5fb4eb264f446b6e006f5267d01c9734f9d8bffdac133"}, {file = "python3_saml-1.16.0-py2-none-any.whl", hash = "sha256:c49097863c278ff669a337a96c46dc1f25d16307b4bb2679d2d1733cc4f5176a"}, @@ -6103,10 +7475,9 @@ test = ["coverage (>=4.5.2)", "flake8 (>=3.6.0,<=5.0.0)", "freezegun (>=0.3.11,< name = "pytimeparse" version = "1.1.8" description = "Time expression parser" -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ {file = "pytimeparse-1.1.8-py2.py3-none-any.whl", hash = "sha256:04b7be6cc8bd9f5647a6325444926c3ac34ee6bc7e69da4367ba282f076036bd"}, {file = "pytimeparse-1.1.8.tar.gz", hash = "sha256:e86136477be924d7e670646a98561957e8ca7308d44841e21f5ddea757556a0a"}, @@ -6118,8 +7489,7 @@ version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, @@ -6131,8 +7501,8 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = true python-versions = ">=3.6" -groups = ["main", "adapters"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"win32\"" +groups = ["main"] +markers = "(extra == \"adapters\" or extra == \"snowflake\") and sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -6144,8 +7514,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -6208,8 +7577,7 @@ version = "2.1.5" description = "Redshift interface library" optional = false python-versions = ">=3.6" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "redshift_connector-2.1.5-py3-none-any.whl", hash = "sha256:a90e5644a1d8f58f9d6d62c6ee000bb7788dcbfb9c9b3b4e114d66ccbfc82478"}, ] @@ -6234,8 +7602,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -6252,8 +7619,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -6269,6 +7635,25 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=3.4" +groups = ["main", "dev"] +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + [[package]] name = "requests-toolbelt" version = "1.0.0" @@ -6276,7 +7661,6 @@ description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -6292,7 +7676,6 @@ description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "responses-0.25.6-py3-none-any.whl", hash = "sha256:9cac8f21e1193bb150ec557875377e41ed56248aed94e4567ed644db564bacf1"}, {file = "responses-0.25.6.tar.gz", hash = "sha256:eae7ce61a9603004e76c05691e7c389e59652d91e94b419623c12bbfb8e331d8"}, @@ -6304,7 +7687,7 @@ requests = ">=2.30.0,<3.0" urllib3 = ">=1.25.10,<3.0" [package.extras] -tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli ; python_version < \"3.11\"", "tomli-w", "types-PyYAML", "types-requests"] [[package]] name = "rfc3339-validator" @@ -6313,7 +7696,6 @@ description = "A pure python RFC3339 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -6329,7 +7711,6 @@ description = "Render rich text, tables, progress bars, syntax highlighting, mar optional = false python-versions = ">=3.8.0" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -6345,15 +7726,14 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rich-argparse" -version = "1.6.0" +version = "1.7.0" description = "Rich help formatters for argparse and optparse" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "rich_argparse-1.6.0-py3-none-any.whl", hash = "sha256:fbe70a1d821b3f2fa8958cddf0cae131870a6e9faa04ab52b409cb1eda809bd7"}, - {file = "rich_argparse-1.6.0.tar.gz", hash = "sha256:092083c30da186f25bcdff8b1d47fdfb571288510fb051e0488a72cc3128de13"}, + {file = "rich_argparse-1.7.0-py3-none-any.whl", hash = "sha256:b8ec8943588e9731967f4f97b735b03dc127c416f480a083060433a97baf2fd3"}, + {file = "rich_argparse-1.7.0.tar.gz", hash = "sha256:f31d809c465ee43f367d599ccaf88b73bc2c4d75d74ed43f2d538838c53544ba"}, ] [package.dependencies] @@ -6361,126 +7741,124 @@ rich = ">=11.0.0" [[package]] name = "rpds-py" -version = "0.22.3" +version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, - {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, - {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, - {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, - {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, - {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, - {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, - {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, - {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, - {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, - {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, - {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, - {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, - {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, - {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, - {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, - {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, - {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, - {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, - {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, - {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, - {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, - {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, - {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, +groups = ["main", "dev"] +files = [ + {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, + {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a"}, + {file = "rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12"}, + {file = "rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda"}, + {file = "rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590"}, + {file = "rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522"}, + {file = "rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6"}, + {file = "rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf"}, + {file = "rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c"}, + {file = "rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad"}, + {file = "rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057"}, + {file = "rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165"}, + {file = "rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935"}, + {file = "rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93"}, + {file = "rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd"}, + {file = "rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70"}, + {file = "rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731"}, + {file = "rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5"}, + {file = "rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7"}, + {file = "rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d"}, + {file = "rpds_py-0.23.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19"}, + {file = "rpds_py-0.23.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f"}, + {file = "rpds_py-0.23.1-cp39-cp39-win32.whl", hash = "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495"}, + {file = "rpds_py-0.23.1-cp39-cp39-win_amd64.whl", hash = "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00"}, + {file = "rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707"}, ] [[package]] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -optional = true +optional = false python-versions = ">=3.6,<4" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, @@ -6491,44 +7869,42 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.9.4" +version = "0.9.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, - {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, - {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"}, - {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"}, - {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"}, - {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"}, - {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"}, +files = [ + {file = "ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367"}, + {file = "ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7"}, + {file = "ruff-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ee162652869120ad260670706f3cd36cd3f32b0c651f02b6da142652c54941d"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa0f6b75082c9be1ec5a1db78c6d4b02e2375c3068438241dc19c7c306cc61a"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:584cc66e89fb5f80f84b05133dd677a17cdd86901d6479712c96597a3f28e7fe"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf3369325761a35aba75cd5c55ba1b5eb17d772f12ab168fbfac54be85cf18c"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3403a53a32a90ce929aa2f758542aca9234befa133e29f4933dcef28a24317be"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18454e7fa4e4d72cffe28a37cf6a73cb2594f81ec9f4eca31a0aaa9ccdfb1590"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fadfe2c88724c9617339f62319ed40dcdadadf2888d5afb88bf3adee7b35bfb"}, + {file = "ruff-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df104d08c442a1aabcfd254279b8cc1e2cbf41a605aa3e26610ba1ec4acf0b0"}, + {file = "ruff-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d7c62939daf5b2a15af48abbd23bea1efdd38c312d6e7c4cedf5a24e03207e17"}, + {file = "ruff-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9494ba82a37a4b81b6a798076e4a3251c13243fc37967e998efe4cce58c8a8d1"}, + {file = "ruff-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4efd7a96ed6d36ef011ae798bf794c5501a514be369296c672dab7921087fa57"}, + {file = "ruff-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab90a7944c5a1296f3ecb08d1cbf8c2da34c7e68114b1271a431a3ad30cb660e"}, + {file = "ruff-0.9.9-py3-none-win32.whl", hash = "sha256:6b4c376d929c25ecd6d87e182a230fa4377b8e5125a4ff52d506ee8c087153c1"}, + {file = "ruff-0.9.9-py3-none-win_amd64.whl", hash = "sha256:837982ea24091d4c1700ddb2f63b7070e5baec508e43b01de013dc7eff974ff1"}, + {file = "ruff-0.9.9-py3-none-win_arm64.whl", hash = "sha256:3ac78f127517209fe6d96ab00f3ba97cafe38718b23b1db3e96d8b2d39e37ddf"}, + {file = "ruff-0.9.9.tar.gz", hash = "sha256:0062ed13f22173e85f8f7056f9a24016e692efeea8704d1a5e8011b8aa850933"}, ] [[package]] name = "s3transfer" -version = "0.11.2" +version = "0.11.3" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, - {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, + {file = "s3transfer-0.11.3-py3-none-any.whl", hash = "sha256:ca855bdeb885174b5ffa95b9913622459d4ad8e331fc98eb01e6d5eb6a30655d"}, + {file = "s3transfer-0.11.3.tar.gz", hash = "sha256:edae4977e3a122445660c7c114bba949f9d191bae3b34a096f18a1c8c354527a"}, ] [package.dependencies] @@ -6537,14 +7913,230 @@ botocore = ">=1.36.0,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] +[[package]] +name = "scikit-learn" +version = "1.5.2" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "python_version <= \"3.10\"" +files = [ + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, + {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scikit-learn" +version = "1.6.1" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"}, + {file = "scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36"}, + {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5"}, + {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b"}, + {file = "scikit_learn-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002"}, + {file = "scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33"}, + {file = "scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d"}, + {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2"}, + {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8"}, + {file = "scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415"}, + {file = "scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b"}, + {file = "scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2"}, + {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f"}, + {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86"}, + {file = "scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52"}, + {file = "scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322"}, + {file = "scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1"}, + {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348"}, + {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97"}, + {file = "scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f"}, + {file = "scikit_learn-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1"}, + {file = "scikit_learn-1.6.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e"}, + {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107"}, + {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422"}, + {file = "scikit_learn-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b"}, + {file = "scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.13.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "python_version < \"3.10\"" +files = [ + {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, + {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, + {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, + {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, + {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, + {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, + {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "scipy" +version = "1.15.2" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"}, + {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"}, + {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"}, + {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"}, + {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"}, + {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"}, + {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.5" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "scramp" version = "1.4.5" description = "An implementation of the SCRAM protocol." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "scramp-1.4.5-py3-none-any.whl", hash = "sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7"}, {file = "scramp-1.4.5.tar.gz", hash = "sha256:be3fbe774ca577a7a658117dca014e5d254d158cecae3dd60332dfe33ce6d78e"}, @@ -6559,8 +8151,8 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = true python-versions = ">=3.6" -groups = ["main", "adapters"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"linux\"" +groups = ["main"] +markers = "(extra == \"adapters\" or extra == \"snowflake\") and sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -6572,98 +8164,97 @@ jeepney = ">=0.6" [[package]] name = "setproctitle" -version = "1.3.4" +version = "1.3.5" description = "A Python module to customize the process title" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "setproctitle-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0f6661a69c68349172ba7b4d5dd65fec2b0917abc99002425ad78c3e58cf7595"}, - {file = "setproctitle-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:754bac5e470adac7f7ec2239c485cd0b75f8197ca8a5b86ffb20eb3a3676cc42"}, - {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7bc7088c15150745baf66db62a4ced4507d44419eb66207b609f91b64a682af"}, - {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a46ef3ecf61e4840fbc1145fdd38acf158d0da7543eda7b773ed2b30f75c2830"}, - {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcb09d5c0ffa043254ec9a734a73f3791fec8bf6333592f906bb2e91ed2af1a"}, - {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06c16b7a91cdc5d700271899e4383384a61aae83a3d53d0e2e5a266376083342"}, - {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9f9732e59863eaeedd3feef94b2b216cb86d40dda4fad2d0f0aaec3b31592716"}, - {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e152f4ab9ea1632b5fecdd87cee354f2b2eb6e2dfc3aceb0eb36a01c1e12f94c"}, - {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:020ea47a79b2bbd7bd7b94b85ca956ba7cb026e82f41b20d2e1dac4008cead25"}, - {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c52b12b10e4057fc302bd09cb3e3f28bb382c30c044eb3396e805179a8260e4"}, - {file = "setproctitle-1.3.4-cp310-cp310-win32.whl", hash = "sha256:a65a147f545f3fac86f11acb2d0b316d3e78139a9372317b7eb50561b2817ba0"}, - {file = "setproctitle-1.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:66821fada6426998762a3650a37fba77e814a249a95b1183011070744aff47f6"}, - {file = "setproctitle-1.3.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0f749f07002c2d6fecf37cedc43207a88e6c651926a470a5f229070cf791879"}, - {file = "setproctitle-1.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90ea8d302a5d30b948451d146e94674a3c5b020cc0ced9a1c28f8ddb0f203a5d"}, - {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f859c88193ed466bee4eb9d45fbc29d2253e6aa3ccd9119c9a1d8d95f409a60d"}, - {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3afa5a0ed08a477ded239c05db14c19af585975194a00adf594d48533b23701"}, - {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a78fce9018cc3e9a772b6537bbe3fe92380acf656c9f86db2f45e685af376e"}, - {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d758e2eed2643afac5f2881542fbb5aa97640b54be20d0a5ed0691d02f0867d"}, - {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ef133a1a2ee378d549048a12d56f4ef0e2b9113b0b25b6b77821e9af94d50634"}, - {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1d2a154b79d5fb42d1eff06e05e22f0e8091261d877dd47b37d31352b74ecc37"}, - {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:202eae632815571297833876a0f407d0d9c7ad9d843b38adbe687fe68c5192ee"}, - {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2b0080819859e80a7776ac47cf6accb4b7ad313baf55fabac89c000480dcd103"}, - {file = "setproctitle-1.3.4-cp311-cp311-win32.whl", hash = "sha256:9c9d7d1267dee8c6627963d9376efa068858cfc8f573c083b1b6a2d297a8710f"}, - {file = "setproctitle-1.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:475986ddf6df65d619acd52188336a20f616589403f5a5ceb3fc70cdc137037a"}, - {file = "setproctitle-1.3.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d06990dcfcd41bb3543c18dd25c8476fbfe1f236757f42fef560f6aa03ac8dfc"}, - {file = "setproctitle-1.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317218c9d8b17a010ab2d2f0851e8ef584077a38b1ba2b7c55c9e44e79a61e73"}, - {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5fefb53b9d9f334a5d9ec518a36b92a10b936011ac8a6b6dffd60135f16459"}, - {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0855006261635e8669646c7c304b494b6df0a194d2626683520103153ad63cc9"}, - {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a88e466fcaee659679c1d64dcb2eddbcb4bfadffeb68ba834d9c173a25b6184"}, - {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f963b6ed8ba33eda374a98d979e8a0eaf21f891b6e334701693a2c9510613c4c"}, - {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:122c2e05697fa91f5d23f00bbe98a9da1bd457b32529192e934095fadb0853f1"}, - {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1bba0a866f5895d5b769d8c36b161271c7fd407e5065862ab80ff91c29fbe554"}, - {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:97f1f861998e326e640708488c442519ad69046374b2c3fe9bcc9869b387f23c"}, - {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:726aee40357d4bdb70115442cb85ccc8e8bc554fc0bbbaa3a57cbe81df42287d"}, - {file = "setproctitle-1.3.4-cp312-cp312-win32.whl", hash = "sha256:04d6ba8b816dbb0bfd62000b0c3e583160893e6e8c4233e1dca1a9ae4d95d924"}, - {file = "setproctitle-1.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:9c76e43cb351ba8887371240b599925cdf3ecececc5dfb7125c71678e7722c55"}, - {file = "setproctitle-1.3.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6e3b177e634aa6bbbfbf66d097b6d1cdb80fc60e912c7d8bace2e45699c07dd"}, - {file = "setproctitle-1.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6b17655a5f245b416e127e02087ea6347a48821cc4626bc0fd57101bfcd88afc"}, - {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa5057a86df920faab8ee83960b724bace01a3231eb8e3f2c93d78283504d598"}, - {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149fdfb8a26a555780c4ce53c92e6d3c990ef7b30f90a675eca02e83c6d5f76d"}, - {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded03546938a987f463c68ab98d683af87a83db7ac8093bbc179e77680be5ba2"}, - {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9f5b7f2bbc1754bc6292d9a7312071058e5a891b0391e6d13b226133f36aa"}, - {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0b19813c852566fa031902124336fa1f080c51e262fc90266a8c3d65ca47b74c"}, - {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db78b645dc63c0ccffca367a498f3b13492fb106a2243a1e998303ba79c996e2"}, - {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b669aaac70bd9f03c070270b953f78d9ee56c4af6f0ff9f9cd3e6d1878c10b40"}, - {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6dc3d656702791565994e64035a208be56b065675a5bc87b644c657d6d9e2232"}, - {file = "setproctitle-1.3.4-cp313-cp313-win32.whl", hash = "sha256:091f682809a4d12291cf0205517619d2e7014986b7b00ebecfde3d76f8ae5a8f"}, - {file = "setproctitle-1.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:adcd6ba863a315702184d92d3d3bbff290514f24a14695d310f02ae5e28bd1f7"}, - {file = "setproctitle-1.3.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:acf41cf91bbc5a36d1fa4455a818bb02bf2a4ccfed2f892ba166ba2fcbb0ec8a"}, - {file = "setproctitle-1.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ceb3ce3262b0e8e088e4117175591b7a82b3bdc5e52e33b1e74778b5fb53fd38"}, - {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2ef636a6a25fe7f3d5a064bea0116b74a4c8c7df9646b17dc7386c439a26cf"}, - {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28b8614de08679ae95bc4e8d6daaef6b61afdf027fa0d23bf13d619000286b3c"}, - {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24f3c8be826a7d44181eac2269b15b748b76d98cd9a539d4c69f09321dcb5c12"}, - {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9d79b1bf833af63b7c720a6604eb16453ac1ad4e718eb8b59d1f97d986b98c"}, - {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fb693000b65842c85356b667d057ae0d0bac6519feca7e1c437cc2cfeb0afc59"}, - {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a166251b8fbc6f2755e2ce9d3c11e9edb0c0c7d2ed723658ff0161fbce26ac1c"}, - {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0361428e6378911a378841509c56ba472d991cbed1a7e3078ec0cacc103da44a"}, - {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:62d66e0423e3bd520b4c897063506b309843a8d07343fbfad04197e91a4edd28"}, - {file = "setproctitle-1.3.4-cp38-cp38-win32.whl", hash = "sha256:5edd01909348f3b0b2da329836d6b5419cd4869fec2e118e8ff3275b38af6267"}, - {file = "setproctitle-1.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:59e0dda9ad245921af0328035a961767026e1fa94bb65957ab0db0a0491325d6"}, - {file = "setproctitle-1.3.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdaaa81a6e95a0a19fba0285f10577377f3503ae4e9988b403feba79da3e2f80"}, - {file = "setproctitle-1.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ee5b19a2d794463bcc19153dfceede7beec784b4cf7967dec0bc0fc212ab3a3"}, - {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3058a1bb0c767b3a6ccbb38b27ef870af819923eb732e21e44a3f300370fe159"}, - {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a97d37ee4fe0d1c6e87d2a97229c27a88787a8f4ebfbdeee95f91b818e52efe"}, - {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e61dd7d05da11fc69bb86d51f1e0ee08f74dccf3ecf884c94de41135ffdc75d"}, - {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb115d53dc2a1299ae72f1119c96a556db36073bacb6da40c47ece5db0d9587"}, - {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:342570716e2647a51ea859b8a9126da9dc1a96a0153c9c0a3514effd60ab57ad"}, - {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0ad212ae2b03951367a69584af034579b34e1e4199a75d377ef9f8e08ee299b1"}, - {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4afcb38e22122465013f4621b7e9ff8d42a7a48ae0ffeb94133a806cb91b4aad"}, - {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:30bb223e6c3f95ad9e9bb2a113292759e947d1cfd60dbd4adb55851c370006b2"}, - {file = "setproctitle-1.3.4-cp39-cp39-win32.whl", hash = "sha256:5f0521ed3bb9f02e9486573ea95e2062cd6bf036fa44e640bd54a06f22d85f35"}, - {file = "setproctitle-1.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:0baadeb27f9e97e65922b4151f818b19c311d30b9efdb62af0e53b3db4006ce2"}, - {file = "setproctitle-1.3.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:939d364a187b2adfbf6ae488664277e717d56c7951a4ddeb4f23b281bc50bfe5"}, - {file = "setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb8a6a19be0cbf6da6fcbf3698b76c8af03fe83e4bd77c96c3922be3b88bf7da"}, - {file = "setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779006f9e1aade9522a40e8d9635115ab15dd82b7af8e655967162e9c01e2573"}, - {file = "setproctitle-1.3.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5519f2a7b8c535b0f1f77b30441476571373add72008230c81211ee17b423b57"}, - {file = "setproctitle-1.3.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:743836d484151334ebba1490d6907ca9e718fe815dcd5756f2a01bc3067d099c"}, - {file = "setproctitle-1.3.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abda20aff8d1751e48d7967fa8945fef38536b82366c49be39b83678d4be3893"}, - {file = "setproctitle-1.3.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a2041b5788ce52f218b5be94af458e04470f997ab46fdebd57cf0b8374cc20e"}, - {file = "setproctitle-1.3.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2c3b1ce68746557aa6e6f4547e76883925cdc7f8d7c7a9f518acd203f1265ca5"}, - {file = "setproctitle-1.3.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b6a4cbabf024cb263a45bdef425760f14470247ff223f0ec51699ca9046c0fe"}, - {file = "setproctitle-1.3.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e55d7ecc68bdc80de5a553691a3ed260395d5362c19a266cf83cbb4e046551f"}, - {file = "setproctitle-1.3.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02ca3802902d91a89957f79da3ec44b25b5804c88026362cb85eea7c1fbdefd1"}, - {file = "setproctitle-1.3.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:47669fc8ed8b27baa2d698104732234b5389f6a59c37c046f6bcbf9150f7a94e"}, - {file = "setproctitle-1.3.4.tar.gz", hash = "sha256:3b40d32a3e1f04e94231ed6dfee0da9e43b4f9c6b5450d53e6dd7754c34e0c50"}, +files = [ + {file = "setproctitle-1.3.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02870e0cb0de7f68a7a8a5b23c2bc0ce63821cab3d9b126f9be80bb6cd674c80"}, + {file = "setproctitle-1.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55b278135be742b8901067479626d909f6613bd2d2c4fd0de6bb46f80e07a919"}, + {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53fc971f7bf7a674f571a23cdec70f2f0ac88152c59c06aa0808d0be6d834046"}, + {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb0500e1bc6f00b8ba696c3743ddff14c8679e3c2ca9d292c008ac51488d17cf"}, + {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:995b3ac1b5fe510f4e1d1c19ebf19f4bceb448f2d6e8d99ea23f33cb6f1a277e"}, + {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a05e2c3fdfbda32b9c9da72d0506398d1efb5bd2c5981b9e12d3622eb3d4f9"}, + {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:310c7f4ca4c8476a9840b2cd4b22ee602a49a3c902fdcd2dd8284685abd10a9a"}, + {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:867af4a5c3d85484fbcc50ea88bcd375acf709cff88a3259575361849c0da351"}, + {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8ec0a7fe9f1ba90900144489bc93ce7dd4dec3f3df1e7f188c9e58364fe4a4c5"}, + {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aaee7acba2733a14a886488b7495bfec4a8d6407124c04a0946dbde1684230a3"}, + {file = "setproctitle-1.3.5-cp310-cp310-win32.whl", hash = "sha256:bd2cccd972e4282af4ce2c13cd9ebdf07be157eabafd8ce648fffdc8ae6fbe28"}, + {file = "setproctitle-1.3.5-cp310-cp310-win_amd64.whl", hash = "sha256:81f2328ac34c9584e1e5f87eea916c0bc48476a06606a07debae07acdd7ab5ea"}, + {file = "setproctitle-1.3.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1c8dcc250872385f2780a5ea58050b58cbc8b6a7e8444952a5a65c359886c593"}, + {file = "setproctitle-1.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ca82fae9eb4800231dd20229f06e8919787135a5581da245b8b05e864f34cc8b"}, + {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0424e1d33232322541cb36fb279ea5242203cd6f20de7b4fb2a11973d8e8c2ce"}, + {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fec8340ab543144d04a9d805d80a0aad73fdeb54bea6ff94e70d39a676ea4ec0"}, + {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eab441c89f181271ab749077dcc94045a423e51f2fb0b120a1463ef9820a08d0"}, + {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c371550a2288901a0dcd84192691ebd3197a43c95f3e0b396ed6d1cedf5c6c"}, + {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78288ff5f9c415c56595b2257ad218936dd9fa726b36341b373b31ca958590fe"}, + {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f1f13a25fc46731acab518602bb1149bfd8b5fabedf8290a7c0926d61414769d"}, + {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1534d6cd3854d035e40bf4c091984cbdd4d555d7579676d406c53c8f187c006f"}, + {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62a01c76708daac78b9688ffb95268c57cb57fa90b543043cda01358912fe2db"}, + {file = "setproctitle-1.3.5-cp311-cp311-win32.whl", hash = "sha256:ea07f29735d839eaed985990a0ec42c8aecefe8050da89fec35533d146a7826d"}, + {file = "setproctitle-1.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:ab3ae11e10d13d514d4a5a15b4f619341142ba3e18da48c40e8614c5a1b5e3c3"}, + {file = "setproctitle-1.3.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:523424b9be4dea97d95b8a584b183f35c7bab2d0a3d995b01febf5b8a8de90e4"}, + {file = "setproctitle-1.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b6ec1d86c1b4d7b5f2bdceadf213310cf24696b82480a2a702194b8a0bfbcb47"}, + {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea6c505264275a43e9b2acd2acfc11ac33caf52bc3167c9fced4418a810f6b1c"}, + {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b91e68e6685998e6353f296100ecabc313a6cb3e413d66a03d74b988b61f5ff"}, + {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1fda208ae3a2285ad27aeab44c41daf2328abe58fa3270157a739866779199"}, + {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:828727d220e46f048b82289018300a64547b46aaed96bf8810c05fe105426b41"}, + {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:83b016221cf80028b2947be20630faa14e3e72a403e35f0ba29550b4e856767b"}, + {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6d8a411e752e794d052434139ca4234ffeceeb8d8d8ddc390a9051d7942b2726"}, + {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:50cfbf86b9c63a2c2903f1231f0a58edeb775e651ae1af84eec8430b0571f29b"}, + {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f3b5e2eacd572444770026c9dd3ddc7543ce427cdf452d40a408d1e95beefb30"}, + {file = "setproctitle-1.3.5-cp312-cp312-win32.whl", hash = "sha256:cf4e3ded98027de2596c6cc5bbd3302adfb3ca315c848f56516bb0b7e88de1e9"}, + {file = "setproctitle-1.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:f7a8c01ffd013dda2bed6e7d5cb59fbb609e72f805abf3ee98360f38f7758d9b"}, + {file = "setproctitle-1.3.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:162fd76781f57f42ddf27c475e5fef6a8df4fdd69b28dd554e53e2eb2bfe0f95"}, + {file = "setproctitle-1.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4969d996bdfbe23bbd023cd0bae6c73a27371615c4ec5296a60cecce268659ef"}, + {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd70c95a94473216e7c7a7a1f7d8ecbaca5b16d4ba93ddbfd32050fc485a8451"}, + {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a887582bfdb6dcbc482db0ef9e630ad23ca95875806ef2b444bf6fbd7b7d7ca"}, + {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:755671c39a9e70834eeec6dc6b61e344399c49881d2e7ea3534a1c69669dd9cc"}, + {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ab52b4c2ce056a1b60d439991a81ca90f019488d4b4f64b2779e6badd3677e6"}, + {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36178b944019ec7fc52bb967ffeee296a11d373734a7be276755bedb3db5c141"}, + {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:269d41cd4f085b69821d1ee6599124f02dbbc79962b256e260b6c9021d037994"}, + {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d880630fd81d1b3bde121c352ca7ea2f2ff507ef40c3c011d0928ed491f912c9"}, + {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8a7fed67ab49f60bd51f3b4cffff3f8d754d1bb0a40e42869911301ec6519b65"}, + {file = "setproctitle-1.3.5-cp313-cp313-win32.whl", hash = "sha256:e9c0d0cfcf715631b10d5950d04a9978f63bc46535724ef7c2eaf1dca9988642"}, + {file = "setproctitle-1.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:e1d28eb98c91fbebd3e443a45c7da5d84974959851ef304c330eabd654a386f1"}, + {file = "setproctitle-1.3.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8995a1217b52d11d92bafd069961a47c5e13d8751ca976a32b3ecbbd471eaf9b"}, + {file = "setproctitle-1.3.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae2ce64ea87837c4e3e65a7a232ff80cf09aa7d916e74cb34a245c47fcd87981"}, + {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b84de1780bbb0adc67560a113a0ea57e6ecfce2325680de8efe6c2a2f781ac"}, + {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1d2628ac9868f960d7e87b3a9b2bb337104c3644b699e52e01efd7e106e4fe"}, + {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa912c4d08c66afda30dd5af8f2e9c59065dfc36a51edbd5419c3a7c962875aa"}, + {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4f783e100f8b451cd92fcabd3b831edfb1f7cb02be4a79b972f138e0001885"}, + {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8ca56e39d10b6758046694a84950e5c5570a034c409ef3337595f64fc2cfa94d"}, + {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:8915d69260ba6a6aaf9a48f6b53dbf9f8e4dc0cb4ae25bc5edb16a1666b6e47c"}, + {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7edd4fbb9fd17ed0e5a7f8bde9fa61c3987a34372084c45bab4eab6a2e554762"}, + {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d0b19fd76d46b8096a463724739c3b09cf5ce38317f559f56f424f6ce7158de3"}, + {file = "setproctitle-1.3.5-cp38-cp38-win32.whl", hash = "sha256:53ce572cdbd43a0bed2aa24299cd823ebf233a7fa720cc7f8634728c213679c0"}, + {file = "setproctitle-1.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:a58f00f35d6038ce1e8a9e5f87cb5ecce13ce118c5977a603566ad1fccc8d2cb"}, + {file = "setproctitle-1.3.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c4b299b5bbadf00034978b8d741c85af25173146747eb9dab22596ec805a52d6"}, + {file = "setproctitle-1.3.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d57e7626329d4fb138da5ce15270b08a91326969956fb19c7a8fec2639066704"}, + {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4272295721cf1fd2acf960b674d6dc09bec87f2a1e48995817b4ec4a3d483faf"}, + {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8305b6e6c203222c61318f338f1de08269ec66c247bf251593c215ff1fbeaf9"}, + {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:becc9f3f605936506d2bd63d9cf817b7ee66b10d204184c4a633064dbed579d6"}, + {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4629de80c47155a26e8d87a0a92d9428aa8d79ccfe2c20fd18888580619704e1"}, + {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f1af1d310b5b6cda692da52bd862a9833086c0a3f8380fa92505dd23857dcf60"}, + {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3bb6ea3d6e690677619508050bc681d86223723bdf67e4e8a8dffc3d04ca3044"}, + {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:322067ef1ffe70d297b00bee8a3862fed96021aa4318e3bce2d7c3bfa7a8d1e7"}, + {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1b58d49c32a46c48dcc2812635a89e6bee31139b03818da49a0bbaeaf01edef9"}, + {file = "setproctitle-1.3.5-cp39-cp39-win32.whl", hash = "sha256:707c23d4a88f5e66f1005d93558bf84eb45fc0fb0c4f33480a0c7d0895e8e848"}, + {file = "setproctitle-1.3.5-cp39-cp39-win_amd64.whl", hash = "sha256:c64199a73d442a06d372b5286942229a43e86fa41bf36f317dcc60c036aff0bb"}, + {file = "setproctitle-1.3.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dc66b84beb0d5eb03abf0c3140c6d2cbe3d67ae9f0824a09dfa8c6ff164319a6"}, + {file = "setproctitle-1.3.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31dc9b330e7cac7685bdef790747c07914081c11ee1066eb0c597303dfb52010"}, + {file = "setproctitle-1.3.5-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4028639b511f5e641d116b3b54ad70c637ebd1b4baac0948283daf11b104119f"}, + {file = "setproctitle-1.3.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6bddef4e27d0ed74e44b58bf050bc3108591bf17d20d461fc59cd141282f849c"}, + {file = "setproctitle-1.3.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9996be1d1df399c3cdc6d72ce0064e46bc74fc6e29fe16a328511a303dd4d418"}, + {file = "setproctitle-1.3.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cefc2dbdc48121022c3c05644cd3706f08e0b3c0ce07814d3c04daba0617936"}, + {file = "setproctitle-1.3.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cef63879c79a570aabf7c158f453bf8d1285f0fda4b6b9b7a52d64b49c084d40"}, + {file = "setproctitle-1.3.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a863296a31fb578726c570314cb78ff3a3fddb65963dc01ea33731760f20a92c"}, + {file = "setproctitle-1.3.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b63bda3cb4b6526720dc7c6940b891c593f41771d119aeb8763875801ce2296d"}, + {file = "setproctitle-1.3.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95913af603da5b4c7635bf1fb67ecc5df7c18360b6cfb6740fd743bb150a6e17"}, + {file = "setproctitle-1.3.5-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36b130cf8fe76dc05ad1d48cc9ff3699eb1f0d8edbf6f46a3ce46a7041e49d7b"}, + {file = "setproctitle-1.3.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe3bfd5e51c24349d022e062a96c316a1b8862ea9a0cf5ea2a8b2ae008b77cec"}, + {file = "setproctitle-1.3.5.tar.gz", hash = "sha256:1e6eaeaf8a734d428a95d8c104643b39af7d247d604f40a7bebcf3960a853c5e"}, ] [package.extras] @@ -6671,25 +8262,83 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "75.8.0" +version = "75.8.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ - {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, - {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, + {file = "setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f"}, + {file = "setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "shapely" +version = "2.0.7" +description = "Manipulation and analysis of geometric objects" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, + {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895"}, + {file = "shapely-2.0.7-cp310-cp310-win32.whl", hash = "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2"}, + {file = "shapely-2.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3"}, + {file = "shapely-2.0.7-cp311-cp311-win32.whl", hash = "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2"}, + {file = "shapely-2.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73"}, + {file = "shapely-2.0.7-cp312-cp312-win32.whl", hash = "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd"}, + {file = "shapely-2.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98"}, + {file = "shapely-2.0.7-cp313-cp313-win32.whl", hash = "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913"}, + {file = "shapely-2.0.7-cp313-cp313-win_amd64.whl", hash = "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e"}, + {file = "shapely-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98"}, + {file = "shapely-2.0.7-cp37-cp37m-win32.whl", hash = "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d"}, + {file = "shapely-2.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24"}, + {file = "shapely-2.0.7-cp38-cp38-win32.whl", hash = "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532"}, + {file = "shapely-2.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27"}, + {file = "shapely-2.0.7-cp39-cp39-win32.whl", hash = "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999"}, + {file = "shapely-2.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5"}, + {file = "shapely-2.0.7.tar.gz", hash = "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] [[package]] name = "six" @@ -6697,8 +8346,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -6711,7 +8359,6 @@ description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -6724,7 +8371,6 @@ description = "This package provides 29 stemmers for 28 languages generated from optional = false python-versions = "*" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -6732,39 +8378,39 @@ files = [ [[package]] name = "snowflake-connector-python" -version = "3.13.2" +version = "3.14.0" description = "Snowflake Connector for Python" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "snowflake_connector_python-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c180dec770076409d422cfc25e4077561026316c4f0e17a001bc0a15ffbe9184"}, - {file = "snowflake_connector_python-3.13.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f4503e841c9bb22fe7af168a6a4e3a76394d8e0d8731a29ad797273d5e9a62b3"}, - {file = "snowflake_connector_python-3.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04ce1bba327868712a15f5b6d12f0ac5559d0bbf8c7c18f9847cf825e34f36f7"}, - {file = "snowflake_connector_python-3.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27d59696b41cab854379d81577a0802db3b64dbe0fd18d5a562e3739ee12b7f"}, - {file = "snowflake_connector_python-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:61634af1dd78203b41bdf89cea0d930b3e8cec19b50a038db3cea1a531a7d36c"}, - {file = "snowflake_connector_python-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd693b1db31c70a9669b5818980f718149d6f7b4624628bed087801dcd617051"}, - {file = "snowflake_connector_python-3.13.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:67fcde6666075cc8e6e2fd4ba9dbf1291af780567ffe55a5adbb808de715b39f"}, - {file = "snowflake_connector_python-3.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092ec250b1dcc7c38d8a101a29e9118be56079d8e4f410a50159421c22b3b8e"}, - {file = "snowflake_connector_python-3.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912334af6851d325a5f2bc72416e6a46be889d045e0e09412084b99602c3122"}, - {file = "snowflake_connector_python-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:c11599b5d19b4aaab880b5e7b57525645dc1ee9768acc7dad11abf6998c75b22"}, - {file = "snowflake_connector_python-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1cf34116687653b7467d519da1dfdbff4f58d0032932d31d61f9d27717e7d61f"}, - {file = "snowflake_connector_python-3.13.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:38426293ecf6c1fc3dd87d506e55d8b82dcf763fab1c827b0d09bc74f9852c50"}, - {file = "snowflake_connector_python-3.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd95811b8378d8a268038b59ea8dba8d30dd0b96a1c323191805ae152224ff70"}, - {file = "snowflake_connector_python-3.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fe0cd6fab07fccdea020394a6175baa1ddf57b3d1f4dc288bd7eebcf29c6a0b"}, - {file = "snowflake_connector_python-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:82028c55d949889f759b78dd86b6249e9e4934cd6fcbe026cf7f41aefc9eb999"}, - {file = "snowflake_connector_python-3.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f29ce0451482348993eed830c81f41a53efd8908691781dc6872d505b1aca12d"}, - {file = "snowflake_connector_python-3.13.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:8ffc295307f380dba2f054bf4c9df847dce5168d4e023bdf04ee08abf732672a"}, - {file = "snowflake_connector_python-3.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea90169e12e1b60883a4de35129d9761920a92990f963108dc18072a0ee79fae"}, - {file = "snowflake_connector_python-3.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7da0d18a4de0c0bd4b2d57093b60103ed0d89fd9e8b813ceb266fb8490ad615"}, - {file = "snowflake_connector_python-3.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:d966edfe7a8fd61ed73dd56ee0de3ed0c79bd405fc4243391420f2db2e6b4d77"}, - {file = "snowflake_connector_python-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b8c807e4cc52cb343546624d90f0540c396bb924cce1c64b029d7ab94e9d571"}, - {file = "snowflake_connector_python-3.13.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e7dd2acc26db04c718bb31f30a2bfdd7cc76eaf429dbfa1c31b29da70127125d"}, - {file = "snowflake_connector_python-3.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f50eb2a6f9ef94de875bfcbca27a8aa9a08eeec3099ca5fbfc53530a082c4c"}, - {file = "snowflake_connector_python-3.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfd5f30c6e8011f5f11fdd7c762a189d94a8a3f9259c4f13cbc6cd5d1ca31f85"}, - {file = "snowflake_connector_python-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:db600d32b4854716ef5327cdebeb8ba087256819829f1a0c45697caabe898716"}, - {file = "snowflake_connector_python-3.13.2.tar.gz", hash = "sha256:c9954a5e237566420e087a4fcef227775e0c62fbfc821e0ef6f81325fd44c904"}, +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" +files = [ + {file = "snowflake_connector_python-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:92f10c629c5b01dbe42b04b13b02a367b2d6014c01982bce9b8647b1bc4f7b27"}, + {file = "snowflake_connector_python-3.14.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ff71e58f2d49db2b79c77e6618bf1488c47141887cab0dadb6e974d9b63469e5"}, + {file = "snowflake_connector_python-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd21b4377d70bb0015d3b2f9dea70f4b1b17921f0bca351c3d36d4da8f43e22a"}, + {file = "snowflake_connector_python-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da4f7aeeec2305d6baafb600cdbf50ce1df3a1566efbce5d06086a304fa8367f"}, + {file = "snowflake_connector_python-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:499aeeef478deb61aa24192821b14189d1692d2ea3877ae98d86dbb72bbf6eda"}, + {file = "snowflake_connector_python-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b128812ac0043568c07efa9d16a827fb921976ffab6b346599f4536a0da80788"}, + {file = "snowflake_connector_python-3.14.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:a057a69f8b6af89b0627cf23954476ee5f3161df66164c0eec2b5f1ae8bc5cc1"}, + {file = "snowflake_connector_python-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b533308c6063316a0b320c63bcc6b0be0e218e249c6d198091b062f021179efd"}, + {file = "snowflake_connector_python-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d3b6e24baa08d2834b34e3c41438b81144f7932c37539300291265929fcd8b"}, + {file = "snowflake_connector_python-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:779de94435fdfedd02ee057ef0623b7b67816e01fcaeee3bc49e15f513ad258c"}, + {file = "snowflake_connector_python-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1276f5eb148c3eb11c3c50b4bc040d1452ec3f86b7bda44e9992d8e1b8378a81"}, + {file = "snowflake_connector_python-3.14.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:9647a4247e5b05ef7605cbd848d6e441f418500af728f82a176a11bf2bbce88a"}, + {file = "snowflake_connector_python-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf057c86f9cdd101da0832f75c95ed762077f0e66d6b1e835f99b1850ea222d7"}, + {file = "snowflake_connector_python-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74eeedaf3c9275f6d56336ac3d1d19522ae69db11c88a6a4866ec66e51fd3ed1"}, + {file = "snowflake_connector_python-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1224d2b33ce6f42d99bb01aaf4ad585a72cf9de53334dd849fecfaca22880560"}, + {file = "snowflake_connector_python-3.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d04c6f4927abfc4e694148ad0e2674a8e6886b3d2a5b0cb8cf6ae363591926a5"}, + {file = "snowflake_connector_python-3.14.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:494db51c1f1046cacf4b092dbe40513e3c9170e2b07890a5c23c71b3f6264f53"}, + {file = "snowflake_connector_python-3.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a9cac4aa11ef96a6a86733c451d3e5fe285ecdc0793adc23eb13fb4ca3fb26"}, + {file = "snowflake_connector_python-3.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf26792155e11cb755d242aa3c95cf53e072f936be387f9f54c689f6051aa3f"}, + {file = "snowflake_connector_python-3.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:9ad2fdd3ef6bd0677c58fe4b9d866400c172f71390f1b6bb8811984b56ff6e61"}, + {file = "snowflake_connector_python-3.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c97a70764ac1d75e539e686c8797a429f6b3527677ee1f5312bcaa70a31bd26a"}, + {file = "snowflake_connector_python-3.14.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:4c658af575ddd27df8f3b7cda1b0933e6dea1908bb5ffcc83928e15b35fa48e0"}, + {file = "snowflake_connector_python-3.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74b4f6635989dfd17fe1ccbb3767aed220abb94ccd0062f24e492ce5c673cd95"}, + {file = "snowflake_connector_python-3.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14752c6612b40f3a9d5b4562e789f8b8165c4f0a41ca9bf1941fa748f00820a"}, + {file = "snowflake_connector_python-3.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:c13a94fef37405a9ad57f5b2c1664a3e3277b8dffe67e17144ae786df6afcc89"}, + {file = "snowflake_connector_python-3.14.0.tar.gz", hash = "sha256:baa10f3f8a2cdbe2be0ff973f2313df684f4d0147db6a4f76f3b311bedc299ed"}, ] [package.dependencies] @@ -6779,7 +8425,7 @@ keyring = {version = ">=23.1.0,<26.0.0", optional = true, markers = "extra == \" packaging = "*" platformdirs = ">=2.6.0,<5.0.0" pyjwt = "<3.0.0" -pyOpenSSL = ">=22.0.0,<25.0.0" +pyOpenSSL = ">=22.0.0,<26.0.0" pytz = "*" requests = "<3.0.0" sortedcontainers = ">=2.4.0" @@ -6789,35 +8435,36 @@ urllib3 = {version = ">=1.21.1,<2.0.0", markers = "python_version < \"3.10\""} [package.extras] development = ["Cython", "coverage", "more-itertools", "numpy (<1.27.0)", "pendulum (!=2.1.1)", "pexpect", "pytest (<7.5.0)", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist", "pytzdata"] -pandas = ["pandas (>=1.0.0,<3.0.0)", "pyarrow"] +pandas = ["pandas (>=1.0.0,<3.0.0)", "pyarrow (<19.0.0)"] secure-local-storage = ["keyring (>=23.1.0,<26.0.0)"] [[package]] name = "snowplow-tracker" -version = "1.0.4" +version = "1.1.0" description = "Snowplow event tracker for Python. Add analytics to your Python and Django apps, webapps and games" -optional = true +optional = false python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] files = [ - {file = "snowplow_tracker-1.0.4-py3-none-any.whl", hash = "sha256:382e289811550f6ce7d5abc9e68590cc080ac9b21916b701b17497cfd6b32038"}, - {file = "snowplow_tracker-1.0.4.tar.gz", hash = "sha256:16d8a3c001a7847d91dc081d508324550c314a4cbf5d6106b5ab35f77fa34678"}, + {file = "snowplow_tracker-1.1.0-py3-none-any.whl", hash = "sha256:24ea32ddac9cca547421bf9ab162f5f33c00711c6ef118ad5f78093cee962224"}, + {file = "snowplow_tracker-1.1.0.tar.gz", hash = "sha256:95d8fdc8bd542fd12a0b9a076852239cbaf0599eda8721deaf5f93f7138fe755"}, ] [package.dependencies] requests = ">=2.25.1,<3.0" -types-requests = ">=2.25.1,<3.0" typing-extensions = ">=3.7.4" +[package.extras] +typing = ["mypy (>=0.971)", "types-requests (>=2.25.1,<3.0)"] + [[package]] name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" optional = true python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, @@ -6829,8 +8476,7 @@ version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -6843,7 +8489,6 @@ description = "Python documentation generator" optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, @@ -6881,7 +8526,6 @@ description = "Add a copy button to each of your code cells." optional = false python-versions = ">=3.7" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, @@ -6901,7 +8545,6 @@ description = "Read the Docs theme for Sphinx" optional = false python-versions = ">=3.8" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13"}, {file = "sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85"}, @@ -6922,7 +8565,6 @@ description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, @@ -6940,7 +8582,6 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, @@ -6958,7 +8599,6 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, @@ -6976,7 +8616,6 @@ description = "Extension to include jQuery on newer Sphinx releases" optional = false python-versions = ">=2.7" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, @@ -6992,7 +8631,6 @@ description = "A sphinx extension which renders display math in HTML via JavaScr optional = false python-versions = ">=3.5" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -7008,7 +8646,6 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, @@ -7026,7 +8663,6 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs optional = false python-versions = ">=3.9" groups = ["docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, @@ -7044,7 +8680,6 @@ description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "SQLAlchemy-1.4.54-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:af00236fe21c4d4f4c227b6ccc19b44c594160cc3ff28d104cdce85855369277"}, {file = "SQLAlchemy-1.4.54-cp310-cp310-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1183599e25fa38a1a322294b949da02b4f0da13dbc2688ef9dbe746df573f8a6"}, @@ -7096,25 +8731,51 @@ files = [ greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} [package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)", "mariadb (>=1.0.1,!=1.1.2)"] +aiomysql = ["aiomysql (>=0.2.0) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] +aiosqlite = ["aiosqlite ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\"", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17) ; python_version >= \"3\""] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2) ; python_version >= \"3\"", "mariadb (>=1.0.1,!=1.1.2) ; python_version >= \"3\""] mssql = ["pyodbc"] mssql-pymssql = ["pymssql", "pymssql"] mssql-pyodbc = ["pyodbc", "pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mypy = ["mypy (>=0.910) ; python_version >= \"3\"", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0) ; python_version >= \"3\"", "mysqlclient (>=1.4.0,<2) ; python_version < \"3\""] mysql-connector = ["mysql-connector-python", "mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +oracle = ["cx_oracle (>=7) ; python_version >= \"3\"", "cx_oracle (>=7,<8) ; python_version < \"3\""] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "asyncpg", "greenlet (!=0.4.17)", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)", "pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-asyncpg = ["asyncpg ; python_version >= \"3\"", "asyncpg ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0) ; python_version >= \"3\"", "pg8000 (>=1.16.6,!=1.29.0) ; python_version >= \"3\""] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3_binary"] +pymysql = ["pymysql (<1) ; python_version < \"3\"", "pymysql ; python_version >= \"3\""] +sqlcipher = ["sqlcipher3_binary ; python_version >= \"3\""] + +[[package]] +name = "sqlalchemy-bigquery" +version = "1.12.1" +description = "SQLAlchemy dialect for BigQuery" +optional = false +python-versions = "<3.13,>=3.8" +groups = ["main", "dev"] +files = [ + {file = "sqlalchemy_bigquery-1.12.1-py2.py3-none-any.whl", hash = "sha256:93ae66d94405c457ae111ad4ef170b152e5b3b659ae00af21c1326bbeb253b20"}, + {file = "sqlalchemy_bigquery-1.12.1.tar.gz", hash = "sha256:f73165c40b4767ca2025b2c759b7619ef47b07fcd3bd8eb0246f7498bbba7cef"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0.0dev" +google-cloud-bigquery = ">=3.3.6,<4.0.0dev" +packaging = "*" +sqlalchemy = ">=1.4.16,<3.0.0dev" + +[package.extras] +alembic = ["alembic"] +all = ["GeoAlchemy2", "alembic", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "packaging", "pyarrow (>=3.0.0)", "pytz", "shapely"] +bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "pyarrow (>=3.0.0)"] +geography = ["GeoAlchemy2", "shapely"] +tests = ["packaging", "pytz"] [[package]] name = "sqlalchemy-jsonfield" @@ -7123,7 +8784,6 @@ description = "SQLALchemy JSONField implementation for storing dicts at SQL" optional = false python-versions = ">=3.7.0" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "SQLAlchemy-JSONField-1.0.2.tar.gz", hash = "sha256:dab3abc9d75a1640e7f3d4875564a4199f665d27863da8d5a089e4eaca5e67f2"}, {file = "SQLAlchemy_JSONField-1.0.2-py3-none-any.whl", hash = "sha256:b2945fa1e60b07d5764a7c73b18da427948b35dd4c07c0e94939001dc2dacf77"}, @@ -7132,6 +8792,26 @@ files = [ [package.dependencies] sqlalchemy = "*" +[[package]] +name = "sqlalchemy-spanner" +version = "1.9.0" +description = "SQLAlchemy dialect integrated into Cloud Spanner database" +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "sqlalchemy_spanner-1.9.0-py3-none-any.whl", hash = "sha256:3226c9ada02ebaa3bf252f7eef4252ca915e9ac2bbebd30bc17c440fadce376e"}, + {file = "sqlalchemy_spanner-1.9.0.tar.gz", hash = "sha256:192e9383fce23ad2449ea9386f30f2f51fed84ce54ea0a17d9bc930614a377bb"}, +] + +[package.dependencies] +alembic = "*" +google-cloud-spanner = ">=3.12.0" +sqlalchemy = ">=1.1.13" + +[package.extras] +tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] + [[package]] name = "sqlalchemy-utils" version = "0.41.2" @@ -7139,7 +8819,6 @@ description = "Various utility functions for SQLAlchemy." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "SQLAlchemy-Utils-0.41.2.tar.gz", hash = "sha256:bc599c8c3b3319e53ce6c5c3c471120bd325d0071fb6f38a10e924e3d07b9990"}, {file = "SQLAlchemy_Utils-0.41.2-py3-none-any.whl", hash = "sha256:85cf3842da2bf060760f955f8467b87983fb2e30f1764fd0e24a48307dc8ec6e"}, @@ -7157,8 +8836,8 @@ intervals = ["intervals (>=0.7.1)"] password = ["passlib (>=1.6,<2.0)"] pendulum = ["pendulum (>=2.0.5)"] phone = ["phonenumbers (>=5.9.2)"] -test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo ; python_version < \"3.9\"", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo ; python_version < \"3.9\"", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] timezone = ["python-dateutil"] url = ["furl (>=0.4.1)"] @@ -7168,8 +8847,8 @@ version = "6.2.0" description = "Convert between various DB API 2.0 parameter styles." optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"spark\"" files = [ {file = "sqlparams-6.2.0-py3-none-any.whl", hash = "sha256:63b32ed9051bdc52e7e8b38bc4f78aed51796cdd9135e730f4c6a7db1048dedf"}, {file = "sqlparams-6.2.0.tar.gz", hash = "sha256:3744a2ad16f71293db6505b21fd5229b4757489a9b09f3553656a1ae97ba7ca5"}, @@ -7181,8 +8860,7 @@ version = "0.5.3" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, @@ -7199,7 +8877,6 @@ description = "Pure python SSH tunnels" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sshtunnel-0.4.0-py2.py3-none-any.whl", hash = "sha256:98e54c26f726ab8bd42b47a3a21fca5c3e60f58956f0f70de2fb8ab0046d0606"}, {file = "sshtunnel-0.4.0.tar.gz", hash = "sha256:e7cb0ea774db81bf91844db22de72a40aae8f7b0f9bb9ba0f666d474ef6bf9fc"}, @@ -7220,7 +8897,6 @@ description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -7236,7 +8912,6 @@ description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, @@ -7253,7 +8928,6 @@ description = "ANSI color formatting for output in terminal" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, @@ -7268,13 +8942,62 @@ version = "1.3" description = "The most basic Text::Unidecode port" optional = false python-versions = "*" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "threadpoolctl" +version = "3.5.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, +] + +[[package]] +name = "thrift" +version = "0.16.0" +description = "Python bindings for the Apache Thrift RPC system" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "thrift-0.16.0.tar.gz", hash = "sha256:2b5b6488fcded21f9d312aa23c9ff6a0195d0f6ae26ddbd5ad9e3e25dfc14408"}, +] + +[package.dependencies] +six = ">=1.7.2" + +[package.extras] +all = ["tornado (>=4.0)", "twisted"] +tornado = ["tornado (>=4.0)"] +twisted = ["twisted"] + +[[package]] +name = "thrift-sasl" +version = "0.4.3" +description = "Thrift SASL Python module that implements SASL transports for Thrift (`TSaslClientTransport`)." +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"adapters\"" +files = [ + {file = "thrift_sasl-0.4.3-py2.py3-none-any.whl", hash = "sha256:d24b49140115e6e2a96d08335cff225a27a28ea71866fb1b2bdb30ca5afca64e"}, + {file = "thrift_sasl-0.4.3.tar.gz", hash = "sha256:5bdd5b760d90a13d9b3abfce873db0425861aa8d6bf25912d3cc0467a4f773da"}, +] + +[package.dependencies] +pure-sasl = ">=0.6.2" +six = ">=1.13.0" +thrift = {version = ">=0.10.0", markers = "python_version >= \"3.0\""} + [[package]] name = "tomli" version = "2.2.1" @@ -7282,7 +9005,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev", "docs"] -markers = "python_version < \"3.11\"" +markers = "python_version <= \"3.10\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -7324,24 +9047,45 @@ version = "0.13.2" description = "Style preserving TOML library" optional = true python-versions = ">=3.8" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "extra == \"adapters\" or extra == \"snowflake\"" files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "types-awscrt" -version = "0.23.9" +version = "0.23.10" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "types_awscrt-0.23.9-py3-none-any.whl", hash = "sha256:71181a6c5188352ae934e74a7633d80c82ac5c6f89054bd7d653bb1b5bba240b"}, - {file = "types_awscrt-0.23.9.tar.gz", hash = "sha256:57ec68d45ef873458df7307ec80578a6334696f088549ab349c3d655e7e3562b"}, + {file = "types_awscrt-0.23.10-py3-none-any.whl", hash = "sha256:7391bf502f6093221e68da8fb6a2af7ec67a98d376c58d5b76cc3938f449d121"}, + {file = "types_awscrt-0.23.10.tar.gz", hash = "sha256:965659260599b421564204b895467684104a2c0311bbacfd3c2423b8b0d3f3e9"}, ] [[package]] @@ -7351,7 +9095,6 @@ description = "Typing stubs for freezegun" optional = false python-versions = "*" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "types-freezegun-1.1.10.tar.gz", hash = "sha256:cb3a2d2eee950eacbaac0673ab50499823365ceb8c655babb1544a41446409ec"}, {file = "types_freezegun-1.1.10-py3-none-any.whl", hash = "sha256:fadebe72213e0674036153366205038e1f95c8ca96deb4ef9b71ddc15413543e"}, @@ -7364,52 +9107,21 @@ description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"}, {file = "types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c"}, ] -[[package]] -name = "types-requests" -version = "2.31.0.6" -description = "Typing stubs for requests" -optional = true -python-versions = ">=3.7" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, - {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, -] - -[package.dependencies] -types-urllib3 = "*" - [[package]] name = "types-s3transfer" -version = "0.11.2" +version = "0.11.3" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"}, - {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"}, -] - -[[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" -optional = true -python-versions = "*" -groups = ["main", "adapters"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, + {file = "types_s3transfer-0.11.3-py3-none-any.whl", hash = "sha256:953491bc834b171d4a477130e80aecd87dc27c4ba71b9d339c178deaad3fd517"}, + {file = "types_s3transfer-0.11.3.tar.gz", hash = "sha256:48b90c1f9950dafd9816d0d1476e3323fbcd3202b74f2908b8a28c58e08e75b9"}, ] [[package]] @@ -7418,8 +9130,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -7431,8 +9142,7 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main", "adapters", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -7445,7 +9155,6 @@ description = "Micro subset of unicode data files for linkify-it-py projects." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, @@ -7461,7 +9170,6 @@ description = "pathlib api extended to use fsspec backends" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "universal_pathlib-0.2.6-py3-none-any.whl", hash = "sha256:700dec2b58ef34b87998513de6d2ae153b22f083197dfafb8544744edabd1b18"}, {file = "universal_pathlib-0.2.6.tar.gz", hash = "sha256:50817aaeaa9f4163cb1e76f5bdf84207fa05ce728b23fd779479b3462e5430ac"}, @@ -7471,38 +9179,68 @@ files = [ fsspec = ">=2022.1.0,<2024.3.1 || >2024.3.1" [package.extras] -dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "moto[s3,server]", "paramiko", "pydantic", "pydantic-settings", "requests", "s3fs", "smbprotocol", "typing_extensions", "webdav4[fsspec]", "wsgidav"] +dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "moto[s3,server]", "paramiko", "pydantic", "pydantic-settings", "requests", "s3fs", "smbprotocol", "typing_extensions ; python_version < \"3.11\"", "webdav4[fsspec]", "wsgidav"] tests = ["mypy (>=1.10.0)", "packaging", "pylint (>=2.17.4)", "pytest (>=8)", "pytest-cov (>=4.1.0)", "pytest-mock (>=3.12.0)", "pytest-mypy-plugins (>=3.1.2)", "pytest-sugar (>=0.9.7)"] +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + [[package]] name = "urllib3" version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] +markers = "python_version < \"3.10\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "urllib3" +version = "2.3.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev", "docs"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "virtualenv" -version = "20.29.1" +version = "20.29.2" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, - {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, + {file = "virtualenv-20.29.2-py3-none-any.whl", hash = "sha256:febddfc3d1ea571bdb1dc0f98d7b45d24def7428214d4fb73cc486c9568cce6a"}, + {file = "virtualenv-20.29.2.tar.gz", hash = "sha256:fdaabebf6d03b5ba83ae0a02cfe96f48a716f4fae556461d180825866f75b728"}, ] [package.dependencies] @@ -7512,26 +9250,25 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "watchtower" -version = "3.3.1" +version = "3.4.0" description = "Python CloudWatch Logging" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "watchtower-3.3.1-py3-none-any.whl", hash = "sha256:72d4f3f2ec906302e0478c042a2076611eb22f5a491ceda6411fec531aa2ee85"}, - {file = "watchtower-3.3.1.tar.gz", hash = "sha256:5e654f52b54b39e279592d6c18a033b22cfbffda676f5b3cf6dfef712ed5738c"}, + {file = "watchtower-3.4.0-py3-none-any.whl", hash = "sha256:5eac65cbf2a7350bb43c3518485230a6135ed7dec7ccb88468828d68ab9fea26"}, + {file = "watchtower-3.4.0.tar.gz", hash = "sha256:7d3c116aff72a73ce8f6fc0addd1d0daa04d3f9d53d87cedca3a5a65a264bf7d"}, ] [package.dependencies] boto3 = ">=1.9.253,<2" [package.extras] -tests = ["build", "coverage", "mypy", "pyyaml", "ruff", "wheel"] +test = ["build", "coverage", "mypy", "pyyaml", "ruff", "wheel"] [[package]] name = "werkzeug" @@ -7540,7 +9277,6 @@ description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, @@ -7559,7 +9295,6 @@ description = "'Turn functions and methods into fully controllable objects'" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "wirerope-1.0.0-py2.py3-none-any.whl", hash = "sha256:59346555c7b5dbd1c683a4e123f8bed30ca99df646f6867ea6439ceabf43c2f6"}, {file = "wirerope-1.0.0.tar.gz", hash = "sha256:7da8bb6feeff9dd939bd7141ef0dc392674e43ba662e20909d6729db81a7c8d0"}, @@ -7570,7 +9305,7 @@ six = ">=1.11.0" [package.extras] doc = ["sphinx"] -test = ["pytest (>=4.6.7)", "pytest-checkdocs (>=1.2.5)", "pytest-checkdocs (>=2.9.0)", "pytest-cov (>=2.6.1)"] +test = ["pytest (>=4.6.7)", "pytest-checkdocs (>=1.2.5) ; python_version < \"3\"", "pytest-checkdocs (>=2.9.0) ; python_version >= \"3\"", "pytest-cov (>=2.6.1)"] [[package]] name = "wrapt" @@ -7579,7 +9314,6 @@ description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -7669,7 +9403,6 @@ description = "Form validation and rendering for Python web development." optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "wtforms-3.2.1-py3-none-any.whl", hash = "sha256:583bad77ba1dd7286463f21e11aa3043ca4869d03575921d1a1698d0715e0fd4"}, {file = "wtforms-3.2.1.tar.gz", hash = "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682"}, @@ -7688,7 +9421,6 @@ description = "Python bindings for the XML Security Library" optional = false python-versions = ">=3.5" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "xmlsec-1.3.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4dea6df3ffcb65d0b215678c3a0fe7bbc66785d6eae81291296e372498bad43a"}, {file = "xmlsec-1.3.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fa1311f7489d050dde9028f5a2b5849c2927bb09c9a93491cb2f28fdc563912"}, @@ -7760,7 +9492,6 @@ description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" groups = ["dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -7773,7 +9504,6 @@ description = "Yet another URL library" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -7870,26 +9600,25 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["main", "adapters", "dev", "docs"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev", "docs"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [extras] adapters = ["dbt-bigquery", "dbt-postgres", "dbt-redshift", "dbt-snowflake", "dbt-spark"] -airflow-providers = ["apache-airflow-providers-amazon", "apache-airflow-providers-ssh"] +airflow-providers = ["apache-airflow-providers-amazon", "apache-airflow-providers-google", "apache-airflow-providers-ssh"] bigquery = ["dbt-bigquery"] -docs = [] +gcs = ["apache-airflow-providers-google"] git = ["apache-airflow-providers-ssh", "dulwich"] postgres = ["dbt-postgres"] redshift = ["dbt-redshift"] @@ -7900,4 +9629,4 @@ spark = ["dbt-spark"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<3.13" -content-hash = "a52993521708ab7f66cdc8215c8bf38b572b2a605fb26ff3f30de5c1b6cd4cca" +content-hash = "668f20f1d8604035f763a08c2425eb14a7bc650bfdfdda1c51c2f354cdb6276b" diff --git a/pyproject.toml b/pyproject.toml index aa49773..13292b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "airflow-dbt-python" -version = "2.2.0" +version = "3.0.0" description = "A collection of Airflow operators, hooks, and utilities to execute dbt commands" authors = [{ name = "Tomás Farías Santana", email = "tomas@tomasfarias.dev" }] license = "MIT" @@ -43,7 +43,7 @@ adapters = [ "dbt-redshift>=1.8.0,<2.0.0", "dbt-postgres>=1.8.0,<2.0.0", "dbt-snowflake>=1.8.0,<2.0.0", - "dbt-spark>=1.8.0,<2.0.0", + "dbt-spark[all]>=1.8.0,<2.0.0", ] bigquery = [ "dbt-bigquery>=1.8.0,<2.0.0", From db29cd78b980c806027c587e5ab24cf9f42baeaf Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 16:51:32 +0300 Subject: [PATCH 19/24] fix: rename remote to fs --- airflow_dbt_python/hooks/__init__.py | 2 +- airflow_dbt_python/hooks/dbt.py | 32 +++++----- .../hooks/{remote => fs}/__init__.py | 32 +++++----- .../hooks/{remote => fs}/gcs.py | 10 ++-- .../hooks/{remote => fs}/git.py | 10 ++-- .../hooks/{remote/localfs.py => fs/local.py} | 10 ++-- airflow_dbt_python/hooks/{remote => fs}/s3.py | 10 ++-- docs/getting_started.rst | 6 +- docs/how_does_it_work.dot | 8 +-- docs/how_does_it_work.rst | 12 ++-- docs/reference/hooks.rst | 2 +- tests/conftest.py | 4 +- tests/hooks/dbt/test_dbt_hook_base.py | 34 +++++------ tests/hooks/test_gcs_hook.py | 6 +- tests/hooks/test_git_hook.py | 42 +++++++------- tests/hooks/test_localfs_hook.py | 28 ++++----- tests/hooks/test_s3_hook.py | 58 +++++++++---------- tests/operators/test_dbt_build.py | 4 +- tests/operators/test_dbt_clean.py | 4 +- tests/operators/test_dbt_deps.py | 4 +- tests/operators/test_dbt_docs_generate.py | 4 +- tests/operators/test_dbt_run.py | 4 +- tests/operators/test_dbt_seed.py | 4 +- tests/operators/test_dbt_test.py | 4 +- 24 files changed, 167 insertions(+), 167 deletions(-) rename airflow_dbt_python/hooks/{remote => fs}/__init__.py (86%) rename airflow_dbt_python/hooks/{remote => fs}/gcs.py (95%) rename airflow_dbt_python/hooks/{remote => fs}/git.py (95%) rename airflow_dbt_python/hooks/{remote/localfs.py => fs/local.py} (93%) rename airflow_dbt_python/hooks/{remote => fs}/s3.py (94%) diff --git a/airflow_dbt_python/hooks/__init__.py b/airflow_dbt_python/hooks/__init__.py index df13f62..64b78d1 100644 --- a/airflow_dbt_python/hooks/__init__.py +++ b/airflow_dbt_python/hooks/__init__.py @@ -1 +1 @@ -"""Hooks module provides DbtHooks and DbtRemoteHooks.""" +"""Hooks module provides DbtHooks and DbtFSHooks.""" diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index 59fb038..e70874d 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -33,12 +33,12 @@ if TYPE_CHECKING: from dbt.contracts.results import RunResult - from airflow_dbt_python.hooks.remote import DbtRemoteHook + from airflow_dbt_python.hooks.fs import DbtFSHook from airflow_dbt_python.hooks.target import DbtConnectionHook from airflow_dbt_python.utils.configs import BaseConfig from airflow_dbt_python.utils.url import URLLike - DbtRemoteHooksDict = Dict[Tuple[str, Optional[str]], DbtRemoteHook] + DbtFSHooksDict = Dict[Tuple[str, Optional[str]], DbtFSHook] class DbtTaskResult(NamedTuple): @@ -103,16 +103,16 @@ def get_dbt_target_hook(conn_id: str) -> DbtConnectionHook: return DbtConnectionHook.get_db_conn_hook(conn_id) @staticmethod - def get_remote(scheme: str, conn_id: Optional[str]) -> DbtRemoteHook: - """Get a remote to interact with dbt files. + def get_fs_hook(scheme: str, conn_id: Optional[str]) -> DbtFSHook: + """Get a fs_hook to interact with dbt files. - RemoteHooks are defined by the scheme we are looking for and an optional + FSHooks are defined by the scheme we are looking for and an optional connection id if we are looking to interface with any Airflow hook that uses a connection. """ - from .remote import get_remote + from .fs import get_fs_hook - return get_remote(scheme, conn_id) + return get_fs_hook(scheme, conn_id) def download_dbt_profiles( self, @@ -121,13 +121,13 @@ def download_dbt_profiles( ) -> Path: """Pull a dbt profiles.yml file from a given profiles_dir. - This operation is delegated to a DbtRemoteHook. An optional connection id is + This operation is delegated to a DbtFSHook. An optional connection id is supported for remotes that require it. """ scheme = urlparse(str(profiles_dir)).scheme - remote = self.get_remote(scheme, self.profiles_conn_id) + fs_hook = self.get_fs_hook(scheme, self.profiles_conn_id) - return remote.download_dbt_profiles(profiles_dir, destination) + return fs_hook.download_dbt_profiles(profiles_dir, destination) def download_dbt_project( self, @@ -136,13 +136,13 @@ def download_dbt_project( ) -> Path: """Pull a dbt project from a given project_dir. - This operation is delegated to a DbtRemoteHook. An optional connection id is + This operation is delegated to a DbtFSHook. An optional connection id is supported for remotes that require it. """ scheme = urlparse(str(project_dir)).scheme - remote = self.get_remote(scheme, self.project_conn_id) + fs_hook = self.get_fs_hook(scheme, self.project_conn_id) - return remote.download_dbt_project(project_dir, destination) + return fs_hook.download_dbt_project(project_dir, destination) def upload_dbt_project( self, @@ -153,13 +153,13 @@ def upload_dbt_project( ) -> None: """Push a dbt project from a given project_dir. - This operation is delegated to a DbtRemoteHook. An optional connection id is + This operation is delegated to a DbtFSHook. An optional connection id is supported for remotes that require it. """ scheme = urlparse(str(destination)).scheme - remote = self.get_remote(scheme, self.project_conn_id) + fs_hook = self.get_fs_hook(scheme, self.project_conn_id) - return remote.upload_dbt_project( + return fs_hook.upload_dbt_project( project_dir, destination, replace=replace, delete_before=delete_before ) diff --git a/airflow_dbt_python/hooks/remote/__init__.py b/airflow_dbt_python/hooks/fs/__init__.py similarity index 86% rename from airflow_dbt_python/hooks/remote/__init__.py rename to airflow_dbt_python/hooks/fs/__init__.py index 711529f..e535692 100644 --- a/airflow_dbt_python/hooks/remote/__init__.py +++ b/airflow_dbt_python/hooks/fs/__init__.py @@ -1,6 +1,6 @@ -"""The DbtRemoteHook interface includes methods for downloading and uploading files. +"""The DbtFSHook interface includes methods for downloading and uploading files. -Internally, DbtRemoteHooks can use Airflow hooks to execute the actual operations. +Internally, DbtFSHooks can use Airflow hooks to execute the actual operations. Currently, only AWS S3 and the local filesystem are supported as remotes. """ @@ -17,7 +17,7 @@ StrPath = str -class DbtRemoteHook(ABC, LoggingMixin): +class DbtFSHook(ABC, LoggingMixin): """Represents a dbt project storing any dbt files. A concrete backend class should implement the push and pull methods to fetch one @@ -141,33 +141,33 @@ def upload_dbt_project( @cache -def get_remote(scheme: str, conn_id: Optional[str] = None) -> DbtRemoteHook: - """Get a DbtRemoteHook as long as the scheme is supported. +def get_fs_hook(scheme: str, conn_id: Optional[str] = None) -> DbtFSHook: + """Get a DbtFSHook as long as the scheme is supported. In the future we should make our hooks discoverable and package ourselves as a proper Airflow providers package. """ if scheme == "s3": - from .s3 import DbtS3RemoteHook + from .s3 import DbtS3FSHook - remote_cls: Type[DbtRemoteHook] = DbtS3RemoteHook + fs_hook_cls: Type[DbtFSHook] = DbtS3FSHook elif scheme == "gs": - from .gcs import DbtGCSRemoteHook + from .gcs import DbtGCSFSHook - remote_cls = DbtGCSRemoteHook + fs_hook_cls = DbtGCSFSHook elif scheme in ("https", "git", "git+ssh", "ssh", "http"): - from .git import DbtGitRemoteHook + from .git import DbtGitFSHook - remote_cls = DbtGitRemoteHook + fs_hook_cls = DbtGitFSHook elif scheme == "": - from .localfs import DbtLocalFsRemoteHook + from .local import DbtLocalFsHook - remote_cls = DbtLocalFsRemoteHook + fs_hook_cls = DbtLocalFsHook else: raise NotImplementedError(f"Backend {scheme} is not supported") if conn_id is not None: - remote = remote_cls(conn_id) + fs_hook = fs_hook_cls(conn_id) else: - remote = remote_cls() - return remote + fs_hook = fs_hook_cls() + return fs_hook diff --git a/airflow_dbt_python/hooks/remote/gcs.py b/airflow_dbt_python/hooks/fs/gcs.py similarity index 95% rename from airflow_dbt_python/hooks/remote/gcs.py rename to airflow_dbt_python/hooks/fs/gcs.py index 31cc459..6d1d793 100644 --- a/airflow_dbt_python/hooks/remote/gcs.py +++ b/airflow_dbt_python/hooks/fs/gcs.py @@ -9,16 +9,16 @@ from airflow.providers.google.cloud.hooks.gcs import GCSHook, _parse_gcs_url from google.cloud.storage import Blob -from airflow_dbt_python.hooks.remote import DbtRemoteHook +from airflow_dbt_python.hooks.fs import DbtFSHook from airflow_dbt_python.utils.url import URL, URLLike -class DbtGCSRemoteHook(GCSHook, DbtRemoteHook): +class DbtGCSFSHook(GCSHook, DbtFSHook): """A dbt remote implementation for GCS. - This concrete remote class implements the DbtRemote interface by using GCS as a + This concrete remote class implements the DbtFs interface by using GCS as a storage for uploading and downloading dbt files to and from. - The DbtGCSRemoteHook subclasses Airflow's GCSHook to interact with GCS. + The DbtGCSFSHook subclasses Airflow's GCSHook to interact with GCS. A connection id may be passed to set the connection to use with GCS. """ @@ -128,7 +128,7 @@ def _download( destination: A destination URL where to download the objects to. The existing sub-directory hierarchy in GCS will be preserved. replace: Indicates whether to replace existing files when downloading. - This flag is kept here to comply with the DbtRemote interface but its + This flag is kept here to comply with the DbtFs interface but its ignored as files downloaded from GCS always overwrite local files. delete_before: Delete destination directory before download. """ diff --git a/airflow_dbt_python/hooks/remote/git.py b/airflow_dbt_python/hooks/fs/git.py similarity index 95% rename from airflow_dbt_python/hooks/remote/git.py rename to airflow_dbt_python/hooks/fs/git.py index e75f618..70949ee 100644 --- a/airflow_dbt_python/hooks/remote/git.py +++ b/airflow_dbt_python/hooks/fs/git.py @@ -1,4 +1,4 @@ -"""A concrete DbtRemoteHook for git repositories with dulwich.""" +"""A concrete DbtFSHook for git repositories with dulwich.""" import datetime as dt from typing import Callable, Optional, Tuple, Union @@ -11,7 +11,7 @@ from dulwich.protocol import ZERO_SHA from dulwich.repo import Repo -from airflow_dbt_python.hooks.remote import DbtRemoteHook +from airflow_dbt_python.hooks.fs import DbtFSHook from airflow_dbt_python.utils.url import URL GitClients = Union[HttpGitClient, SSHGitClient, TCPGitClient] @@ -22,13 +22,13 @@ def no_filter(_: URL) -> bool: return True -class DbtGitRemoteHook(SSHHook, DbtRemoteHook): +class DbtGitFSHook(SSHHook, DbtFSHook): """A dbt remote implementation for git repositories. - This concrete remote class implements the DbtRemote interface by using any git + This concrete remote class implements the DbtFs interface by using any git repository to upload and download dbt files to and from. - The DbtGitRemoteHook subclasses Airflow's SSHHook to interact with to utilize its + The DbtGitFSHook subclasses Airflow's SSHHook to interact with to utilize its defined methods to operate with SSH connections. However, SSH connections are not the only ones supported for interacting with git repositories: HTTP (http:// or https://) and plain TCP (git://) may be used. diff --git a/airflow_dbt_python/hooks/remote/localfs.py b/airflow_dbt_python/hooks/fs/local.py similarity index 93% rename from airflow_dbt_python/hooks/remote/localfs.py rename to airflow_dbt_python/hooks/fs/local.py index a98bcf7..9f4ec7c 100644 --- a/airflow_dbt_python/hooks/remote/localfs.py +++ b/airflow_dbt_python/hooks/fs/local.py @@ -12,14 +12,14 @@ from airflow.hooks.filesystem import FSHook -from airflow_dbt_python.hooks.remote import DbtRemoteHook +from airflow_dbt_python.hooks.fs import DbtFSHook from airflow_dbt_python.utils.url import URL -class DbtLocalFsRemoteHook(FSHook, DbtRemoteHook): - """A concrete dbt remote for a local filesystem. +class DbtLocalFsHook(FSHook, DbtFSHook): + """A concrete dbt hook for a local filesystem. - This remote is intended to be used when running Airflow with a LocalExecutor, and + This hook is intended to be used when running Airflow with a LocalExecutor, and it relies on shutil from the standard library to do all the file manipulation. For these reasons, running multiple concurrent tasks with this remote may lead to race conditions if attempting to push files to the remote. @@ -28,7 +28,7 @@ class DbtLocalFsRemoteHook(FSHook, DbtRemoteHook): conn_name_attr = "fs_conn_id" default_conn_name = "fs_default" conn_type = "filesystem" - hook_name = "dbt Local Filesystem RemoteHook" + hook_name = "dbt Local Filesystem FSHook" def __init__( self, diff --git a/airflow_dbt_python/hooks/remote/s3.py b/airflow_dbt_python/hooks/fs/s3.py similarity index 94% rename from airflow_dbt_python/hooks/remote/s3.py rename to airflow_dbt_python/hooks/fs/s3.py index 2acb271..85a9ffb 100644 --- a/airflow_dbt_python/hooks/remote/s3.py +++ b/airflow_dbt_python/hooks/fs/s3.py @@ -6,16 +6,16 @@ from airflow.providers.amazon.aws.hooks.s3 import S3Hook -from airflow_dbt_python.hooks.remote import DbtRemoteHook +from airflow_dbt_python.hooks.fs import DbtFSHook from airflow_dbt_python.utils.url import URL, URLLike -class DbtS3RemoteHook(S3Hook, DbtRemoteHook): +class DbtS3FSHook(S3Hook, DbtFSHook): """A dbt remote implementation for S3. - This concrete remote class implements the DbtRemote interface by using S3 as a + This concrete remote class implements the DbtFs interface by using S3 as a storage for uploading and downloading dbt files to and from. - The DbtS3RemoteHook subclasses Airflow's S3Hook to interact with S3. A connection id + The DbtS3FSHook subclasses Airflow's S3Hook to interact with S3. A connection id may be passed to set the connection to use with S3. """ @@ -126,7 +126,7 @@ def _download( destination: A destination URL where to download the objects to. The existing sub-directory hierarchy in S3 will be preserved. replace: Indicates whether to replace existing files when downloading. - This flag is kept here to comply with the DbtRemote interface but its + This flag is kept here to comply with the DbtFs interface but its ignored as files downloaded from S3 always overwrite local files. delete_before: Delete destination directory before download. """ diff --git a/docs/getting_started.rst b/docs/getting_started.rst index f0307a7..a22a58f 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -229,7 +229,7 @@ When Airflow is installed is running on a multi- machine or cloud installation, For these deployments we must rely on a *dbt* remote to download and, eventually, upload all required *dbt* files. The remote *dbt* URL may be used in place of a local ``project_dir`` or ``profiles_dir`` to have *airflow-dbt-python* download the *dbt* files in the remote into a temporary directory for execution. -Interactions with storages are supported by subclasses of ``DbtRemoteHook``. Read the documentation :ref:`dbt_remote_hooks` to learn more about these hooks. +Interactions with storages are supported by subclasses of ``DbtFSHook``. Read the documentation :ref:`dbt_remote_hooks` to learn more about these hooks. As an example, let's upload our *dbt* project to an AWS S3 bucket. The files may end up structured in the bucket as: @@ -285,7 +285,7 @@ Then, we can alter the previous example DAG to set ``project_dir`` and ``profile profile="my-project", ) -*airflow-dbt-python* uses the URL scheme (in this example, ``"s3"``) to figure out the type of remote, and the corresponding ``DbtRemoteHook`` to download all required files. An exception would be raised if the scheme does not point to a supported remote. +*airflow-dbt-python* uses the URL scheme (in this example, ``"s3"``) to figure out the type of remote, and the corresponding ``DbtFSHook`` to download all required files. An exception would be raised if the scheme does not point to a supported remote. *airflow-dbt-python* takes care of adjusting any path-like arguments so that they are pointing to files in a local temporary directory once all the *dbt* files are download from the remote storage. @@ -320,7 +320,7 @@ The DAG looks the same as the AWS S3 example, except that now we use the GitHub profile="my-project", ) -*airflow-dbt-python* can determine this URL requires a ``DbtGitRemoteHook`` by looking at the URL's scheme (``"git+ssh"``). As we are passing an SSH URL, ``DbtGitRemoteHook`` can utilize an Airflow `SSH Connection `_ as it subclasses Airflow's ``SSHHook``. This connection type allows us to setup the necessary SSH keys to access GitHub. Of course, as this is a public repository, we could have just used an HTTP URL, but for private repositories an SSH key may be required. +*airflow-dbt-python* can determine this URL requires a ``DbtGitFSHook`` by looking at the URL's scheme (``"git+ssh"``). As we are passing an SSH URL, ``DbtGitFSHook`` can utilize an Airflow `SSH Connection `_ as it subclasses Airflow's ``SSHHook``. This connection type allows us to setup the necessary SSH keys to access GitHub. Of course, as this is a public repository, we could have just used an HTTP URL, but for private repositories an SSH key may be required. .. note:: *airflow-dbt-python* can utilize Airflow Connections to fetch connection details for *dbt* remotes as well as for *dbt* targets (e.g. for your data warehouse). The ``project_conn_id`` and ``profiles_conn_id`` arguments that all *dbt* operators have refer to Airflow Connections to used to fetch *dbt* projects and *profiles.yml* respectively, whereas the ``target`` argument can point to an Airflow Connection used to setup *dbt* to access your data warehouse. diff --git a/docs/how_does_it_work.dot b/docs/how_does_it_work.dot index 7b5f7e5..5b4e6da 100644 --- a/docs/how_does_it_work.dot +++ b/docs/how_does_it_work.dot @@ -18,8 +18,8 @@ digraph HowDoesItWork { DbtHook; DbtOperator -> DbtHook [label="run_dbt_task"]; - DbtRemoteHooks -> DbtHook [label="download"]; - DbtHook -> DbtRemoteHooks [label="upload", labelfloat=true]; + DbtFSHooks -> DbtHook [label="download"]; + DbtHook -> DbtFSHooks [label="upload", labelfloat=true]; } "dbt-core" [style=filled, fillcolor="#CBCBCB", color="#FF7557"]; @@ -34,7 +34,7 @@ digraph HowDoesItWork { {rank=same; split; DbtOperator; } "Remote storage" [style=filled, fillcolor="#CBCBCB", color="#FF7557"]; - DbtRemoteHooks -> "Remote storage" [headlabel="interacts", labeldistance=4.0]; - {rank=same; "Remote storage"; DbtRemoteHooks; } + DbtFSHooks -> "Remote storage" [headlabel="interacts", labeldistance=4.0]; + {rank=same; "Remote storage"; DbtFSHooks; } } diff --git a/docs/how_does_it_work.rst b/docs/how_does_it_work.rst index c38b798..2f17061 100644 --- a/docs/how_does_it_work.rst +++ b/docs/how_does_it_work.rst @@ -8,7 +8,7 @@ How does it work? To achieve this goal *airflow-dbt-python* provides Airflow operators, hooks, and other utilities. Hooks in particular come in two flavors: * A ``DbtHook`` that abstracts all interaction with *dbt* internals. -* Subclasses of ``DbtRemoteHook`` that expose an interface to interact with *dbt* remote storages where project files are located (like AWS S3 buckets or git repositories). +* Subclasses of ``DbtFSHook`` that expose an interface to interact with *dbt* remote storages where project files are located (like AWS S3 buckets or git repositories). .. graphviz:: how_does_it_work.dot @@ -53,14 +53,14 @@ In order to respect this constraint, *airflow-dbt-python* hooks run each *dbt* c This ensures *dbt* can work with any Airflow deployment, including most production deployments running `Remote Executors `_ that do not guarantee any files will be shared between tasks, since each task may run in a completely different worker. -.. _dbt_remote_hooks: +.. _dbt_fs_hooks: -*dbt* remote hooks +*dbt* filesystem hooks ------------------ -*dbt* remote hooks implement a simple interface to communicate with *dbt* remotes. A *dbt* remote can be any external storage that contains a *dbt* project and potentially also a *profiles.yml* file for example: an AWS S3 bucket, a Google Cloud Storage or a GitHub repository. See the reference for a list of which remotes are currently supported. +*dbt* fs hooks implement a simple interface to communicate with *dbt* remotes. A *dbt* fs can be any external storage that contains a *dbt* project and potentially also a *profiles.yml* file for example: an AWS S3 bucket, a Google Cloud Storage or a GitHub repository. See the reference for a list of which remotes are currently supported. -Implementing the ``DbtRemoteHook`` interface +Implementing the ``DbtFSHook`` interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Supporting a new remote to store *dbt* files requires implementing the ``DbtRemoteHook`` interface. There are only two methods in the interface: ``DbtRemoteHook.download`` and ``DbtRemoteHook.upload``. +Supporting a new fs to store *dbt* files requires implementing the ``DbtFSHook`` interface. There are only two methods in the interface: ``DbtFSHook.download`` and ``DbtFSHook.upload``. diff --git a/docs/reference/hooks.rst b/docs/reference/hooks.rst index 66cad15..fd64c3d 100644 --- a/docs/reference/hooks.rst +++ b/docs/reference/hooks.rst @@ -10,7 +10,7 @@ Core *dbt* hooks Supported *dbt* remote hooks ---------------------------- -The DbtRemoteHook interface +The DbtFSHook interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automodule:: airflow_dbt_python.hooks.remote diff --git a/tests/conftest.py b/tests/conftest.py index 38e19a4..1541347 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -448,14 +448,14 @@ def mocked_gcs_client(): @pytest.fixture def gcs_hook(gcp_conn_id): """Provide an GCS for testing.""" - from airflow_dbt_python.hooks.remote.gcs import DbtGCSRemoteHook + from airflow_dbt_python.hooks.fs.gcs import DbtGCSFSHook with patch( "airflow.providers.google.cloud.hooks.gcs.GCSHook.get_credentials_and_project_id", lambda x: ({}, "test-project"), ): with patch("google.cloud.storage.Client", MockStorageClient): - yield DbtGCSRemoteHook() + yield DbtGCSFSHook() @pytest.fixture diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 219d9cd..8d0a324 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -7,13 +7,13 @@ from airflow.exceptions import AirflowNotFoundException from airflow_dbt_python.hooks.dbt import DbtHook -from airflow_dbt_python.hooks.remote.localfs import DbtLocalFsRemoteHook +from airflow_dbt_python.hooks.fs.local import DbtLocalFsHook from airflow_dbt_python.hooks.target import DbtConnectionHook, DbtPostgresHook from airflow_dbt_python.utils.configs import RunTaskConfig condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_remote = pytest.mark.skipif( @@ -22,7 +22,7 @@ condition = False try: - from airflow_dbt_python.hooks.remote.git import DbtGitRemoteHook + from airflow_dbt_python.hooks.fs.git import DbtGitFSHook except ImportError: condition = True no_git_remote = pytest.mark.skipif( @@ -37,11 +37,11 @@ def test_dbt_hook_get_s3_remote(): hook = DbtHook() - remote = hook.get_remote("s3", "not_aws_default") + fs_hook = hook.get_fs_hook("s3", "not_aws_default") - assert isinstance(remote, DbtS3RemoteHook) - assert isinstance(remote, S3Hook) - assert remote.aws_conn_id == "not_aws_default" + assert isinstance(fs_hook, DbtS3FSHook) + assert isinstance(fs_hook, S3Hook) + assert fs_hook.aws_conn_id == "not_aws_default" def test_dbt_hook_get_local_fs_remote(): @@ -50,10 +50,10 @@ def test_dbt_hook_get_local_fs_remote(): hook = DbtHook() - remote = hook.get_remote("", None) + fs_hook = hook.get_fs_hook("", None) - assert isinstance(remote, DbtLocalFsRemoteHook) - assert isinstance(remote, FSHook) + assert isinstance(fs_hook, DbtLocalFsHook) + assert isinstance(fs_hook, FSHook) @no_git_remote @@ -62,17 +62,17 @@ def test_dbt_hook_get_git_remote(scheme): """Test the correct remote is procured.""" hook = DbtHook() - remote = hook.get_remote(scheme, None) + fs_hook = hook.get_fs_hook(scheme, None) - assert isinstance(remote, DbtGitRemoteHook) + assert isinstance(fs_hook, DbtGitFSHook) -def test_dbt_hook_get_remote_raises_not_implemented(): +def test_dbt_hook_get_fs_hook_raises_not_implemented(): """Test an error is raised on unsupported remote.""" hook = DbtHook() with pytest.raises(NotImplementedError): - hook.get_remote("does not exist", None) + hook.get_fs_hook("does not exist", None) class FakeRemote: @@ -97,7 +97,7 @@ def test_dbt_hook_download_dbt_profiles(mocker): We ignore types as we are monkey patching a FakeRemote for testing. """ hook = DbtHook() - mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_fs_hook") mock.return_value = FakeRemote() args, kwargs = hook.download_dbt_profiles("/path/to/profiles", "/path/to/store") # type: ignore @@ -112,7 +112,7 @@ def test_dbt_hook_upload_dbt_project(mocker): We ignore types as we are monkey patching a FakeRemote for testing. """ hook = DbtHook() - mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_fs_hook") mock.return_value = FakeRemote() args, kwargs = hook.upload_dbt_project( # type: ignore @@ -126,7 +126,7 @@ def test_dbt_hook_upload_dbt_project(mocker): def test_dbt_hook_download_dbt_project(mocker): """Test dbt hook calls remote correctly.""" hook = DbtHook(project_conn_id="conn_id") - mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_remote") + mock = mocker.patch("airflow_dbt_python.hooks.dbt.DbtHook.get_fs_hook") mock.return_value = FakeRemote() args, kwargs = hook.download_dbt_project("/path/to/profiles", "/path/to/store") # type: ignore diff --git a/tests/hooks/test_gcs_hook.py b/tests/hooks/test_gcs_hook.py index 81398bc..b29a876 100644 --- a/tests/hooks/test_gcs_hook.py +++ b/tests/hooks/test_gcs_hook.py @@ -1,4 +1,4 @@ -"""Unit test module for DbtGCSRemoteHook.""" +"""Unit test module for DbtGCSFSHook.""" import io from zipfile import ZipFile @@ -7,7 +7,7 @@ import pytest try: - from airflow_dbt_python.hooks.remote.gcs import DbtGCSRemoteHook + from airflow_dbt_python.hooks.fs.gcs import DbtGCSFSHook except ImportError: pytest.skip( "GCS Remote not available, consider installing google extras", @@ -418,7 +418,7 @@ def test_load_file_handle_replace_error_returns_false_on_valueerror(gcp_conn_id) replace = False. """ - class FakeHook(DbtGCSRemoteHook): + class FakeHook(DbtGCSFSHook): def load_file(*args, **kwargs): raise ValueError() diff --git a/tests/hooks/test_git_hook.py b/tests/hooks/test_git_hook.py index 6009c3a..3c7e3bd 100644 --- a/tests/hooks/test_git_hook.py +++ b/tests/hooks/test_git_hook.py @@ -1,4 +1,4 @@ -"""Unit test module for DbtGitRemoteHook.""" +"""Unit test module for DbtGitFSHook.""" import multiprocessing import os @@ -9,7 +9,7 @@ from dulwich.repo import Repo from dulwich.server import DictBackend, TCPGitServer -from airflow_dbt_python.hooks.remote.git import DbtGitRemoteHook +from airflow_dbt_python.hooks.fs.git import DbtGitFSHook from airflow_dbt_python.utils.url import URL JAFFLE_SHOP = os.getenv("GIT_TEST_REPO", "tomasfarias/jaffle_shop") @@ -40,9 +40,9 @@ def test_download_dbt_project_from_http_public_github_repo( In this test we use an HTTP/HTTPS connection to access GitHub. No credentials are required as the test repo is public. """ - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -77,9 +77,9 @@ def test_download_dbt_project_from_ssh_public_github_repo( SSH key to be setup in the host, so the tests are flaky by design. Future tests will rely on Airflow connections and test SSH keys instead. """ - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -109,9 +109,9 @@ def test_download_dbt_project_from_http_public_gitlab_repo( In this test we use an HTTP/HTTPS connection to access GitLab. No credentials are required as the test repo is public. """ - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -150,9 +150,9 @@ def test_download_dbt_project_from_https_private_github_repo_using_token( """ username, token = os.environ["GITHUB_USERNAME"], os.environ["GITHUB_READ_TOKEN"] - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url.format(username=username, token=token)) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -187,9 +187,9 @@ def test_download_dbt_project_from_ssh_public_gitlab_repo( SSH key to be setup in the host, so the tests are flaky by design. Future tests will rely on Airflow connections and test SSH keys instead. """ - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -228,9 +228,9 @@ def test_download_dbt_project_from_https_private_gitlab_repo_using_token( """ token = os.environ["GITLAB_READ_TOKEN"] - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url.format(token=token)) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -271,9 +271,9 @@ def test_download_dbt_project_from_https_private_gitlab_repo_using_credentials( """ username, password = os.environ["GITLAB_USERNAME"], os.environ["GITLAB_PASSWORD"] - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() source = URL(repo_url.format(username=username, password=password)) - local_repo_path = remote.download_dbt_project(source, tmp_path) + local_repo_path = fs_hook.download_dbt_project(source, tmp_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -348,10 +348,10 @@ def test_download_dbt_project_with_local_server( ): """Test downloading a dbt project from a local git server.""" local_path = tmp_path / "local" - remote = DbtGitRemoteHook() + fs_hook = DbtGitFSHook() server_address, server_port = git_server source = URL(f"git://{server_address}:{server_port}/{repo_name}") - local_repo_path = remote.download_dbt_project(source, local_path) + local_repo_path = fs_hook.download_dbt_project(source, local_path) expected = [ URL(local_repo_path / "dbt_project.yml"), @@ -393,14 +393,14 @@ def upload_only_target(u: URL): return True return False - remote = DbtGitRemoteHook(upload_filter=upload_only_target) + fs_hook = DbtGitFSHook(upload_filter=upload_only_target) server_address, server_port = git_server destination = URL(f"git://{server_address}:{server_port}/{repo_name}") - remote.upload_dbt_project(str(repo_dir), destination) + fs_hook.upload_dbt_project(str(repo_dir), destination) new_repo_path = tmp_path / "new_repo" - remote.download_dbt_project(destination, new_repo_path) + fs_hook.download_dbt_project(destination, new_repo_path) expected = [ URL(new_repo_path / "dbt_project.yml"), diff --git a/tests/hooks/test_localfs_hook.py b/tests/hooks/test_localfs_hook.py index 763cbda..5165edf 100644 --- a/tests/hooks/test_localfs_hook.py +++ b/tests/hooks/test_localfs_hook.py @@ -1,16 +1,16 @@ -"""Unit test module for DbtLocalFsRemoteHook.""" +"""Unit test module for DbtLocalFsHook.""" import shutil from pathlib import Path from zipfile import ZipFile -from airflow_dbt_python.hooks.remote.localfs import DbtLocalFsRemoteHook +from airflow_dbt_python.hooks.fs.local import DbtLocalFsHook def test_download_dbt_profiles(tmpdir, profiles_file): """Test downloading dbt profile from local path.""" - remote = DbtLocalFsRemoteHook() - profiles_path = remote.download_dbt_profiles( + fs_hook = DbtLocalFsHook() + profiles_path = fs_hook.download_dbt_profiles( profiles_file, tmpdir, ) @@ -36,8 +36,8 @@ def test_download_dbt_profiles_sub_dir(tmpdir, profiles_file): assert new_profiles_file.exists() assert new_profiles_file.is_file() - remote = DbtLocalFsRemoteHook() - profiles_path = remote.download_dbt_profiles( + fs_hook = DbtLocalFsHook() + profiles_path = fs_hook.download_dbt_profiles( new_profiles_file, tmpdir / "v0.0.1", ) @@ -59,8 +59,8 @@ def test_upload_dbt_project_to_files(tmpdir, test_files): files = list(local_path.glob("**/*")) assert len(files) == 0 - remote = DbtLocalFsRemoteHook() - remote.upload_dbt_project(test_files[0].parent.parent, local_path) + fs_hook = DbtLocalFsHook() + fs_hook.upload_dbt_project(test_files[0].parent.parent, local_path) files = list(local_path.glob("**/*.*")) assert len(files) == 4 @@ -89,8 +89,8 @@ def test_download_dbt_project(tmpdir, dbt_project_file): dest_path = tmpdir / "dest" dest_path.mkdir() - remote = DbtLocalFsRemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtLocalFsHook() + project_path = fs_hook.download_dbt_project( source_path, dest_path, ) @@ -139,8 +139,8 @@ def test_download_dbt_project_from_zip_file(tmpdir, dbt_project_file, test_files dest_path = tmpdir / "dest_zip" dest_path.mkdir() - remote = DbtLocalFsRemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtLocalFsHook() + project_path = fs_hook.download_dbt_project( zip_path / "project.zip", dest_path, ) @@ -179,7 +179,7 @@ def test_upload_dbt_project_to_zip_file(tmpdir, test_files): assert not zip_path.exists() - remote = DbtLocalFsRemoteHook() - remote.upload_dbt_project(test_files[0].parent.parent, zip_path) + fs_hook = DbtLocalFsHook() + fs_hook.upload_dbt_project(test_files[0].parent.parent, zip_path) assert zip_path.exists() diff --git a/tests/hooks/test_s3_hook.py b/tests/hooks/test_s3_hook.py index e649b7f..17088e8 100644 --- a/tests/hooks/test_s3_hook.py +++ b/tests/hooks/test_s3_hook.py @@ -1,4 +1,4 @@ -"""Unit test module for DbtS3RemoteHook.""" +"""Unit test module for DbtS3FSHook.""" import io from zipfile import ZipFile @@ -7,7 +7,7 @@ import pytest try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: pytest.skip( "S3 Remote not available, consider installing amazon extras", @@ -23,8 +23,8 @@ def test_download_dbt_profiles(s3_bucket, s3_hook, tmpdir, profiles_file): profiles_content = pf.read() bucket.put_object(Key="profiles/profiles.yml", Body=profiles_content.encode()) - remote = DbtS3RemoteHook() - profiles_path = remote.download_dbt_profiles( + fs_hook = DbtS3FSHook() + profiles_path = fs_hook.download_dbt_profiles( f"s3://{s3_bucket}/profiles/", tmpdir, ) @@ -46,8 +46,8 @@ def test_download_dbt_profiles_sub_dir(s3_bucket, s3_hook, tmpdir, profiles_file Key="profiles/v0.0.1/profiles.yml", Body=profiles_content.encode() ) - remote = DbtS3RemoteHook() - profiles_path = remote.download_dbt_profiles( + fs_hook = DbtS3FSHook() + profiles_path = fs_hook.download_dbt_profiles( f"s3://{s3_bucket}/profiles/v0.0.1", tmpdir, ) @@ -71,8 +71,8 @@ def test_download_dbt_profiles_sub_dir_trailing_slash( Key="profiles/v0.0.1/profiles.yml", Body=profiles_content.encode() ) - remote = DbtS3RemoteHook() - profiles_path = remote.download_dbt_profiles( + fs_hook = DbtS3FSHook() + profiles_path = fs_hook.download_dbt_profiles( f"s3://{s3_bucket}/profiles/v0.0.1/", tmpdir, ) @@ -95,8 +95,8 @@ def test_download_dbt_project(s3_bucket, s3_hook, tmpdir, dbt_project_file): bucket.put_object(Key="project/models/another_model.sql", Body=b"SELECT 2") bucket.put_object(Key="project/data/a_seed.csv", Body=b"col1,col2\n1,2") - remote = DbtS3RemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtS3FSHook() + project_path = fs_hook.download_dbt_project( f"s3://{s3_bucket}/project/", tmpdir.mkdir("project"), ) @@ -140,8 +140,8 @@ def test_download_dbt_project_no_trailing_slash( bucket.put_object(Key="project/models/another_model.sql", Body=b"SELECT 2") bucket.put_object(Key="project/data/a_seed.csv", Body=b"col1,col2\n1,2") - remote = DbtS3RemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtS3FSHook() + project_path = fs_hook.download_dbt_project( f"s3://{s3_bucket}/project", tmpdir.mkdir("project"), ) @@ -191,8 +191,8 @@ def test_download_dbt_project_from_zip_file( bucket = s3_hook.get_bucket(s3_bucket) bucket.put_object(Key="project/project.zip", Body=zip_buffer.getvalue()) - remote = DbtS3RemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtS3FSHook() + project_path = fs_hook.download_dbt_project( f"s3://{s3_bucket}/project/project.zip", tmpdir.mkdir("project"), ) @@ -236,8 +236,8 @@ def test_download_dbt_project_with_empty_file( bucket.put_object(Key="project/data/a_seed.csv", Body=b"col1,col2\n1,2") bucket.put_object(Key="project/data//", Body=b"") - remote = DbtS3RemoteHook() - project_path = remote.download_dbt_project( + fs_hook = DbtS3FSHook() + project_path = fs_hook.download_dbt_project( f"s3://{s3_bucket}/project", tmpdir.mkdir("project"), ) @@ -272,8 +272,8 @@ def test_upload_dbt_project_to_zip_file(s3_bucket, s3_hook, tmpdir, test_files): key = s3_hook.check_for_key(zip_s3_key) assert key is False - remote = DbtS3RemoteHook() - remote.upload_dbt_project(test_files[0].parent.parent, zip_s3_key) + fs_hook = DbtS3FSHook() + fs_hook.upload_dbt_project(test_files[0].parent.parent, zip_s3_key) key = s3_hook.check_for_key( "project/project.zip", @@ -294,8 +294,8 @@ def test_upload_dbt_project_to_files(s3_bucket, s3_hook, test_files): prefix = f"s3://{s3_bucket}/project/" - remote = DbtS3RemoteHook() - remote.upload_dbt_project(test_files[0].parent.parent, prefix) + fs_hook = DbtS3FSHook() + fs_hook.upload_dbt_project(test_files[0].parent.parent, prefix) keys = s3_hook.list_keys(bucket_name=s3_bucket) assert len(keys) == 4 @@ -329,11 +329,11 @@ def test_upload_dbt_project_with_no_replace(s3_bucket, s3_hook, test_files): ) last_modified_expected[key] = obj.last_modified - remote = DbtS3RemoteHook() + fs_hook = DbtS3FSHook() with freezegun.freeze_time("2022-02-02"): # Try to push the same files, a month after. # Should not be replaced since replace = False. - remote.upload_dbt_project( + fs_hook.upload_dbt_project( project_dir, f"s3://{s3_bucket}/project/", replace=False ) @@ -388,11 +388,11 @@ def test_upload_dbt_project_with_partial_replace( [f"s3://{s3_bucket}/project/seeds/a_seed.csv"], ) - remote = DbtS3RemoteHook() + fs_hook = DbtS3FSHook() with freezegun.freeze_time("2022-02-02"): # Attempt to push project a month after. # Only one file should be pushed as the rest exist and we using replace = False. - remote.upload_dbt_project( + fs_hook.upload_dbt_project( project_dir, f"s3://{s3_bucket}/project/", replace=False ) @@ -446,10 +446,10 @@ def test_upload_dbt_project_with_delete_before(s3_bucket, s3_hook, tmpdir, test_ keys = s3_hook.list_keys(bucket_name=s3_bucket) assert len(keys) == 5 - remote = DbtS3RemoteHook() + fs_hook = DbtS3FSHook() with freezegun.freeze_time("2022-02-02"): # Try to push the same files, a month after. - remote.upload_dbt_project(project_dir, prefix, delete_before=True) + fs_hook.upload_dbt_project(project_dir, prefix, delete_before=True) keys = s3_hook.list_keys(bucket_name=s3_bucket) assert len(keys) == 4, keys @@ -474,12 +474,12 @@ def test_load_file_handle_replace_error_returns_false_on_valueerror(): replace = False. """ - class FakeHook(DbtS3RemoteHook): + class FakeHook(DbtS3FSHook): def load_file(*args, **kwargs): raise ValueError() - remote = FakeHook() + fs_hook = FakeHook() - result = remote.load_file_handle_replace_error("/path/to/file", "s3://path/to/key") + result = fs_hook.load_file_handle_replace_error("/path/to/file", "s3://path/to/key") assert result is False diff --git a/tests/operators/test_dbt_build.py b/tests/operators/test_dbt_build.py index 8ccc812..6d58a04 100644 --- a/tests/operators/test_dbt_build.py +++ b/tests/operators/test_dbt_build.py @@ -12,11 +12,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_remote = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_clean.py b/tests/operators/test_dbt_clean.py index a4e55a1..d1dc639 100644 --- a/tests/operators/test_dbt_clean.py +++ b/tests/operators/test_dbt_clean.py @@ -7,11 +7,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_deps.py b/tests/operators/test_dbt_deps.py index de5675c..1612678 100644 --- a/tests/operators/test_dbt_deps.py +++ b/tests/operators/test_dbt_deps.py @@ -12,11 +12,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_docs_generate.py b/tests/operators/test_dbt_docs_generate.py index 9509f40..38d035d 100644 --- a/tests/operators/test_dbt_docs_generate.py +++ b/tests/operators/test_dbt_docs_generate.py @@ -7,11 +7,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_run.py b/tests/operators/test_dbt_run.py index 3b8151b..2b0377c 100644 --- a/tests/operators/test_dbt_run.py +++ b/tests/operators/test_dbt_run.py @@ -12,11 +12,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_seed.py b/tests/operators/test_dbt_seed.py index 1a40d43..6db81f3 100644 --- a/tests/operators/test_dbt_seed.py +++ b/tests/operators/test_dbt_seed.py @@ -12,11 +12,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) diff --git a/tests/operators/test_dbt_test.py b/tests/operators/test_dbt_test.py index cff6520..58ab7df 100644 --- a/tests/operators/test_dbt_test.py +++ b/tests/operators/test_dbt_test.py @@ -10,11 +10,11 @@ condition = False try: - from airflow_dbt_python.hooks.remote.s3 import DbtS3RemoteHook + from airflow_dbt_python.hooks.fs.s3 import DbtS3FSHook except ImportError: condition = True no_s3_backend = pytest.mark.skipif( - condition, reason="S3 RemoteHook not available, consider installing amazon extras" + condition, reason="S3 FSHook not available, consider installing amazon extras" ) From 79a369dc613a79ddae1bf227629b2a1f255826de Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 16:56:11 +0300 Subject: [PATCH 20/24] fix: add comment for regexp --- airflow_dbt_python/hooks/target.py | 1 + 1 file changed, 1 insertion(+) diff --git a/airflow_dbt_python/hooks/target.py b/airflow_dbt_python/hooks/target.py index 6da8a95..053d297 100644 --- a/airflow_dbt_python/hooks/target.py +++ b/airflow_dbt_python/hooks/target.py @@ -220,6 +220,7 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: conn = copy(conn) extra_dejson = conn.extra_dejson options = extra_dejson.pop("options") + # This is to pass options (e.g. `-c search_path=myschema`) to dbt in the required form for k, v in re.findall(r"-c (\w+)=(.*)$", options): extra_dejson[k] = v conn.extra = json.dumps(extra_dejson) From ef3038f1136be80f51663ba410d4225d94e7c74d Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 16:59:47 +0300 Subject: [PATCH 21/24] fix: clean up the mess --- airflow_dbt_python/hooks/fs/gcs.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/airflow_dbt_python/hooks/fs/gcs.py b/airflow_dbt_python/hooks/fs/gcs.py index 6d1d793..344e1ec 100644 --- a/airflow_dbt_python/hooks/fs/gcs.py +++ b/airflow_dbt_python/hooks/fs/gcs.py @@ -173,10 +173,6 @@ def iter_url(self, source: URL) -> Iterable[URL]: bucket_name, key_prefix = _parse_gcs_url(str(source)) for key in self.list(bucket_name=bucket_name, prefix=key_prefix): - if key.endswith("//"): - # Sometimes, GCS files with empty names can appear, usually when using - # the UI. These empty GCS files may also be confused with directories. - continue yield URL.from_parts(scheme="gs", netloc=bucket_name, path=key) def get_key(self, key: str, bucket_name: str) -> Blob: From 23dfb306634f4f22e1fc498752e1ca7186368503 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 17:47:11 +0300 Subject: [PATCH 22/24] fix: mock-gcp from PyPI --- poetry.lock | 48 ++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index c30e21d..0233bd6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "agate" @@ -886,7 +886,7 @@ description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -946,7 +946,7 @@ description = "Backport of CPython tarfile module" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.12\" and (extra == \"adapters\" or extra == \"snowflake\")" +markers = "(extra == \"adapters\" or extra == \"snowflake\") and python_version < \"3.12\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -1565,8 +1565,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -1973,7 +1973,7 @@ description = "Backport of contextlib.chdir stdlib class added in Python3.11." optional = false python-versions = ">=3.6,<4.0" groups = ["main"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "contextlib-chdir-1.0.2.tar.gz", hash = "sha256:58406a71db00647fcccfc7e52e9e04e44d29eacf30400e7c0ba3b15f09d5f3fa"}, {file = "contextlib_chdir-1.0.2-py3-none-any.whl", hash = "sha256:f72f7abd0f87c18a57aee30acf97659ca315157e50bd07e084b8737e0719de3c"}, @@ -2096,7 +2096,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -2686,7 +2686,7 @@ description = "Like `typing._eval_type`, but lets older Python versions use newe optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"}, {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"}, @@ -2702,7 +2702,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -3248,12 +3248,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" @@ -3369,8 +3369,8 @@ proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" pydantic = "<3" scikit-learn = [ - {version = "<1.6.0", optional = true, markers = "python_version <= \"3.10\" and extra == \"evaluation\""}, {version = "*", optional = true, markers = "python_version > \"3.10\" and extra == \"evaluation\""}, + {version = "<1.6.0", optional = true, markers = "python_version <= \"3.10\" and extra == \"evaluation\""}, ] shapely = "<3.0.0dev" tqdm = {version = ">=4.23.0", optional = true, markers = "extra == \"evaluation\""} @@ -3515,8 +3515,8 @@ google-auth = ">=2.14.1,<3.0.0dev" google-cloud-core = ">=2.4.1,<3.0.0dev" google-resumable-media = ">=2.0.0,<3.0dev" grpcio = [ - {version = ">=1.47.0,<2.0dev", optional = true, markers = "extra == \"pandas\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"pandas\""}, + {version = ">=1.47.0,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"pandas\""}, ] packaging = ">=20.0.0" pandas = {version = ">=1.1.0", optional = true, markers = "extra == \"pandas\""} @@ -3840,8 +3840,8 @@ google-cloud-core = ">=2.0.0,<3.0.0dev" grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" opentelemetry-api = ">=1.9.0" proto-plus = [ - {version = ">=1.22.0,<2.0.0dev"}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev"}, ] protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" @@ -3959,8 +3959,8 @@ grpcio-status = ">=1.33.2" opentelemetry-api = {version = ">=1.27.0", markers = "python_version >= \"3.8\""} opentelemetry-sdk = {version = ">=1.27.0", markers = "python_version >= \"3.8\""} proto-plus = [ - {version = ">=1.22.0,<2.0.0dev"}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev"}, ] protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" @@ -4060,8 +4060,8 @@ google-cloud-core = ">=1.4.4,<3.0dev" grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" grpc-interceptor = ">=0.15.4" proto-plus = [ - {version = ">=1.22.0,<2.0.0dev"}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev"}, ] protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" sqlparse = ">=0.4.4" @@ -4764,7 +4764,7 @@ files = [ {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] -markers = {docs = "python_version < \"3.10\""} +markers = {docs = "python_version == \"3.9\""} [package.dependencies] zipp = ">=0.5" @@ -5949,7 +5949,7 @@ description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -6259,8 +6259,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" @@ -7920,7 +7920,7 @@ description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, @@ -7972,7 +7972,7 @@ description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version >= \"3.11\"" +markers = "python_version > \"3.10\"" files = [ {file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"}, {file = "scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36"}, @@ -8028,7 +8028,7 @@ description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, @@ -9005,7 +9005,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev", "docs"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -9201,7 +9201,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main", "dev", "docs"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -9629,4 +9629,4 @@ spark = ["dbt-spark"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<3.13" -content-hash = "668f20f1d8604035f763a08c2425eb14a7bc650bfdfdda1c51c2f354cdb6276b" +content-hash = "615803f37059680bb10a8e6e7d6ccf4178ab14ce0b2f576a0aef4f5f9f120c56" diff --git a/pyproject.toml b/pyproject.toml index 13292b3..4c59465 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,7 +97,7 @@ ruff = ">=0.0.254" types-freezegun = ">=1.1.6" types-PyYAML = ">=6.0.7" pytest-mock = "^3.14.0" -mock-gcp = {git = "https://github.com/millin/mock-gcp.git", rev = "0d972df9b6cce164b49f09ec4417a4eb77beb960"} +mock-gcp = ">=0.2.0" [tool.poetry.group.docs] optional = true From aee9c9c89eafa6e138f2aff5eded15073a53cc08 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 21:46:58 +0300 Subject: [PATCH 23/24] fix: replace the set of DbtConnectionParam with conditions by a single DbtConnectionConditionParam --- airflow_dbt_python/hooks/target.py | 201 ++++++++++++++++++++--------- 1 file changed, 143 insertions(+), 58 deletions(-) diff --git a/airflow_dbt_python/hooks/target.py b/airflow_dbt_python/hooks/target.py index 053d297..763fdf4 100644 --- a/airflow_dbt_python/hooks/target.py +++ b/airflow_dbt_python/hooks/target.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +import operator import re import warnings from abc import ABC, ABCMeta @@ -34,7 +35,6 @@ class DbtConnectionParam(NamedTuple): name: str store_override_name: Optional[str] = None default: Optional[Any] = None - depends_on: Callable[[Connection], bool] = lambda x: True @property def override_name(self): @@ -50,6 +50,88 @@ def override_name(self): return self.store_override_name +class ResolverCondition(NamedTuple): + """Condition for resolving connection parameters based on extra_dejson. + + Attributes: + condition_key: The key in `extra_dejson` to check. + comparison_operator: A function to compare the actual value + with the expected value. + expected: The expected value for the condition to be satisfied. + """ + + condition_key: str + comparison_operator: Callable[[Any, Any], bool] + expected: Any + + +class ResolverResult(NamedTuple): + """Result of resolving a connection parameter. + + Attributes: + override_name: The name to override the parameter with, if applicable. + default: The default value to use if no value is found. + """ + + override_name: Optional[str] + default: Optional[Any] + + +def make_extra_dejson_resolver( + *conditions: tuple[ResolverCondition, ResolverResult], + default: ResolverResult = ResolverResult(None, None), +) -> Callable[[Connection], ResolverResult]: + """Creates a resolver function for override names and defaults. + + Args: + *conditions: A sequence of conditions and their corresponding results. + default: The default result if no condition is met. + + Returns: + A function that takes a `Connection` object and returns + the appropriate `ResolverResult`. + """ + + def extra_dejson_resolver(conn: Connection) -> ResolverResult: + for ( + condition_key, + comparison_operator, + expected, + ), resolver_result in conditions: + if comparison_operator(conn.extra_dejson.get(condition_key), expected): + return resolver_result + return default + + return extra_dejson_resolver + + +class DbtConnectionConditionParam(NamedTuple): + """Connection parameter with dynamic override name and default value. + + Attributes: + name: The original name of the parameter. + resolver: A function that resolves the parameter + name and default value based on the connection's `extra_dejson`. + """ + + name: str + resolver: Callable[[Connection], ResolverResult] + + def resolve(self, connection: Connection) -> ResolverResult: + """Resolves the override name and default value for this parameter. + + Args: + connection: The Airflow connection object. + + Returns: + The resolved override name and default value. + """ + override_name, default = self.resolver(connection) + if override_name is None: + return ResolverResult(self.name, default) + return ResolverResult(override_name, default) + + class DbtConnectionHookMeta(ABCMeta): """A hook metaclass to collect all subclasses of DbtConnectionHook.""" @@ -78,7 +160,7 @@ class DbtConnectionHook(BaseHook, ABC, metaclass=DbtConnectionHookMeta): hook_name = "dbt Hook" airflow_conn_types: tuple[str, ...] = () - conn_params: list[Union[DbtConnectionParam, str]] = [ + conn_params: list[Union[DbtConnectionParam, DbtConnectionConditionParam, str]] = [ DbtConnectionParam("conn_type", "type"), "host", "schema", @@ -86,7 +168,9 @@ class DbtConnectionHook(BaseHook, ABC, metaclass=DbtConnectionHookMeta): "password", "port", ] - conn_extra_params: list[Union[DbtConnectionParam, str]] = [] + conn_extra_params: list[ + Union[DbtConnectionParam, DbtConnectionConditionParam, str] + ] = [] def __init__( self, @@ -139,10 +223,11 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: dbt_details = {"type": self.conn_type} for param in self.conn_params: if isinstance(param, DbtConnectionParam): - if not param.depends_on(conn): - continue key = param.override_name value = getattr(conn, param.name, param.default) + elif isinstance(param, DbtConnectionConditionParam): + key, default = param.resolve(conn) + value = getattr(conn, param.name, default) else: key = param value = getattr(conn, key, None) @@ -159,10 +244,11 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: for param in self.conn_extra_params: if isinstance(param, DbtConnectionParam): - if not param.depends_on(conn): - continue key = param.override_name value = extra.get(param.name, param.default) + elif isinstance(param, DbtConnectionConditionParam): + key, default = param.resolve(conn) + value = extra.get(param.name, default) else: key = param value = extra.get(key, None) @@ -220,7 +306,8 @@ def get_dbt_details_from_connection(self, conn: Connection) -> dict[str, Any]: conn = copy(conn) extra_dejson = conn.extra_dejson options = extra_dejson.pop("options") - # This is to pass options (e.g. `-c search_path=myschema`) to dbt in the required form + # This is to pass options (e.g. `-c search_path=myschema`) to dbt + # in the required form for k, v in re.findall(r"-c (\w+)=(.*)$", options): extra_dejson[k] = v conn.extra = json.dumps(extra_dejson) @@ -235,11 +322,14 @@ class DbtRedshiftHook(DbtPostgresHook): airflow_conn_types = (conn_type,) conn_extra_params = DbtPostgresHook.conn_extra_params + [ - "method", - DbtConnectionParam( + DbtConnectionConditionParam( "method", - default="iam", - depends_on=lambda x: x.extra_dejson.get("iam_profile") is not None, + resolver=make_extra_dejson_resolver( + ( + ResolverCondition("iam_profile", operator.is_not, None), + ResolverResult(None, "iam"), + ) + ), ), "cluster_id", "iam_profile", @@ -262,40 +352,33 @@ class DbtSnowflakeHook(DbtConnectionHook): conn_params = [ "host", "schema", - DbtConnectionParam( - "login", - "user", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") != "oauth", - ), - DbtConnectionParam( + DbtConnectionConditionParam( "login", - "oauth_client_id", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", - ), - DbtConnectionParam( - "password", - depends_on=lambda x: not any( + resolver=make_extra_dejson_resolver( ( - *( - k in x.extra_dejson - for k in ("private_key_file", "private_key_content") - ), - x.extra_dejson.get("authenticator", "") == "oauth", + ResolverCondition("authenticator", operator.eq, "oauth"), + ResolverResult("oauth_client_id", None), ), + default=ResolverResult("user", None), ), ), - DbtConnectionParam( + DbtConnectionConditionParam( "password", - "private_key_passphrase", - depends_on=lambda x: any( - k in x.extra_dejson for k in ("private_key_file", "private_key_content") + resolver=make_extra_dejson_resolver( + ( + ResolverCondition("authenticator", operator.eq, "oauth"), + ResolverResult("oauth_client_secret", None), + ), + ( + ResolverCondition("private_key_file", operator.is_not, None), + ResolverResult("private_key_passphrase", None), + ), + ( + ResolverCondition("private_key_content", operator.is_not, None), + ResolverResult("private_key_passphrase", None), + ), ), ), - DbtConnectionParam( - "password", - "oauth_client_secret", - depends_on=lambda x: x.extra_dejson.get("authenticator", "") == "oauth", - ), ] conn_extra_params = [ "warehouse", @@ -327,20 +410,22 @@ class DbtBigQueryHook(DbtConnectionHook): ] conn_extra_params = [ DbtConnectionParam("method", default="oauth"), - DbtConnectionParam( + DbtConnectionConditionParam( "method", - default="oauth-secrets", - depends_on=lambda x: x.extra_dejson.get("refresh_token") is not None, - ), - DbtConnectionParam( - "method", - default="service-account-json", - depends_on=lambda x: x.extra_dejson.get("keyfile_dict") is not None, - ), - DbtConnectionParam( - "method", - default="service-account", - depends_on=lambda x: x.extra_dejson.get("key_path") is not None, + resolver=make_extra_dejson_resolver( + ( + ResolverCondition("refresh_token", operator.is_not, None), + ResolverResult(None, "oauth-secrets"), + ), + ( + ResolverCondition("keyfile_dict", operator.is_not, None), + ResolverResult(None, "service-account-json"), + ), + ( + ResolverCondition("key_path", operator.is_not, None), + ResolverResult(None, "service-account"), + ), + ), ), DbtConnectionParam("key_path", "keyfile"), DbtConnectionParam("keyfile_dict", "keyfile_json"), @@ -366,14 +451,14 @@ class DbtSparkHook(DbtConnectionHook): "port", "schema", DbtConnectionParam("login", "user"), - DbtConnectionParam( - "password", - depends_on=lambda x: x.extra_dejson.get("method", "") == "thrift", - ), - DbtConnectionParam( + DbtConnectionConditionParam( "password", - "token", - depends_on=lambda x: x.extra_dejson.get("method", "") != "thrift", + resolver=make_extra_dejson_resolver( + ( + ResolverCondition("method", operator.ne, "thrift"), + ResolverResult("token", None), + ), + ), ), ] conn_extra_params = [] From e1360278795c1772383719c34d3bdb562ae076f2 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Tue, 1 Apr 2025 21:50:38 +0300 Subject: [PATCH 24/24] fix: remove unnecessary os.sep --- airflow_dbt_python/hooks/dbt.py | 5 ++--- tests/hooks/dbt/test_dbt_hook_base.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/airflow_dbt_python/hooks/dbt.py b/airflow_dbt_python/hooks/dbt.py index e70874d..69a1a85 100644 --- a/airflow_dbt_python/hooks/dbt.py +++ b/airflow_dbt_python/hooks/dbt.py @@ -4,7 +4,6 @@ import json import logging -import os import sys from abc import ABC from contextlib import contextmanager @@ -347,8 +346,8 @@ def prepare_directory( profiles_dir_path = None return ( - str(project_dir_path) + os.sep, - str(profiles_dir_path) + os.sep if profiles_dir_path is not None else None, + str(project_dir_path), + str(profiles_dir_path) if profiles_dir_path is not None else None, ) def setup_dbt_logging(self, debug: Optional[bool]): diff --git a/tests/hooks/dbt/test_dbt_hook_base.py b/tests/hooks/dbt/test_dbt_hook_base.py index 8d0a324..a3ad112 100644 --- a/tests/hooks/dbt/test_dbt_hook_base.py +++ b/tests/hooks/dbt/test_dbt_hook_base.py @@ -379,8 +379,8 @@ def test_dbt_base_dbt_directory_changed_to_s3( assert Path(tmp_dir).exists() assert Path(tmp_dir).is_dir() - assert config.project_dir == f"{tmp_dir}/" - assert config.profiles_dir == f"{tmp_dir}/" + assert config.project_dir == tmp_dir + assert config.profiles_dir == tmp_dir assert config.state == f"{tmp_dir}/target" assert Path(f"{tmp_dir}/profiles.yml").exists()