You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ur...@apache.org on 2025/03/26 05:53:05 UTC
(airflow) branch main updated: Move BaseNotifier to Task SDK (#48008)
This is an automated email from the ASF dual-hosted git repository.
uranusjr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 6b32358673a Move BaseNotifier to Task SDK (#48008)
6b32358673a is described below
commit 6b32358673af89f598009dfb3f280c957a5f2da4
Author: Tzu-ping Chung <ur...@gmail.com>
AuthorDate: Wed Mar 26 13:52:59 2025 +0800
Move BaseNotifier to Task SDK (#48008)
An entry is added to the compat provider for all providers to use.
---
airflow-core/docs/howto/notifications.rst | 4 +--
airflow-core/src/airflow/notifications/__init__.py | 16 -----------
.../tests/unit/models/test_taskinstance.py | 2 +-
.../tests/test_pytest_args_for_test_types.py | 1 -
generated/provider_dependencies.json | 31 +++++++++++++++++----
newsfragments/48008.significant.rst | 20 ++++++++++++++
providers/amazon/README.rst | 2 +-
providers/amazon/pyproject.toml | 2 +-
.../providers/amazon/aws/notifications/chime.py | 3 +-
.../providers/amazon/aws/notifications/sns.py | 2 +-
.../providers/amazon/aws/notifications/sqs.py | 2 +-
.../airflow/providers/amazon/get_provider_info.py | 2 +-
providers/apprise/README.rst | 32 ++++++++++++++++++----
providers/apprise/pyproject.toml | 2 ++
.../airflow/providers/apprise/get_provider_info.py | 6 +++-
.../providers/apprise/notifications/apprise.py | 2 +-
providers/atlassian/jira/README.rst | 32 ++++++++++++++++++----
providers/atlassian/jira/pyproject.toml | 2 ++
.../providers/atlassian/jira/get_provider_info.py | 6 +++-
.../providers/atlassian/jira/notifications/jira.py | 2 +-
providers/common/compat/README.rst | 6 ++--
providers/common/compat/provider.yaml | 2 +-
providers/common/compat/pyproject.toml | 6 ++--
.../airflow/providers/common/compat/__init__.py | 2 +-
.../providers/common/compat/get_provider_info.py | 2 +-
.../providers/common/compat/notifier}/__init__.py | 16 +++++++++++
providers/discord/README.rst | 24 ++++++++--------
providers/discord/pyproject.toml | 2 ++
.../airflow/providers/discord/get_provider_info.py | 6 +++-
.../providers/discord/notifications/discord.py | 2 +-
providers/opsgenie/README.rst | 32 ++++++++++++++++++----
providers/opsgenie/pyproject.toml | 2 ++
.../providers/opsgenie/get_provider_info.py | 6 +++-
.../providers/opsgenie/notifications/opsgenie.py | 2 +-
providers/pagerduty/README.rst | 32 ++++++++++++++++++----
providers/pagerduty/pyproject.toml | 2 ++
.../providers/pagerduty/get_provider_info.py | 6 +++-
.../providers/pagerduty/notifications/pagerduty.py | 2 +-
providers/slack/README.rst | 28 ++++++++++---------
providers/slack/pyproject.toml | 2 ++
.../airflow/providers/slack/get_provider_info.py | 1 +
.../airflow/providers/slack/notifications/slack.py | 2 +-
.../providers/slack/notifications/slack_webhook.py | 2 +-
providers/smtp/README.rst | 30 ++++++++++++++++----
providers/smtp/pyproject.toml | 2 ++
.../airflow/providers/smtp/get_provider_info.py | 2 +-
.../airflow/providers/smtp/notifications/smtp.py | 2 +-
scripts/in_container/verify_providers.py | 2 +-
task-sdk/src/airflow/sdk/__init__.py | 3 ++
.../src/airflow/sdk/definitions/notifier.py | 0
.../definitions/notifier}/test_notifier.txt | 0
.../tests/task_sdk/definitions/test_notifier.py | 28 +++++++++----------
52 files changed, 302 insertions(+), 125 deletions(-)
diff --git a/airflow-core/docs/howto/notifications.rst b/airflow-core/docs/howto/notifications.rst
index 993a36b3894..0f53b20027d 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/src/airflow/notifications/__init__.py b/airflow-core/src/airflow/notifications/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/src/airflow/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/airflow-core/tests/unit/models/test_taskinstance.py b/airflow-core/tests/unit/models/test_taskinstance.py
index 0b993caed19..19331c97d05 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.taskmap import TaskMap
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/dev/breeze/tests/test_pytest_args_for_test_types.py b/dev/breeze/tests/test_pytest_args_for_test_types.py
index 6c7f114e925..0fb3e1a0f72 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 fd2b3607e22..938474d4e09 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 00000000000..e154f597d7e
--- /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 2af061712a5..fb7a21632bb 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 37d96a38508..8a55971985c 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 75c2e4fb894..226b6fbb648 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 functools import cached_property
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 1ed61f3276b..c73d52e85cc 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 __future__ import annotations
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 e0188542c83..38e0663521f 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 __future__ import annotations
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 912107bc4fc..5e3fb340b07 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 e2a1d99d1a0..610a0a86f02 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-apprise/2.0.1/changelog.html>`_.
diff --git a/providers/apprise/pyproject.toml b/providers/apprise/pyproject.toml
index a637d5c4fef..ec832fc2b7e 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 612d3401300..bb74b4813fd 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 a1fe7e3c4be..e4774df5007 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 functools import cached_property
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 aa99398c2e6..f903d3d4711 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-atlassian-jira/3.0.1/changelog.html>`_.
diff --git a/providers/atlassian/jira/pyproject.toml b/providers/atlassian/jira/pyproject.toml
index f2b64ecbbbc..8eee00d91e2 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 e0b69fae223..9a2afece9f8 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 9e639fa20c1..151d225575e 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 __future__ import annotations
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 149a1fe275d..f801a5b1256 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/>`_.
+in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/>`_.
Installation
------------
@@ -77,4 +77,4 @@ Dependent package
============================================================================================================== ===============
The changelog for the provider package can be found in the
-`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/changelog.html>`_.
+`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/changelog.html>`_.
diff --git a/providers/common/compat/provider.yaml b/providers/common/compat/provider.yaml
index 6c31c6406c2..b5a8367de0c 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 3de69489d94..cbd60597169 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 ff1c95140f5..ebf33970e4e 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 @@ from airflow import __version__ as airflow_version
__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 744b6ce9235..dd35ceccaa2 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/tests/unit/notifications/__init__.py b/providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py
similarity index 65%
rename from airflow-core/tests/unit/notifications/__init__.py
rename to providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py
index 13a83393a91..91ce1cdb71d 100644
--- a/airflow-core/tests/unit/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 a3d40eb42cd..dbbdbbaaaea 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 <https://airflow.apache.org/docs/apache-airflow-providers-http>`_ ``http``
-================================================================================================ ========
+================================================================================================================== =================
+Dependent package Extra
+================================================================================================================== =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+`apache-airflow-providers-http <https://airflow.apache.org/docs/apache-airflow-providers-http>`_ ``http``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-discord/3.9.3/changelog.html>`_.
diff --git a/providers/discord/pyproject.toml b/providers/discord/pyproject.toml
index 16da0b05dad..b42b49e6b09 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 5fbee378318..4de47b35d3b 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 d6a3407db60..dbea1c504c1 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 __future__ import annotations
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 5ab10e0385b..779eaea76e3 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-opsgenie/5.8.2/changelog.html>`_.
diff --git a/providers/opsgenie/pyproject.toml b/providers/opsgenie/pyproject.toml
index 6dac35b633e..7290b4c896f 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 3610e9078c9..ac62c43bf9a 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 f87e2f9ae51..5e561c2a8bc 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 collections.abc import Sequence
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 743fdef69b9..b1cfa00dc1a 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-pagerduty/4.0.2/changelog.html>`_.
diff --git a/providers/pagerduty/pyproject.toml b/providers/pagerduty/pyproject.toml
index a27389e1773..031b9e6aad5 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 c422b4d58a8..8ba12e09415 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 21453596854..b976cfff5dd 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 __future__ import annotations
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 65d1ef0d9b2..c5be1cb6659 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-sql>`_ ``common.sql``
-============================================================================================================ ==============
+================================================================================================================== =================
+Dependent package Extra
+================================================================================================================== =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+`apache-airflow-providers-common-sql <https://airflow.apache.org/docs/apache-airflow-providers-common-sql>`_ ``common.sql``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-slack/9.0.2/changelog.html>`_.
diff --git a/providers/slack/pyproject.toml b/providers/slack/pyproject.toml
index af2c1fb17e4..b9797b20918 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 d9fb59f579f..6a55c327881 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 0678a759217..d9662328fd7 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 collections.abc import Sequence
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 a373695201a..36b7ccd851d 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 __future__ import annotations
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 2e92966bf2f..a9f311dd2fb 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 <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
+================================================================================================================== =================
The changelog for the provider package can be found in the
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-smtp/2.0.1/changelog.html>`_.
diff --git a/providers/smtp/pyproject.toml b/providers/smtp/pyproject.toml
index 2ce581f7026..a459952612e 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 aca8622998a..c3ca2317f17 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 85f71172d23..721c2e75d87 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 functools import cached_property
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 66222b0acfc..de2a297ae6f 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 edf4215aed0..f0b011bc18e 100644
--- a/task-sdk/src/airflow/sdk/__init__.py
+++ b/task-sdk/src/airflow/sdk/__init__.py
@@ -25,6 +25,7 @@ __all__ = [
"AssetAll",
"AssetAny",
"AssetWatcher",
+ "BaseNotifier",
"BaseOperator",
"BaseOperatorLink",
"Connection",
@@ -59,6 +60,7 @@ if TYPE_CHECKING:
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 @@ __lazy_imports: dict[str, str] = {
"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 554fe4b508e..cc8b5f9659b 100644
--- a/airflow-core/tests/unit/notifications/test_basenotifier.py
+++ b/task-sdk/tests/task_sdk/definitions/test_notifier.py
@@ -23,11 +23,9 @@ from unittest.mock import MagicMock
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 @@ class MockNotifier(BaseNotifier):
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 @@ class TestBaseNotifier:
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 @@ class TestBaseNotifier:
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()