diff --git a/airflow-core/docs/howto/notifications.rst b/airflow-core/docs/howto/notifications.rst index 993a36b389423..0f53b20027db0 100644 --- a/airflow-core/docs/howto/notifications.rst +++ b/airflow-core/docs/howto/notifications.rst @@ -17,7 +17,7 @@ Creating a notifier =================== -The :class:`~airflow.notifications.basenotifier.BaseNotifier` is an abstract class that provides a basic +The :class:`~airflow.sdk.definitions.notifier.BaseNotifier` is an abstract class that provides a basic structure for sending notifications in Airflow using the various ``on_*__callback``. It is intended for providers to extend and customize for their specific needs. @@ -31,7 +31,7 @@ Here's an example of how you can create a Notifier class: .. code-block:: python - from airflow.notifications.basenotifier import BaseNotifier + from airflow.sdk import BaseNotifier from my_provider import send_message diff --git a/airflow-core/tests/unit/models/test_taskinstance.py b/airflow-core/tests/unit/models/test_taskinstance.py index 0b993caed19c6..19331c97d0548 100644 --- a/airflow-core/tests/unit/models/test_taskinstance.py +++ b/airflow-core/tests/unit/models/test_taskinstance.py @@ -73,13 +73,13 @@ from airflow.models.taskreschedule import TaskReschedule from airflow.models.variable import Variable from airflow.models.xcom import XComModel -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.standard.operators.bash import BashOperator from airflow.providers.standard.operators.empty import EmptyOperator from airflow.providers.standard.operators.python import PythonOperator from airflow.providers.standard.sensors.python import PythonSensor from airflow.sdk.api.datamodels._generated import AssetEventResponse, AssetResponse from airflow.sdk.definitions.asset import Asset, AssetAlias +from airflow.sdk.definitions.notifier import BaseNotifier from airflow.sdk.definitions.param import process_params from airflow.sdk.execution_time.comms import ( AssetEventsResult, diff --git a/airflow-core/tests/unit/notifications/__init__.py b/airflow-core/tests/unit/notifications/__init__.py deleted file mode 100644 index 13a83393a9124..0000000000000 --- a/airflow-core/tests/unit/notifications/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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. diff --git a/dev/breeze/tests/test_pytest_args_for_test_types.py b/dev/breeze/tests/test_pytest_args_for_test_types.py index 6c7f114e92573..0fb3e1a0f720e 100644 --- a/dev/breeze/tests/test_pytest_args_for_test_types.py +++ b/dev/breeze/tests/test_pytest_args_for_test_types.py @@ -164,7 +164,6 @@ def _find_all_integration_folders() -> list[str]: "airflow-core/tests/unit/lineage", "airflow-core/tests/unit/listeners", "airflow-core/tests/unit/macros", - "airflow-core/tests/unit/notifications", "airflow-core/tests/unit/plugins", "airflow-core/tests/unit/secrets", "airflow-core/tests/unit/security", diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json index fd2b3607e2289..938474d4e092c 100644 --- a/generated/provider_dependencies.json +++ b/generated/provider_dependencies.json @@ -26,7 +26,7 @@ "amazon": { "deps": [ "PyAthena>=3.0.10", - "apache-airflow-providers-common-compat>=1.3.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "apache-airflow-providers-http", "apache-airflow>=2.9.0", @@ -300,12 +300,15 @@ }, "apprise": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow>=2.9.0", "apprise>=1.8.0" ], "devel-deps": [], "plugins": [], - "cross-providers-deps": [], + "cross-providers-deps": [ + "common.compat" + ], "excluded-python-versions": [], "state": "ready" }, @@ -333,12 +336,15 @@ }, "atlassian.jira": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow>=2.9.0", "atlassian-python-api>3.41.10" ], "devel-deps": [], "plugins": [], - "cross-providers-deps": [], + "cross-providers-deps": [ + "common.compat" + ], "excluded-python-versions": [], "state": "ready" }, @@ -518,12 +524,14 @@ }, "discord": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-http", "apache-airflow>=2.9.0" ], "devel-deps": [], "plugins": [], "cross-providers-deps": [ + "common.compat", "http" ], "excluded-python-versions": [], @@ -1033,12 +1041,15 @@ }, "opsgenie": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow>=2.9.0", "opsgenie-sdk>=2.1.5" ], "devel-deps": [], "plugins": [], - "cross-providers-deps": [], + "cross-providers-deps": [ + "common.compat" + ], "excluded-python-versions": [], "state": "ready" }, @@ -1058,12 +1069,15 @@ }, "pagerduty": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow>=2.9.0", "pdpyras>=4.2.0" ], "devel-deps": [], "plugins": [], - "cross-providers-deps": [], + "cross-providers-deps": [ + "common.compat" + ], "excluded-python-versions": [], "state": "ready" }, @@ -1241,6 +1255,7 @@ }, "slack": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "apache-airflow>=2.9.0", "slack_sdk>=3.19.0" @@ -1248,6 +1263,7 @@ "devel-deps": [], "plugins": [], "cross-providers-deps": [ + "common.compat", "common.sql" ], "excluded-python-versions": [], @@ -1255,11 +1271,14 @@ }, "smtp": { "deps": [ + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow>=2.9.0" ], "devel-deps": [], "plugins": [], - "cross-providers-deps": [], + "cross-providers-deps": [ + "common.compat" + ], "excluded-python-versions": [], "state": "ready" }, diff --git a/newsfragments/48008.significant.rst b/newsfragments/48008.significant.rst new file mode 100644 index 0000000000000..e154f597d7eae --- /dev/null +++ b/newsfragments/48008.significant.rst @@ -0,0 +1,20 @@ +The BaseNotifier class has been moved to ``airflow.sdk``. + +* Types of change + + * [ ] Dag changes + * [ ] Config changes + * [ ] API changes + * [ ] CLI changes + * [ ] Behaviour changes + * [ ] Plugin changes + * [ ] Dependency changes + * [x] Code interface changes + +* Migration rules needed + + * ruff + + * AIR302 + + * [ ] ``airflow.notifications.basenotifier.BaseNotifier`` → ``airflow.sdk.BaseNotifier`` diff --git a/providers/amazon/README.rst b/providers/amazon/README.rst index 2af061712a5b5..fb7a21632bb4e 100644 --- a/providers/amazon/README.rst +++ b/providers/amazon/README.rst @@ -54,7 +54,7 @@ Requirements PIP package Version required ========================================== ====================== ``apache-airflow`` ``>=2.9.0`` -``apache-airflow-providers-common-compat`` ``>=1.3.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` ``apache-airflow-providers-common-sql`` ``>=1.20.0`` ``apache-airflow-providers-http`` ``boto3`` ``>=1.37.0`` diff --git a/providers/amazon/pyproject.toml b/providers/amazon/pyproject.toml index 02eb46f5efe58..a2b4416bd572f 100644 --- a/providers/amazon/pyproject.toml +++ b/providers/amazon/pyproject.toml @@ -58,7 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", - "apache-airflow-providers-common-compat>=1.3.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "apache-airflow-providers-http", # We should update minimum version of boto3 and here regularly to avoid `pip` backtracking with the number diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py index 75c2e4fb8947e..226b6fbb64899 100644 --- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py +++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py @@ -21,12 +21,11 @@ from typing import TYPE_CHECKING from airflow.providers.amazon.aws.hooks.chime import ChimeWebhookHook +from airflow.providers.common.compat.notifier import BaseNotifier if TYPE_CHECKING: from airflow.utils.context import Context -from airflow.notifications.basenotifier import BaseNotifier - class ChimeNotifier(BaseNotifier): """ diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py index 1ed61f3276b42..c73d52e85cc46 100644 --- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py +++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py @@ -20,8 +20,8 @@ from collections.abc import Sequence from functools import cached_property -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.amazon.aws.hooks.sns import SnsHook +from airflow.providers.common.compat.notifier import BaseNotifier class SnsNotifier(BaseNotifier): diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py index e0188542c83f4..38e0663521fff 100644 --- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py +++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py @@ -20,8 +20,8 @@ from collections.abc import Sequence from functools import cached_property -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.amazon.aws.hooks.sqs import SqsHook +from airflow.providers.common.compat.notifier import BaseNotifier class SqsNotifier(BaseNotifier): diff --git a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py index 912107bc4fc64..5e3fb340b0723 100644 --- a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py +++ b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py @@ -1372,7 +1372,7 @@ def get_provider_info(): "executors": ["airflow.providers.amazon.aws.executors.ecs.ecs_executor.AwsEcsExecutor"], "dependencies": [ "apache-airflow>=2.9.0", - "apache-airflow-providers-common-compat>=1.3.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "apache-airflow-providers-http", "boto3>=1.37.0", diff --git a/providers/apprise/README.rst b/providers/apprise/README.rst index e2a1d99d1a0a4..610a0a86f02ec 100644 --- a/providers/apprise/README.rst +++ b/providers/apprise/README.rst @@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.9.0`` -``apprise`` ``>=1.8.0`` -================== ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +``apprise`` ``>=1.8.0`` +========================================== ================== + +Cross provider package dependencies +----------------------------------- + +Those are dependencies that might be needed in order to use all the features of the package. +You need to install the specified providers in order to use them. + +You can install such cross-provider dependencies when installing from PyPI. For example: + +.. code-block:: bash + + pip install apache-airflow-providers-apprise[common.compat] + + +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/apprise/pyproject.toml b/providers/apprise/pyproject.toml index abfa0c47cca5d..1b3accc9b1d80 100644 --- a/providers/apprise/pyproject.toml +++ b/providers/apprise/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "apprise>=1.8.0", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py index 612d34013009d..bb74b4813fdfd 100644 --- a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py +++ b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py @@ -61,6 +61,10 @@ def get_provider_info(): } ], "notifications": ["airflow.providers.apprise.notifications.apprise.AppriseNotifier"], - "dependencies": ["apache-airflow>=2.9.0", "apprise>=1.8.0"], + "dependencies": [ + "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", + "apprise>=1.8.0", + ], "devel-dependencies": [], } diff --git a/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py b/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py index a1fe7e3c4be17..e4774df50077b 100644 --- a/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py +++ b/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py @@ -22,8 +22,8 @@ from apprise import AppriseConfig, NotifyFormat, NotifyType -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.apprise.hooks.apprise import AppriseHook +from airflow.providers.common.compat.notifier import BaseNotifier class AppriseNotifier(BaseNotifier): diff --git a/providers/atlassian/jira/README.rst b/providers/atlassian/jira/README.rst index aa99398c2e662..f903d3d47115a 100644 --- a/providers/atlassian/jira/README.rst +++ b/providers/atlassian/jira/README.rst @@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -======================== ================== -PIP package Version required -======================== ================== -``apache-airflow`` ``>=2.9.0`` -``atlassian-python-api`` ``>3.41.10`` -======================== ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +``atlassian-python-api`` ``>3.41.10`` +========================================== ================== + +Cross provider package dependencies +----------------------------------- + +Those are dependencies that might be needed in order to use all the features of the package. +You need to install the specified providers in order to use them. + +You can install such cross-provider dependencies when installing from PyPI. For example: + +.. code-block:: bash + + pip install apache-airflow-providers-atlassian-jira[common.compat] + + +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/atlassian/jira/pyproject.toml b/providers/atlassian/jira/pyproject.toml index 94f841676e657..33a0bcd6533c2 100644 --- a/providers/atlassian/jira/pyproject.toml +++ b/providers/atlassian/jira/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "atlassian-python-api>3.41.10", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py index e0b69fae2236a..9a2afece9f828 100644 --- a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py +++ b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py @@ -80,6 +80,10 @@ def get_provider_info(): } ], "notifications": ["airflow.providers.atlassian.jira.notifications.jira.JiraNotifier"], - "dependencies": ["apache-airflow>=2.9.0", "atlassian-python-api>3.41.10"], + "dependencies": [ + "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", + "atlassian-python-api>3.41.10", + ], "devel-dependencies": [], } diff --git a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py index 9e639fa20c1a5..151d225575e6f 100644 --- a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py +++ b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py @@ -20,8 +20,8 @@ from functools import cached_property from typing import Any -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.atlassian.jira.hooks.jira import JiraHook +from airflow.providers.common.compat.notifier import BaseNotifier class JiraNotifier(BaseNotifier): diff --git a/providers/common/compat/README.rst b/providers/common/compat/README.rst index 149a1fe275d20..f801a5b1256d9 100644 --- a/providers/common/compat/README.rst +++ b/providers/common/compat/README.rst @@ -23,7 +23,7 @@ Package ``apache-airflow-providers-common-compat`` -Release: ``1.6.0b1`` +Release: ``1.6.0`` ``Common Compatibility Provider - providing compatibility code for previous Airflow versions.`` @@ -36,7 +36,7 @@ This is a provider package for ``common.compat`` provider. All classes for this are in ``airflow.providers.common.compat`` python package. You can find package information and changelog for the provider -in the `documentation `_. +in the `documentation `_. Installation ------------ @@ -77,4 +77,4 @@ Dependent package ============================================================================================================== =============== The changelog for the provider package can be found in the -`changelog `_. +`changelog `_. diff --git a/providers/common/compat/provider.yaml b/providers/common/compat/provider.yaml index 6c31c6406c2d8..b5a8367de0c93 100644 --- a/providers/common/compat/provider.yaml +++ b/providers/common/compat/provider.yaml @@ -25,7 +25,7 @@ state: ready source-date-epoch: 1742480214 # note that those versions are maintained by release manager - do not update them manually versions: - - 1.6.0b1 + - 1.6.0 - 1.5.1 - 1.5.0 - 1.3.0 diff --git a/providers/common/compat/pyproject.toml b/providers/common/compat/pyproject.toml index a064154d28b28..063d273aae083 100644 --- a/providers/common/compat/pyproject.toml +++ b/providers/common/compat/pyproject.toml @@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi" [project] name = "apache-airflow-providers-common-compat" -version = "1.6.0b1" +version = "1.6.0" description = "Provider package apache-airflow-providers-common-compat for Apache Airflow" readme = "README.rst" authors = [ @@ -91,8 +91,8 @@ apache-airflow-providers-fab = {workspace = true} apache-airflow-providers-standard = {workspace = true} [project.urls] -"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1" -"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/changelog.html" +"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0" +"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/changelog.html" "Bug Tracker" = "https://github.com/apache/airflow/issues" "Source Code" = "https://github.com/apache/airflow" "Slack Chat" = "https://s.apache.org/airflow-slack" diff --git a/providers/common/compat/src/airflow/providers/common/compat/__init__.py b/providers/common/compat/src/airflow/providers/common/compat/__init__.py index ff1c95140f51b..ebf33970e4e73 100644 --- a/providers/common/compat/src/airflow/providers/common/compat/__init__.py +++ b/providers/common/compat/src/airflow/providers/common/compat/__init__.py @@ -29,7 +29,7 @@ __all__ = ["__version__"] -__version__ = "1.6.0b1" +__version__ = "1.6.0" if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse( "2.9.0" diff --git a/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py b/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py index 744b6ce9235b1..dd35ceccaa275 100644 --- a/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py +++ b/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py @@ -28,7 +28,7 @@ def get_provider_info(): "description": "``Common Compatibility Provider - providing compatibility code for previous Airflow versions.``\n", "state": "ready", "source-date-epoch": 1742480214, - "versions": ["1.6.0b1", "1.5.1", "1.5.0", "1.3.0", "1.2.2", "1.2.1", "1.2.0", "1.1.0", "1.0.0"], + "versions": ["1.6.0", "1.5.1", "1.5.0", "1.3.0", "1.2.2", "1.2.1", "1.2.0", "1.1.0", "1.0.0"], "integrations": [ { "integration-name": "Common Compat", diff --git a/airflow-core/src/airflow/notifications/__init__.py b/providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py similarity index 65% rename from airflow-core/src/airflow/notifications/__init__.py rename to providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py index 13a83393a9124..91ce1cdb71d96 100644 --- a/airflow-core/src/airflow/notifications/__init__.py +++ b/providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py @@ -14,3 +14,19 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from airflow.providers.common.compat.version_compat import AIRFLOW_V_3_0_PLUS + +if TYPE_CHECKING: + from airflow.sdk.definitions.notifier import BaseNotifier +elif AIRFLOW_V_3_0_PLUS: + from airflow.sdk.definitions.notifier import BaseNotifier +else: + from airflow.notifications.basenotifier import BaseNotifier + + +__all__ = ["BaseNotifier"] diff --git a/providers/discord/README.rst b/providers/discord/README.rst index a3d40eb42cd7d..dbbdbbaaaeac3 100644 --- a/providers/discord/README.rst +++ b/providers/discord/README.rst @@ -50,12 +50,13 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -================================= ================== -PIP package Version required -================================= ================== -``apache-airflow`` ``>=2.9.0`` +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` ``apache-airflow-providers-http`` -================================= ================== +========================================== ================== Cross provider package dependencies ----------------------------------- @@ -67,14 +68,15 @@ You can install such cross-provider dependencies when installing from PyPI. For .. code-block:: bash - pip install apache-airflow-providers-discord[http] + pip install apache-airflow-providers-discord[common.compat] -================================================================================================ ======== -Dependent package Extra -================================================================================================ ======== -`apache-airflow-providers-http `_ ``http`` -================================================================================================ ======== +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +`apache-airflow-providers-http `_ ``http`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/discord/pyproject.toml b/providers/discord/pyproject.toml index faf83e5368e16..a40235d2d5c1e 100644 --- a/providers/discord/pyproject.toml +++ b/providers/discord/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-http", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", "apache-airflow-providers-http", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/discord/src/airflow/providers/discord/get_provider_info.py b/providers/discord/src/airflow/providers/discord/get_provider_info.py index 5fbee378318c5..4de47b35d3b12 100644 --- a/providers/discord/src/airflow/providers/discord/get_provider_info.py +++ b/providers/discord/src/airflow/providers/discord/get_provider_info.py @@ -80,6 +80,10 @@ def get_provider_info(): } ], "notifications": ["airflow.providers.discord.notifications.discord.DiscordNotifier"], - "dependencies": ["apache-airflow>=2.9.0", "apache-airflow-providers-http"], + "dependencies": [ + "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", + "apache-airflow-providers-http", + ], "devel-dependencies": [], } diff --git a/providers/discord/src/airflow/providers/discord/notifications/discord.py b/providers/discord/src/airflow/providers/discord/notifications/discord.py index d6a3407db6029..dbea1c504c1ad 100644 --- a/providers/discord/src/airflow/providers/discord/notifications/discord.py +++ b/providers/discord/src/airflow/providers/discord/notifications/discord.py @@ -19,7 +19,7 @@ from functools import cached_property -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.discord.hooks.discord_webhook import DiscordWebhookHook ICON_URL: str = "https://raw.githubusercontent.com/apache/airflow/main/airflow/www/static/pin_100.png" diff --git a/providers/opsgenie/README.rst b/providers/opsgenie/README.rst index 5ab10e0385b45..779eaea76e355 100644 --- a/providers/opsgenie/README.rst +++ b/providers/opsgenie/README.rst @@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.9.0`` -``opsgenie-sdk`` ``>=2.1.5`` -================== ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +``opsgenie-sdk`` ``>=2.1.5`` +========================================== ================== + +Cross provider package dependencies +----------------------------------- + +Those are dependencies that might be needed in order to use all the features of the package. +You need to install the specified providers in order to use them. + +You can install such cross-provider dependencies when installing from PyPI. For example: + +.. code-block:: bash + + pip install apache-airflow-providers-opsgenie[common.compat] + + +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/opsgenie/pyproject.toml b/providers/opsgenie/pyproject.toml index 61fbee6400d0b..917e05aaadb65 100644 --- a/providers/opsgenie/pyproject.toml +++ b/providers/opsgenie/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "opsgenie-sdk>=2.1.5", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py index 3610e9078c96b..ac62c43bf9a52 100644 --- a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py +++ b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py @@ -79,6 +79,10 @@ def get_provider_info(): } ], "notifications": ["airflow.providers.opsgenie.notifications.opsgenie.OpsgenieNotifier"], - "dependencies": ["apache-airflow>=2.9.0", "opsgenie-sdk>=2.1.5"], + "dependencies": [ + "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", + "opsgenie-sdk>=2.1.5", + ], "devel-dependencies": [], } diff --git a/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py b/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py index f87e2f9ae51b7..5e561c2a8bcdd 100644 --- a/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py +++ b/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py @@ -21,7 +21,7 @@ from functools import cached_property from typing import TYPE_CHECKING -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.opsgenie.hooks.opsgenie import OpsgenieAlertHook if TYPE_CHECKING: diff --git a/providers/pagerduty/README.rst b/providers/pagerduty/README.rst index 743fdef69b9bf..b1cfa00dc1a63 100644 --- a/providers/pagerduty/README.rst +++ b/providers/pagerduty/README.rst @@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.9.0`` -``pdpyras`` ``>=4.2.0`` -================== ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +``pdpyras`` ``>=4.2.0`` +========================================== ================== + +Cross provider package dependencies +----------------------------------- + +Those are dependencies that might be needed in order to use all the features of the package. +You need to install the specified providers in order to use them. + +You can install such cross-provider dependencies when installing from PyPI. For example: + +.. code-block:: bash + + pip install apache-airflow-providers-pagerduty[common.compat] + + +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/pagerduty/pyproject.toml b/providers/pagerduty/pyproject.toml index 5cb5a422afee6..0eed4f1ea92b0 100644 --- a/providers/pagerduty/pyproject.toml +++ b/providers/pagerduty/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "pdpyras>=4.2.0", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py index c422b4d58a8f1..8ba12e0941513 100644 --- a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py +++ b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py @@ -85,6 +85,10 @@ def get_provider_info(): } ], "notifications": ["airflow.providers.pagerduty.notifications.pagerduty.PagerdutyNotifier"], - "dependencies": ["apache-airflow>=2.9.0", "pdpyras>=4.2.0"], + "dependencies": [ + "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", + "pdpyras>=4.2.0", + ], "devel-dependencies": [], } diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py b/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py index 21453596854f8..b976cfff5dd34 100644 --- a/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py +++ b/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py @@ -20,7 +20,7 @@ from functools import cached_property from typing import Any -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.pagerduty.hooks.pagerduty_events import PagerdutyEventsHook diff --git a/providers/slack/README.rst b/providers/slack/README.rst index 65d1ef0d9b2aa..c5be1cb665911 100644 --- a/providers/slack/README.rst +++ b/providers/slack/README.rst @@ -53,13 +53,14 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -======================================= ================== -PIP package Version required -======================================= ================== -``apache-airflow`` ``>=2.9.0`` -``apache-airflow-providers-common-sql`` ``>=1.20.0`` -``slack_sdk`` ``>=3.19.0`` -======================================= ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +``apache-airflow-providers-common-sql`` ``>=1.20.0`` +``slack_sdk`` ``>=3.19.0`` +========================================== ================== Cross provider package dependencies ----------------------------------- @@ -71,14 +72,15 @@ You can install such cross-provider dependencies when installing from PyPI. For .. code-block:: bash - pip install apache-airflow-providers-slack[common.sql] + pip install apache-airflow-providers-slack[common.compat] -============================================================================================================ ============== -Dependent package Extra -============================================================================================================ ============== -`apache-airflow-providers-common-sql `_ ``common.sql`` -============================================================================================================ ============== +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +`apache-airflow-providers-common-sql `_ ``common.sql`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/slack/pyproject.toml b/providers/slack/pyproject.toml index b70e57d63e078..c1c586ee91629 100644 --- a/providers/slack/pyproject.toml +++ b/providers/slack/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "slack_sdk>=3.19.0", ] @@ -67,6 +68,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", "apache-airflow-providers-common-sql", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/slack/src/airflow/providers/slack/get_provider_info.py b/providers/slack/src/airflow/providers/slack/get_provider_info.py index d9fb59f579fa5..6a55c3278815e 100644 --- a/providers/slack/src/airflow/providers/slack/get_provider_info.py +++ b/providers/slack/src/airflow/providers/slack/get_provider_info.py @@ -135,6 +135,7 @@ def get_provider_info(): ], "dependencies": [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", "apache-airflow-providers-common-sql>=1.20.0", "slack_sdk>=3.19.0", ], diff --git a/providers/slack/src/airflow/providers/slack/notifications/slack.py b/providers/slack/src/airflow/providers/slack/notifications/slack.py index 0678a75921736..d9662328fd7ab 100644 --- a/providers/slack/src/airflow/providers/slack/notifications/slack.py +++ b/providers/slack/src/airflow/providers/slack/notifications/slack.py @@ -22,7 +22,7 @@ from functools import cached_property from typing import TYPE_CHECKING -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.slack.hooks.slack import SlackHook if TYPE_CHECKING: diff --git a/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py b/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py index a373695201a64..36b7ccd851ddf 100644 --- a/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py +++ b/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py @@ -20,7 +20,7 @@ from functools import cached_property from typing import TYPE_CHECKING -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.slack.hooks.slack_webhook import SlackWebhookHook if TYPE_CHECKING: diff --git a/providers/smtp/README.rst b/providers/smtp/README.rst index 2e92966bf2fa0..a9f311dd2fb3f 100644 --- a/providers/smtp/README.rst +++ b/providers/smtp/README.rst @@ -50,11 +50,31 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12 Requirements ------------ -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.9.0`` -================== ================== +========================================== ================== +PIP package Version required +========================================== ================== +``apache-airflow`` ``>=2.9.0`` +``apache-airflow-providers-common-compat`` ``>=1.6.0`` +========================================== ================== + +Cross provider package dependencies +----------------------------------- + +Those are dependencies that might be needed in order to use all the features of the package. +You need to install the specified providers in order to use them. + +You can install such cross-provider dependencies when installing from PyPI. For example: + +.. code-block:: bash + + pip install apache-airflow-providers-smtp[common.compat] + + +================================================================================================================== ================= +Dependent package Extra +================================================================================================================== ================= +`apache-airflow-providers-common-compat `_ ``common.compat`` +================================================================================================================== ================= The changelog for the provider package can be found in the `changelog `_. diff --git a/providers/smtp/pyproject.toml b/providers/smtp/pyproject.toml index 14f6aa7eb37e6..f7a481e167269 100644 --- a/providers/smtp/pyproject.toml +++ b/providers/smtp/pyproject.toml @@ -58,6 +58,7 @@ requires-python = "~=3.9" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.9.0", + "apache-airflow-providers-common-compat>=1.6.0", ] [dependency-groups] @@ -65,6 +66,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py index aca8622998a8f..c3ca2317f1734 100644 --- a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py +++ b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py @@ -73,6 +73,6 @@ def get_provider_info(): {"hook-class-name": "airflow.providers.smtp.hooks.smtp.SmtpHook", "connection-type": "smtp"} ], "notifications": ["airflow.providers.smtp.notifications.smtp.SmtpNotifier"], - "dependencies": ["apache-airflow>=2.9.0"], + "dependencies": ["apache-airflow>=2.9.0", "apache-airflow-providers-common-compat>=1.6.0"], "devel-dependencies": [], } diff --git a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py index 85f71172d2334..721c2e75d87ed 100644 --- a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py +++ b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py @@ -22,7 +22,7 @@ from pathlib import Path from typing import Any -from airflow.notifications.basenotifier import BaseNotifier +from airflow.providers.common.compat.notifier import BaseNotifier from airflow.providers.smtp.hooks.smtp import SmtpHook diff --git a/scripts/in_container/verify_providers.py b/scripts/in_container/verify_providers.py index 66222b0acfce0..de2a297ae6fbd 100755 --- a/scripts/in_container/verify_providers.py +++ b/scripts/in_container/verify_providers.py @@ -471,7 +471,7 @@ def get_package_class_summary( # Remove this conditional check after providers are 2.6+ compatible try: - from airflow.notifications.basenotifier import BaseNotifier + from airflow.providers.common.compat.notifier import BaseNotifier has_notifier = True except ImportError: diff --git a/task-sdk/src/airflow/sdk/__init__.py b/task-sdk/src/airflow/sdk/__init__.py index edf4215aed061..f0b011bc18e03 100644 --- a/task-sdk/src/airflow/sdk/__init__.py +++ b/task-sdk/src/airflow/sdk/__init__.py @@ -25,6 +25,7 @@ "AssetAll", "AssetAny", "AssetWatcher", + "BaseNotifier", "BaseOperator", "BaseOperatorLink", "Connection", @@ -59,6 +60,7 @@ from airflow.sdk.definitions.context import Context, get_current_context, get_parsing_context from airflow.sdk.definitions.dag import DAG, dag from airflow.sdk.definitions.edges import EdgeModifier, Label + from airflow.sdk.definitions.notifier import BaseNotifier from airflow.sdk.definitions.param import Param from airflow.sdk.definitions.taskgroup import TaskGroup from airflow.sdk.definitions.template import literal @@ -71,6 +73,7 @@ "AssetAll": ".definitions.asset", "AssetAny": ".definitions.asset", "AssetWatcher": ".definitions.asset", + "BaseNotifier": ".definitions.notifier", "BaseOperator": ".definitions.baseoperator", "BaseOperatorLink": ".definitions.baseoperatorlink", "Connection": ".definitions.connection", diff --git a/airflow-core/src/airflow/notifications/basenotifier.py b/task-sdk/src/airflow/sdk/definitions/notifier.py similarity index 100% rename from airflow-core/src/airflow/notifications/basenotifier.py rename to task-sdk/src/airflow/sdk/definitions/notifier.py diff --git a/airflow-core/tests/unit/notifications/test_notifier.txt b/task-sdk/tests/task_sdk/definitions/notifier/test_notifier.txt similarity index 100% rename from airflow-core/tests/unit/notifications/test_notifier.txt rename to task-sdk/tests/task_sdk/definitions/notifier/test_notifier.txt diff --git a/airflow-core/tests/unit/notifications/test_basenotifier.py b/task-sdk/tests/task_sdk/definitions/test_notifier.py similarity index 78% rename from airflow-core/tests/unit/notifications/test_basenotifier.py rename to task-sdk/tests/task_sdk/definitions/test_notifier.py index 554fe4b508e79..cc8b5f9659b19 100644 --- a/airflow-core/tests/unit/notifications/test_basenotifier.py +++ b/task-sdk/tests/task_sdk/definitions/test_notifier.py @@ -23,11 +23,9 @@ import jinja2 import pytest -from airflow.notifications.basenotifier import BaseNotifier from airflow.providers.standard.operators.empty import EmptyOperator - -pytestmark = pytest.mark.db_test - +from airflow.sdk.definitions.dag import DAG +from airflow.sdk.definitions.notifier import BaseNotifier if TYPE_CHECKING: from airflow.sdk.definitions.context import Context @@ -48,8 +46,8 @@ def notify(self, context: Context) -> None: class TestBaseNotifier: - def test_render_message_with_message(self, dag_maker): - with dag_maker("test_render_message_with_message") as dag: + def test_render_message_with_message(self): + with DAG("test_render_message_with_message") as dag: EmptyOperator(task_id="test_id") notifier = MockNotifier(message="Hello {{ dag.dag_id }}") @@ -57,24 +55,24 @@ def test_render_message_with_message(self, dag_maker): notifier.render_template_fields(context) assert notifier.message == "Hello test_render_message_with_message" - def test_render_message_with_template(self, dag_maker, caplog): - with dag_maker("test_render_message_with_template") as dag: + def test_render_message_with_template(self, caplog): + with DAG("test_render_message_with_template") as dag: EmptyOperator(task_id="test_id") notifier = MockNotifier(message="test.txt") context: Context = {"dag": dag} with pytest.raises(jinja2.exceptions.TemplateNotFound): notifier.render_template_fields(context) - def test_render_message_with_template_works(self, dag_maker, caplog): - with dag_maker("test_render_message_with_template_works") as dag: + def test_render_message_with_template_works(self, caplog): + with DAG("test_render_message_with_template_works") as dag: EmptyOperator(task_id="test_id") - notifier = MockNotifier(message="test_notifier.txt") + notifier = MockNotifier(message="notifier/test_notifier.txt") context: Context = {"dag": dag} notifier.render_template_fields(context) assert notifier.message == "Hello test_render_message_with_template_works" - def test_notifier_call_with_passed_context(self, dag_maker, caplog): - with dag_maker("test_render_message_with_template_works") as dag: + def test_notifier_call_with_passed_context(self, caplog): + with DAG("test_render_message_with_template_works") as dag: EmptyOperator(task_id="test_id") notifier = MockNotifier(message="Hello {{ dag.dag_id }}") notifier.notify = MagicMock() @@ -83,8 +81,8 @@ def test_notifier_call_with_passed_context(self, dag_maker, caplog): notifier.notify.assert_called_once_with({"dag": dag, "message": "Hello {{ dag.dag_id }}"}) assert notifier.message == "Hello test_render_message_with_template_works" - def test_notifier_call_with_prepared_context(self, dag_maker, caplog): - with dag_maker("test_render_message_with_template_works"): + def test_notifier_call_with_prepared_context(self, caplog): + with DAG("test_render_message_with_template_works"): EmptyOperator(task_id="test_id") notifier = MockNotifier(message="task: {{ task_list[0] }}") notifier.notify = MagicMock()