diff --git a/providers/.pre-commit-config.yaml b/providers/.pre-commit-config.yaml index 4c624358aaeb2..0d667f831c922 100644 --- a/providers/.pre-commit-config.yaml +++ b/providers/.pre-commit-config.yaml @@ -280,3 +280,12 @@ repos: types: [python] files: ^.*/src/airflow/providers/.*\.py$ require_serial: true + - repo: https://github.com/boidolr/ast-grep-pre-commit + rev: 0.45.2 + hooks: + - id: ast-grep + name: Check providers import httpx2 rather than httpx + types: [python] + # Pinned to this directory's config rather than relying on ast-grep walking up + # from the working directory, so a future root sgconfig.yml cannot shadow it. + args: ["--config", "./sgconfig.yml"] diff --git a/providers/airbyte/src/airflow/providers/airbyte/hooks/airbyte.py b/providers/airbyte/src/airflow/providers/airbyte/hooks/airbyte.py index dd7cc04562695..6f4fbe3ae5514 100644 --- a/providers/airbyte/src/airflow/providers/airbyte/hooks/airbyte.py +++ b/providers/airbyte/src/airflow/providers/airbyte/hooks/airbyte.py @@ -20,6 +20,9 @@ import time from typing import Any, TypeVar +# Stays on httpx (not httpx2): the client built below is handed to airbyte-api, which builds +# and sends httpx.Request objects through it, and the two packages' classes are distinct. +# Migrate once airbyte-api moves to httpx2; tracked at https://github.com/apache/airflow/issues/70522 import httpx from airbyte_api import AirbyteAPI from airbyte_api.api import CancelJobRequest, GetJobRequest diff --git a/providers/anthropic/README.rst b/providers/anthropic/README.rst index aa2a8a925e3ad..c0634b860ec10 100644 --- a/providers/anthropic/README.rst +++ b/providers/anthropic/README.rst @@ -52,13 +52,13 @@ The package supports the following python versions: 3.10,3.11,3.12,3.13,3.14 Requirements ------------ -========================================== ==================== +========================================== ================== PIP package Version required -========================================== ==================== +========================================== ================== ``apache-airflow`` ``>=3.0.0`` ``apache-airflow-providers-common-compat`` ``>=1.12.0`` -``anthropic`` ``>=0.121.0,<1.0.0`` -========================================== ==================== +``anthropic`` ``>=1.0.0`` +========================================== ================== Optional dependencies ---------------------- @@ -66,9 +66,9 @@ Optional dependencies =========== =============================== Extra Dependencies =========== =============================== -``bedrock`` ``anthropic[bedrock]>=0.121.0`` -``vertex`` ``anthropic[vertex]>=0.121.0`` -``aws`` ``anthropic[aws]>=0.121.0`` +``bedrock`` ``anthropic[bedrock]>=1.0.0`` +``vertex`` ``anthropic[vertex]>=1.0.0`` +``aws`` ``anthropic[aws]>=1.0.0`` =========== =============================== The changelog for the provider package can be found in the diff --git a/providers/anthropic/docs/changelog.rst b/providers/anthropic/docs/changelog.rst index d2b48144d5217..4954086851404 100644 --- a/providers/anthropic/docs/changelog.rst +++ b/providers/anthropic/docs/changelog.rst @@ -20,6 +20,12 @@ Changelog --------- +.. note:: + The minimum required version of the ``anthropic`` SDK is now ``1.0.0``, which replaced + ``httpx`` with ``httpx2``. Deployments pinning an older SDK must upgrade it alongside this + provider, including the ``bedrock``, ``vertex`` and ``aws`` extras. The provider's own + hooks, operators, sensors and triggers are unchanged. + 0.3.0 ..... diff --git a/providers/anthropic/docs/index.rst b/providers/anthropic/docs/index.rst index fd9c4ef97f7c6..f8c1b8a2db2bb 100644 --- a/providers/anthropic/docs/index.rst +++ b/providers/anthropic/docs/index.rst @@ -133,13 +133,13 @@ Requirements The minimum Apache Airflow version supported by this provider distribution is ``3.0.0``. -========================================== ==================== +========================================== ================== PIP package Version required -========================================== ==================== +========================================== ================== ``apache-airflow`` ``>=3.0.0`` ``apache-airflow-providers-common-compat`` ``>=1.12.0`` -``anthropic`` ``>=0.121.0,<1.0.0`` -========================================== ==================== +``anthropic`` ``>=1.0.0`` +========================================== ================== Optional dependencies --------------------- @@ -152,13 +152,13 @@ Install them when installing from PyPI. For example: pip install apache-airflow-providers-anthropic[bedrock] -=========== ====================================== +=========== ============================= Extra Dependencies -=========== ====================================== -``bedrock`` ``anthropic[bedrock]>=0.121.0,<1.0.0`` -``vertex`` ``anthropic[vertex]>=0.121.0,<1.0.0`` -``aws`` ``anthropic[aws]>=0.121.0,<1.0.0`` -=========== ====================================== +=========== ============================= +``bedrock`` ``anthropic[bedrock]>=1.0.0`` +``vertex`` ``anthropic[vertex]>=1.0.0`` +``aws`` ``anthropic[aws]>=1.0.0`` +=========== ============================= Downloading official packages ----------------------------- diff --git a/providers/anthropic/pyproject.toml b/providers/anthropic/pyproject.toml index a967811f13ff8..cf28ffc710b01 100644 --- a/providers/anthropic/pyproject.toml +++ b/providers/anthropic/pyproject.toml @@ -61,24 +61,20 @@ requires-python = ">=3.10" dependencies = [ "apache-airflow>=3.0.0", "apache-airflow-providers-common-compat>=1.12.0", - # 0.121.0 is the first release whose ``sessions.create`` accepts ``budget``, which is - # how the guide tells users to set a session ceiling. Reading a ``budget_reached`` stop - # reason happens to work further back -- older clients mis-build the discriminated - # union into the wrong variant class while preserving ``.type`` -- but only with - # response validation left non-strict, so it is not something to depend on. - # anthropic 1.0.0 replaces httpx with httpx2 and is a major release the provider - # has not been validated against. Remove the <1.0.0 cap (here and in the extras - # below) after migrating to the 1.x SDK; - # tracked at https://github.com/apache/airflow/issues/72071 - "anthropic>=0.121.0,<1.0.0", + # 1.0.0 is the first release built on ``httpx2`` rather than ``httpx``; the two + # packages' ``Response``/``Request`` classes are distinct, so the SDK errors the tests + # construct must be built from the same package the client uses. This also subsumes the + # previous 0.121.0 floor, which existed because ``sessions.create`` gained ``budget`` + # there -- the way the guide tells users to set a session ceiling. + "anthropic>=1.0.0", ] # The optional dependencies should be modified in place in the generated file # Any change in the dependencies is preserved when the file is regenerated [project.optional-dependencies] -"bedrock" = ["anthropic[bedrock]>=0.121.0,<1.0.0"] -"vertex" = ["anthropic[vertex]>=0.121.0,<1.0.0"] -"aws" = ["anthropic[aws]>=0.121.0,<1.0.0"] +"bedrock" = ["anthropic[bedrock]>=1.0.0"] +"vertex" = ["anthropic[vertex]>=1.0.0"] +"aws" = ["anthropic[aws]>=1.0.0"] [dependency-groups] dev = [ diff --git a/providers/anthropic/tests/unit/anthropic/hooks/test_anthropic.py b/providers/anthropic/tests/unit/anthropic/hooks/test_anthropic.py index 816b238d401be..74b30dbfc3a49 100644 --- a/providers/anthropic/tests/unit/anthropic/hooks/test_anthropic.py +++ b/providers/anthropic/tests/unit/anthropic/hooks/test_anthropic.py @@ -45,7 +45,7 @@ pytest.importorskip("anthropic") -import httpx +import httpx2 from anthropic import BadRequestError from anthropic.types import BetaMonetaryAmount from anthropic.types.beta import BetaManagedAgentsServerToolUsage, BetaManagedAgentsSessionUsage @@ -283,8 +283,8 @@ def test_rejects_bad_amounts(self, amount, match): def _make_bad_request(message="cannot be archived while its status is running") -> BadRequestError: """A real SDK BadRequestError -- archive_session only interrupts on this, not on any error.""" - request = httpx.Request("POST", "https://api.anthropic.com/v1/sessions/sess_1/archive") - return BadRequestError(message, response=httpx.Response(400, request=request), body=None) + request = httpx2.Request("POST", "https://api.anthropic.com/v1/sessions/sess_1/archive") + return BadRequestError(message, response=httpx2.Response(400, request=request), body=None) class TestArchiveSession: diff --git a/providers/ast-grep-rules/no-httpx-import.yml b/providers/ast-grep-rules/no-httpx-import.yml new file mode 100644 index 0000000000000..a40a96131d1ad --- /dev/null +++ b/providers/ast-grep-rules/no-httpx-import.yml @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +--- +id: no-httpx-import +language: python +severity: error +message: Import 'httpx2' instead of 'httpx' -- see https://github.com/apache/airflow/issues/70522 +note: >- + The 'airbyte', 'common/ai', 'weaviate' and 'microsoft/azure' providers are exempt + because the third-party SDKs they hand these objects to are themselves built on + 'httpx', and 'httpx2' classes are distinct from their 'httpx' counterparts. +files: + - "**/*.py" +ignores: + - "airbyte/**" + - "common/ai/**" + - "weaviate/**" + - "microsoft/azure/**" +rule: + all: + - kind: dotted_name + - regex: ^httpx($|\.) + - any: + - inside: + kind: import_statement + stopBy: end + - inside: + kind: import_from_statement + field: module_name diff --git a/providers/google/README.rst b/providers/google/README.rst index 40545c6684f8f..288c25c0e5251 100644 --- a/providers/google/README.rst +++ b/providers/google/README.rst @@ -122,7 +122,7 @@ PIP package Version required ``google-cloud-run`` ``>=0.10.0`` ``google-cloud-batch`` ``>=0.13.0`` ``grpcio-gcp`` ``>=0.2.2`` -``httpx`` ``>=0.25.0`` +``httpx2`` ``>=2.0.0`` ``looker-sdk`` ``>=22.4.0,!=24.18.0`` ``pandas-gbq`` ``>=0.7.0`` ``pandas`` ``>=2.1.2; python_version < "3.13"`` diff --git a/providers/google/docs/changelog.rst b/providers/google/docs/changelog.rst index c1e4de295ebe1..fc11e72def114 100644 --- a/providers/google/docs/changelog.rst +++ b/providers/google/docs/changelog.rst @@ -27,6 +27,13 @@ Changelog --------- +.. note:: + This provider now depends on ``httpx2`` instead of ``httpx``, and ``httpx2`` verifies TLS + against the operating system trust store rather than the ``certifi`` bundle. If + ``CloudSqlProxyRunner`` downloads the ``cloud-sql-proxy`` binary through a proxy presenting + a private CA, install that CA into the OS trust store or point ``SSL_CERT_FILE`` (or + ``SSL_CERT_DIR``) at it -- adding it to ``certifi`` alone no longer has any effect. + 22.4.0 ...... diff --git a/providers/google/docs/index.rst b/providers/google/docs/index.rst index 38e66e3af2451..6cbb535bc89d7 100644 --- a/providers/google/docs/index.rst +++ b/providers/google/docs/index.rst @@ -175,7 +175,7 @@ PIP package Version required ``google-cloud-run`` ``>=0.10.0`` ``google-cloud-batch`` ``>=0.13.0`` ``grpcio-gcp`` ``>=0.2.2`` -``httpx`` ``>=0.25.0`` +``httpx2`` ``>=2.0.0`` ``looker-sdk`` ``>=22.4.0,!=24.18.0`` ``pandas-gbq`` ``>=0.7.0`` ``pandas`` ``>=2.1.2; python_version < "3.13"`` diff --git a/providers/google/pyproject.toml b/providers/google/pyproject.toml index a75a49acdc642..cd82bc138e965 100644 --- a/providers/google/pyproject.toml +++ b/providers/google/pyproject.toml @@ -132,7 +132,7 @@ dependencies = [ "google-cloud-run>=0.10.0", "google-cloud-batch>=0.13.0", "grpcio-gcp>=0.2.2", - "httpx>=0.25.0", + "httpx2>=2.0.0", # looker-sdk 24.18.0 has issues in import looker_sdk.rtl, No module named looker_sdk.rtl # See https://github.com/looker-open-source/sdk-codegen/issues/1518 "looker-sdk>=22.4.0,!=24.18.0", diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/cloud_sql.py b/providers/google/src/airflow/providers/google/cloud/hooks/cloud_sql.py index 57889e96c2b42..0f672570f33f1 100644 --- a/providers/google/src/airflow/providers/google/cloud/hooks/cloud_sql.py +++ b/providers/google/src/airflow/providers/google/cloud/hooks/cloud_sql.py @@ -34,14 +34,13 @@ import time import uuid from collections.abc import Sequence -from inspect import signature from pathlib import Path from subprocess import PIPE, Popen from tempfile import NamedTemporaryFile, _TemporaryFileWrapper, gettempdir from typing import TYPE_CHECKING, Any, cast from urllib.parse import quote_plus -import httpx +import httpx2 from aiohttp import ClientSession from gcloud.aio.auth import AioSession, Token from googleapiclient.discovery import Resource, build @@ -608,12 +607,7 @@ def _download_sql_proxy_if_needed(self) -> None: download_url = self._get_sql_proxy_download_url() proxy_path_tmp = self.sql_proxy_path + ".tmp" self.log.info("Downloading cloud_sql_proxy from %s to %s", download_url, proxy_path_tmp) - # httpx has a breaking API change (follow_redirects vs allow_redirects) - # and this should work with both versions (cf. issue #20088) - if "follow_redirects" in signature(httpx.get).parameters.keys(): - response = httpx.get(download_url, follow_redirects=True) - else: - response = httpx.get(download_url, allow_redirects=True) # type: ignore[call-arg] + response = httpx2.get(download_url, follow_redirects=True) # Downloading to .tmp file first to avoid case where partially downloaded # binary is used by parallel operator which uses the same fixed binary path with open(proxy_path_tmp, "wb") as file: diff --git a/providers/google/tests/unit/google/cloud/hooks/test_cloud_sql.py b/providers/google/tests/unit/google/cloud/hooks/test_cloud_sql.py index 518f509e522b5..955add003798a 100644 --- a/providers/google/tests/unit/google/cloud/hooks/test_cloud_sql.py +++ b/providers/google/tests/unit/google/cloud/hooks/test_cloud_sql.py @@ -1918,6 +1918,31 @@ def test_cloud_sql_proxy_runner_version_nok(self, version): with pytest.raises(ValueError, match="The sql_proxy_version should match the regular expression"): runner._get_sql_proxy_download_url() + @mock.patch("airflow.providers.google.cloud.hooks.cloud_sql.httpx2.get") + def test_download_sql_proxy_follows_redirects(self, mock_get, tmp_path): + """The download URL redirects, so the request must opt in to following them.""" + mock_get.return_value = mock.Mock(status_code=200, content=b"binary") + runner = CloudSqlProxyRunner( + path_prefix=str(tmp_path / "12345678"), + instance_specification="project:us-east-1:instance", + ) + + runner._download_sql_proxy_if_needed() + + mock_get.assert_called_once_with(runner._get_sql_proxy_download_url(), follow_redirects=True) + assert runner.sql_proxy_was_downloaded is True + + @mock.patch("airflow.providers.google.cloud.hooks.cloud_sql.httpx2.get") + def test_download_sql_proxy_raises_on_error_status(self, mock_get, tmp_path): + mock_get.return_value = mock.Mock(status_code=404, content=b"", reason_phrase="Not Found") + runner = CloudSqlProxyRunner( + path_prefix=str(tmp_path / "12345678"), + instance_specification="project:us-east-1:instance", + ) + + with pytest.raises(AirflowException, match="Status code = 404. Reason = Not Found"): + runner._download_sql_proxy_if_needed() + def test_cloud_sql_proxy_runner_adds_enable_iam_login_flag(self): runner = CloudSqlProxyRunner( path_prefix="12345678", diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py index 881a89fed07ee..6830f1ed6eed3 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py @@ -31,6 +31,9 @@ from typing import TYPE_CHECKING, Any, cast from urllib.parse import quote, urljoin, urlparse +# Stays on httpx (not httpx2): the client below is handed to kiota_http, which builds and +# consumes httpx objects, and the two packages' classes are distinct. +# Migrate once msgraph-core/kiota_http move to httpx2; tracked at https://github.com/apache/airflow/issues/70522 import httpx from azure.core.credentials_async import AsyncTokenCredential from azure.identity.aio import CertificateCredential, ClientSecretCredential diff --git a/providers/pagerduty/README.rst b/providers/pagerduty/README.rst index 0165433426b9e..ac7d5fe4d8a4d 100644 --- a/providers/pagerduty/README.rst +++ b/providers/pagerduty/README.rst @@ -56,7 +56,7 @@ PIP package Version required ``apache-airflow`` ``>=2.11.0`` ``apache-airflow-providers-common-compat`` ``>=1.10.1`` ``apache-airflow-providers-http`` -``pagerduty`` ``>=2.3.0`` +``pagerduty`` ``>=7.0.0`` ========================================== ================== The changelog for the provider package can be found in the diff --git a/providers/pagerduty/docs/changelog.rst b/providers/pagerduty/docs/changelog.rst index eb94a46825756..64070e03ebaf6 100644 --- a/providers/pagerduty/docs/changelog.rst +++ b/providers/pagerduty/docs/changelog.rst @@ -27,6 +27,11 @@ Changelog --------- +.. note:: + The minimum required version of the ``pagerduty`` SDK is now ``7.0.0``, which replaced + ``httpx`` with ``httpx2``. Deployments pinning an older SDK must upgrade it alongside this + provider. The provider's own hooks and notifier are unchanged. + 5.2.6 ..... diff --git a/providers/pagerduty/docs/index.rst b/providers/pagerduty/docs/index.rst index 0f6ea4906db77..e25dfb369e8b4 100644 --- a/providers/pagerduty/docs/index.rst +++ b/providers/pagerduty/docs/index.rst @@ -95,7 +95,7 @@ PIP package Version required ``apache-airflow`` ``>=2.11.0`` ``apache-airflow-providers-common-compat`` ``>=1.10.1`` ``apache-airflow-providers-http`` -``pagerduty`` ``>=2.3.0`` +``pagerduty`` ``>=7.0.0`` ========================================== ================== Downloading official packages diff --git a/providers/pagerduty/pyproject.toml b/providers/pagerduty/pyproject.toml index 47d4fcb33374a..c61f8e073df13 100644 --- a/providers/pagerduty/pyproject.toml +++ b/providers/pagerduty/pyproject.toml @@ -62,7 +62,7 @@ dependencies = [ "apache-airflow>=2.11.0", "apache-airflow-providers-common-compat>=1.10.1", "apache-airflow-providers-http", - "pagerduty>=2.3.0", + "pagerduty>=7.0.0", ] [dependency-groups] diff --git a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py index 6e86fb489d468..c139878d886ac 100644 --- a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py +++ b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py @@ -20,7 +20,7 @@ from unittest import mock from unittest.mock import patch -import httpx +import httpx2 import pagerduty import pytest from pagerduty import EventsApiV2Client @@ -91,10 +91,10 @@ def test_create_change_event(self, mock_request, events_connections): "message": "Change event processed", "status": "success", } - mock_response = httpx.Response( + mock_response = httpx2.Response( status_code=202, json=mock_response_body, - request=httpx.Request("POST", "https://events.pagerduty.com/v2/change/enqueue"), + request=httpx2.Request("POST", "https://events.pagerduty.com/v2/change/enqueue"), ) mock_response.ok = True @@ -114,10 +114,10 @@ def test_send_event_success(self, mock_request, events_connections): "message": "Event processed", "dedup_key": dedup_key, } - mock_response = httpx.Response( + mock_response = httpx2.Response( status_code=202, json=mock_response_body, - request=httpx.Request("POST", "https://events.pagerduty.com/v2/enqueue"), + request=httpx2.Request("POST", "https://events.pagerduty.com/v2/enqueue"), ) mock_response.ok = True mock_request.return_value = mock_response diff --git a/providers/sgconfig.yml b/providers/sgconfig.yml new file mode 100644 index 0000000000000..b40ffe978e4f9 --- /dev/null +++ b/providers/sgconfig.yml @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +--- +# NOTE: this file configures `ast-grep`, which is used for enforcing custom lint / auto-formatting +# across a number of different languages. Currently, we use this in pre-commit hook to avoid regressions of +# reintroducing `httpx` in provider packages which currently don't use `httpx`. +# +# If new ast-grep rules are required, they may be added in the rules directory listed below. +# +# See also: +# https://github.com/ast-grep/ast-grep +# https://ast-grep.github.io/guide/introduction +ruleDirs: + - ast-grep-rules diff --git a/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py b/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py index 10dce9bed0970..6757f61685408 100644 --- a/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py +++ b/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py @@ -69,6 +69,9 @@ def check_http_error_is_retryable(exc: BaseException): try: + # Stays on httpx (not httpx2): ``exc`` is raised inside weaviate-client, which is built + # on httpx, so an httpx2.ConnectError would never match and retries would silently stop. + # Migrate once weaviate-client moves to httpx2; tracked at https://github.com/apache/airflow/issues/70522 import httpx if isinstance(exc, httpx.ConnectError): diff --git a/uv.lock b/uv.lock index d5a35a4b581eb..ac6c959a47200 100644 --- a/uv.lock +++ b/uv.lock @@ -1097,21 +1097,20 @@ wheels = [ [[package]] name = "anthropic" -version = "0.125.0" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "distro" }, { name = "docstring-parser" }, - { name = "httpx" }, + { name = "httpx2" }, { name = "jiter" }, { name = "pydantic" }, { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/f8/6f0560884b5363848347bd640b6c1d04abc25e7aa61787a232f790c6b60a/anthropic-0.125.0.tar.gz", hash = "sha256:e0cdd336580cb7411c1cdab69f80973e9bf4bff7f8e08141811d46307d45c682", size = 1112593, upload-time = "2026-08-19T22:00:42.837Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/aa/4978e58035bd6c638c7b483450a68b7ef2d732ab78885e27bb9db0cff1a2/anthropic-1.0.0.tar.gz", hash = "sha256:42be3c97604af7252c5898413aee076ace6c46e9bca0d0d90ceb77c7d3719027", size = 1077769, upload-time = "2026-08-20T19:59:00.565Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/1a/b1bd30cda3790557e8791bec5922a6ec8fabb6fa8b008c76a39cf7be6152/anthropic-0.125.0-py3-none-any.whl", hash = "sha256:3486013602eca76d8b12540764e53654f02cf4951110bca86cf06e67428a9f21", size = 1184067, upload-time = "2026-08-19T22:00:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5b/db4a854aebf5d33a5ab714c46af6eb85ee44f390ed29b7b325c00b9f11ed/anthropic-1.0.0-py3-none-any.whl", hash = "sha256:32dd52e9e1d774393b27182f451398ba4262287a4d0eab30887f89f1481b3ae4", size = 1171725, upload-time = "2026-08-20T19:58:58.725Z" }, ] [package.optional-dependencies] @@ -3205,7 +3204,7 @@ docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable = "d [[package]] name = "apache-airflow-providers-amazon" -version = "9.35.0" +version = "9.35.1" source = { editable = "providers/amazon" } dependencies = [ { name = "apache-airflow" }, @@ -3442,10 +3441,10 @@ docs = [ [package.metadata] requires-dist = [ - { name = "anthropic", specifier = ">=0.121.0,<1.0.0" }, - { name = "anthropic", extras = ["aws"], marker = "extra == 'aws'", specifier = ">=0.121.0,<1.0.0" }, - { name = "anthropic", extras = ["bedrock"], marker = "extra == 'bedrock'", specifier = ">=0.121.0,<1.0.0" }, - { name = "anthropic", extras = ["vertex"], marker = "extra == 'vertex'", specifier = ">=0.121.0,<1.0.0" }, + { name = "anthropic", specifier = ">=1.0.0" }, + { name = "anthropic", extras = ["aws"], marker = "extra == 'aws'", specifier = ">=1.0.0" }, + { name = "anthropic", extras = ["bedrock"], marker = "extra == 'bedrock'", specifier = ">=1.0.0" }, + { name = "anthropic", extras = ["vertex"], marker = "extra == 'vertex'", specifier = ">=1.0.0" }, { name = "apache-airflow", editable = "." }, { name = "apache-airflow-providers-common-compat", editable = "providers/common/compat" }, ] @@ -5830,7 +5829,7 @@ dependencies = [ { name = "google-cloud-workflows" }, { name = "google-genai" }, { name = "grpcio-gcp" }, - { name = "httpx" }, + { name = "httpx2" }, { name = "immutabledict" }, { name = "looker-sdk" }, { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -6025,7 +6024,7 @@ requires-dist = [ { name = "google-cloud-workflows", specifier = ">=1.10.0" }, { name = "google-genai", specifier = ">=2.8.0" }, { name = "grpcio-gcp", specifier = ">=0.2.2" }, - { name = "httpx", specifier = ">=0.25.0" }, + { name = "httpx2", specifier = ">=2.0.0" }, { name = "immutabledict", specifier = ">=4.2.0" }, { name = "looker-sdk", specifier = ">=22.4.0,!=24.18.0" }, { name = "pandas", marker = "python_full_version < '3.13'", specifier = ">=2.1.2" }, @@ -6587,7 +6586,7 @@ docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable = "d [[package]] name = "apache-airflow-providers-microsoft-azure" -version = "15.0.0" +version = "15.0.1" source = { editable = "providers/microsoft/azure" } dependencies = [ { name = "adlfs" }, @@ -7360,7 +7359,7 @@ requires-dist = [ { name = "apache-airflow", editable = "." }, { name = "apache-airflow-providers-common-compat", editable = "providers/common/compat" }, { name = "apache-airflow-providers-http", editable = "providers/http" }, - { name = "pagerduty", specifier = ">=2.3.0" }, + { name = "pagerduty", specifier = ">=7.0.0" }, ] [package.metadata.requires-dev]