This is an automated email from the ASF dual-hosted git repository.
eladkal 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 2bccb39c84e chore: Some nits in asset normalization (#66710)
2bccb39c84e is described below
commit 2bccb39c84eb63a05e4caf69ba2ff44d30320645
Author: Kacper Muda <[email protected]>
AuthorDate: Mon May 11 17:16:33 2026 +0200
chore: Some nits in asset normalization (#66710)
---
.../src/airflow/providers/apache/hdfs/assets/hdfs.py | 3 +--
.../hdfs/tests/unit/apache/hdfs/assets/test_hdfs.py | 4 ++--
providers/ftp/src/airflow/providers/ftp/assets/ftp.py | 3 +--
providers/ftp/tests/unit/ftp/assets/test_ftp.py | 4 ++--
providers/microsoft/mssql/docs/index.rst | 19 ++++++++++---------
providers/microsoft/mssql/pyproject.toml | 4 +---
providers/mysql/provider.yaml | 4 ++--
.../src/airflow/providers/mysql/get_provider_info.py | 4 ++--
.../sftp/src/airflow/providers/sftp/assets/sftp.py | 3 +--
providers/sftp/tests/unit/sftp/assets/test_sftp.py | 4 ++--
uv.lock | 14 +++++++-------
11 files changed, 31 insertions(+), 35 deletions(-)
diff --git
a/providers/apache/hdfs/src/airflow/providers/apache/hdfs/assets/hdfs.py
b/providers/apache/hdfs/src/airflow/providers/apache/hdfs/assets/hdfs.py
index 5f3b716f880..b21cd08852f 100644
--- a/providers/apache/hdfs/src/airflow/providers/apache/hdfs/assets/hdfs.py
+++ b/providers/apache/hdfs/src/airflow/providers/apache/hdfs/assets/hdfs.py
@@ -46,5 +46,4 @@ def convert_asset_to_openlineage(asset: Asset,
lineage_context) -> OpenLineageDa
from airflow.providers.common.compat.openlineage.facet import Dataset as
OpenLineageDataset
parsed = urlsplit(asset.uri)
- path = parsed.path[1:] if parsed.path.startswith("/") else parsed.path
- return OpenLineageDataset(namespace=f"hdfs://{parsed.netloc}", name=path
or "/")
+ return OpenLineageDataset(namespace=f"hdfs://{parsed.netloc}",
name=parsed.path.lstrip("/") or "/")
diff --git a/providers/apache/hdfs/tests/unit/apache/hdfs/assets/test_hdfs.py
b/providers/apache/hdfs/tests/unit/apache/hdfs/assets/test_hdfs.py
index 1c7973b38ce..a55e60fa07c 100644
--- a/providers/apache/hdfs/tests/unit/apache/hdfs/assets/test_hdfs.py
+++ b/providers/apache/hdfs/tests/unit/apache/hdfs/assets/test_hdfs.py
@@ -80,9 +80,9 @@ def test_create_asset(path: str, expected_uri: str) -> None:
[
pytest.param("/", "hdfs://namenode:8020", id="no-path"),
pytest.param("/", "hdfs://namenode:8020/", id="path-slash-only"),
- pytest.param("/data/file.csv", "hdfs://namenode:8020//data/file.csv",
id="root"),
+ pytest.param("data/file.csv", "hdfs://namenode:8020//data/file.csv",
id="root"),
pytest.param("data/file.csv", "hdfs://namenode:8020/data/file.csv",
id="no-leading-slash"),
- pytest.param("//data/file.csv",
"hdfs://namenode:8020///data/file.csv", id="two-slashes"),
+ pytest.param("data/file.csv", "hdfs://namenode:8020///data/file.csv",
id="two-slashes"),
],
)
def test_convert_asset_to_openlineage(expected_name, uri) -> None:
diff --git a/providers/ftp/src/airflow/providers/ftp/assets/ftp.py
b/providers/ftp/src/airflow/providers/ftp/assets/ftp.py
index 9c6f97e5125..fe41fb720b4 100644
--- a/providers/ftp/src/airflow/providers/ftp/assets/ftp.py
+++ b/providers/ftp/src/airflow/providers/ftp/assets/ftp.py
@@ -49,5 +49,4 @@ def convert_asset_to_openlineage(asset: Asset,
lineage_context) -> OpenLineageDa
from airflow.providers.common.compat.openlineage.facet import Dataset as
OpenLineageDataset
parsed = urlsplit(asset.uri)
- path = parsed.path[1:] if parsed.path.startswith("/") else parsed.path
- return OpenLineageDataset(namespace=f"file://{parsed.netloc}", name=path
or "/")
+ return OpenLineageDataset(namespace=f"file://{parsed.netloc}",
name=parsed.path.lstrip("/") or "/")
diff --git a/providers/ftp/tests/unit/ftp/assets/test_ftp.py
b/providers/ftp/tests/unit/ftp/assets/test_ftp.py
index a85b3dc24fa..7070d48912b 100644
--- a/providers/ftp/tests/unit/ftp/assets/test_ftp.py
+++ b/providers/ftp/tests/unit/ftp/assets/test_ftp.py
@@ -76,9 +76,9 @@ def test_create_asset(path: str, expected_uri: str) -> None:
[
pytest.param("/", "ftp://example.com:21", id="no-path"),
pytest.param("/", "ftp://example.com:21/", id="path-slash-only"),
- pytest.param("/data/file.csv", "ftp://example.com:21//data/file.csv",
id="root"),
+ pytest.param("data/file.csv", "ftp://example.com:21//data/file.csv",
id="root"),
pytest.param("data/file.csv", "ftp://example.com:21/data/file.csv",
id="no-leading-slash"),
- pytest.param("//data/file.csv",
"ftp://example.com:21///data/file.csv", id="two-slashes"),
+ pytest.param("data/file.csv", "ftp://example.com:21///data/file.csv",
id="two-slashes"),
],
)
def test_convert_asset_to_openlineage(expected_name, uri) -> None:
diff --git a/providers/microsoft/mssql/docs/index.rst
b/providers/microsoft/mssql/docs/index.rst
index 3d94b96505f..1e04ec497f4 100644
--- a/providers/microsoft/mssql/docs/index.rst
+++ b/providers/microsoft/mssql/docs/index.rst
@@ -98,15 +98,16 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-======================================= ======================================
-PIP package Version required
-======================================= ======================================
-``apache-airflow`` ``>=2.11.0``
-``apache-airflow-providers-common-sql`` ``>=1.32.0``
-``pymssql`` ``>=2.3.5; python_version < "3.14"``
-``pymssql`` ``>=2.3.13; python_version >= "3.14"``
-``methodtools`` ``>=0.4.7``
-======================================= ======================================
+==========================================
======================================
+PIP package Version required
+==========================================
======================================
+``apache-airflow`` ``>=2.11.0``
+``apache-airflow-providers-common-sql`` ``>=1.32.0``
+``apache-airflow-providers-common-compat`` ``>=1.12.0``
+``pymssql`` ``>=2.3.5; python_version <
"3.14"``
+``pymssql`` ``>=2.3.13; python_version >=
"3.14"``
+``methodtools`` ``>=0.4.7``
+==========================================
======================================
Cross provider package dependencies
-----------------------------------
diff --git a/providers/microsoft/mssql/pyproject.toml
b/providers/microsoft/mssql/pyproject.toml
index ba08bbb1186..8f8d6afd938 100644
--- a/providers/microsoft/mssql/pyproject.toml
+++ b/providers/microsoft/mssql/pyproject.toml
@@ -61,6 +61,7 @@ requires-python = ">=3.10"
dependencies = [
"apache-airflow>=2.11.0",
"apache-airflow-providers-common-sql>=1.32.0",
+ "apache-airflow-providers-common-compat>=1.12.0",
"pymssql>=2.3.5; python_version < '3.14'",
"pymssql>=2.3.13; python_version >= '3.14'",
"methodtools>=0.4.7",
@@ -72,9 +73,6 @@ dependencies = [
"openlineage" = [
"apache-airflow-providers-openlineage"
]
-"common.compat" = [
- "apache-airflow-providers-common-compat"
-]
[dependency-groups]
dev = [
diff --git a/providers/mysql/provider.yaml b/providers/mysql/provider.yaml
index 7ca0d3e793b..4bace9dffa8 100644
--- a/providers/mysql/provider.yaml
+++ b/providers/mysql/provider.yaml
@@ -124,7 +124,7 @@ connection-types:
connection-type: mysql
asset-uris:
- - schemes: [mysql]
+ - schemes: [mysql, mariadb]
handler: airflow.providers.mysql.assets.mysql.sanitize_uri
factory: airflow.providers.mysql.assets.mysql.create_asset
to_openlineage_converter:
airflow.providers.mysql.assets.mysql.convert_asset_to_openlineage
@@ -132,7 +132,7 @@ asset-uris:
# dataset has been renamed to asset in Airflow 3.0
# This is kept for backward compatibility.
dataset-uris:
- - schemes: [mysql]
+ - schemes: [mysql, mariadb]
handler: airflow.providers.mysql.assets.mysql.sanitize_uri
factory: airflow.providers.mysql.assets.mysql.create_asset
to_openlineage_converter:
airflow.providers.mysql.assets.mysql.convert_asset_to_openlineage
diff --git a/providers/mysql/src/airflow/providers/mysql/get_provider_info.py
b/providers/mysql/src/airflow/providers/mysql/get_provider_info.py
index 22f172b4515..446af3cb9c4 100644
--- a/providers/mysql/src/airflow/providers/mysql/get_provider_info.py
+++ b/providers/mysql/src/airflow/providers/mysql/get_provider_info.py
@@ -67,7 +67,7 @@ def get_provider_info():
],
"asset-uris": [
{
- "schemes": ["mysql"],
+ "schemes": ["mysql", "mariadb"],
"handler": "airflow.providers.mysql.assets.mysql.sanitize_uri",
"factory": "airflow.providers.mysql.assets.mysql.create_asset",
"to_openlineage_converter":
"airflow.providers.mysql.assets.mysql.convert_asset_to_openlineage",
@@ -75,7 +75,7 @@ def get_provider_info():
],
"dataset-uris": [
{
- "schemes": ["mysql"],
+ "schemes": ["mysql", "mariadb"],
"handler": "airflow.providers.mysql.assets.mysql.sanitize_uri",
"factory": "airflow.providers.mysql.assets.mysql.create_asset",
"to_openlineage_converter":
"airflow.providers.mysql.assets.mysql.convert_asset_to_openlineage",
diff --git a/providers/sftp/src/airflow/providers/sftp/assets/sftp.py
b/providers/sftp/src/airflow/providers/sftp/assets/sftp.py
index 3eba167ebea..5676d3ae484 100644
--- a/providers/sftp/src/airflow/providers/sftp/assets/sftp.py
+++ b/providers/sftp/src/airflow/providers/sftp/assets/sftp.py
@@ -49,5 +49,4 @@ def convert_asset_to_openlineage(asset: Asset,
lineage_context) -> OpenLineageDa
from airflow.providers.common.compat.openlineage.facet import Dataset as
OpenLineageDataset
parsed = urlsplit(asset.uri)
- path = parsed.path[1:] if parsed.path.startswith("/") else parsed.path
- return OpenLineageDataset(namespace=f"file://{parsed.netloc}", name=path
or "/")
+ return OpenLineageDataset(namespace=f"file://{parsed.netloc}",
name=parsed.path.lstrip("/") or "/")
diff --git a/providers/sftp/tests/unit/sftp/assets/test_sftp.py
b/providers/sftp/tests/unit/sftp/assets/test_sftp.py
index 6dd34fde568..a2e45d856ca 100644
--- a/providers/sftp/tests/unit/sftp/assets/test_sftp.py
+++ b/providers/sftp/tests/unit/sftp/assets/test_sftp.py
@@ -76,9 +76,9 @@ def test_create_asset(path: str, expected_uri: str) -> None:
[
pytest.param("/", "sftp://example.com:22", id="no-path"),
pytest.param("/", "sftp://example.com:22/", id="path-slash-only"),
- pytest.param("/data/file.csv", "sftp://example.com:22//data/file.csv",
id="root"),
+ pytest.param("data/file.csv", "sftp://example.com:22//data/file.csv",
id="root"),
pytest.param("data/file.csv", "sftp://example.com:22/data/file.csv",
id="no-leading-slash"),
- pytest.param("//data/file.csv",
"sftp://example.com:22///data/file.csv", id="two-slashes"),
+ pytest.param("data/file.csv", "sftp://example.com:22///data/file.csv",
id="two-slashes"),
],
)
def test_convert_asset_to_openlineage(expected_name, uri) -> None:
diff --git a/uv.lock b/uv.lock
index 4fe4cd584b1..95354a6e37a 100644
--- a/uv.lock
+++ b/uv.lock
@@ -5956,15 +5956,13 @@ version = "4.5.2"
source = { editable = "providers/microsoft/mssql" }
dependencies = [
{ name = "apache-airflow" },
+ { name = "apache-airflow-providers-common-compat" },
{ name = "apache-airflow-providers-common-sql" },
{ name = "methodtools" },
{ name = "pymssql" },
]
[package.optional-dependencies]
-common-compat = [
- { name = "apache-airflow-providers-common-compat" },
-]
openlineage = [
{ name = "apache-airflow-providers-openlineage" },
]
@@ -5985,14 +5983,14 @@ docs = [
[package.metadata]
requires-dist = [
{ name = "apache-airflow", editable = "." },
- { name = "apache-airflow-providers-common-compat", marker = "extra ==
'common-compat'", editable = "providers/common/compat" },
+ { name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-openlineage", marker = "extra ==
'openlineage'", editable = "providers/openlineage" },
{ name = "methodtools", specifier = ">=0.4.7" },
{ name = "pymssql", marker = "python_full_version < '3.14'", specifier =
">=2.3.5" },
{ name = "pymssql", marker = "python_full_version >= '3.14'", specifier =
">=2.3.13" },
]
-provides-extras = ["openlineage", "common-compat"]
+provides-extras = ["openlineage"]
[package.metadata.requires-dev]
dev = [
@@ -6095,6 +6093,7 @@ dev = [
{ name = "apache-airflow" },
{ name = "apache-airflow-devel-common" },
{ name = "apache-airflow-providers-common-compat" },
+ { name = "apache-airflow-providers-openlineage" },
{ name = "apache-airflow-task-sdk" },
{ name = "testcontainers" },
]
@@ -6115,6 +6114,7 @@ dev = [
{ name = "apache-airflow", editable = "." },
{ name = "apache-airflow-devel-common", editable = "devel-common" },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
+ { name = "apache-airflow-providers-openlineage", editable =
"providers/openlineage" },
{ name = "apache-airflow-task-sdk", editable = "task-sdk" },
{ name = "testcontainers", specifier = ">=4.12.0" },
]
@@ -20291,8 +20291,8 @@ name = "secretstorage"
version = "3.5.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "cryptography", marker = "python_full_version >= '3.14' or
platform_machine != 'arm64' or sys_platform != 'darwin'" },
- { name = "jeepney", marker = "python_full_version >= '3.14' or
platform_machine != 'arm64' or sys_platform != 'darwin'" },
+ { name = "cryptography", marker = "(python_full_version >= '3.14' and
sys_platform == 'darwin') or (python_full_version < '3.15' and sys_platform ==
'emscripten') or (python_full_version < '3.15' and sys_platform == 'win32') or
(platform_machine != 'arm64' and sys_platform == 'darwin') or (sys_platform !=
'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')" },
+ { name = "jeepney", marker = "(python_full_version >= '3.14' and
sys_platform == 'darwin') or (python_full_version < '3.15' and sys_platform ==
'emscripten') or (python_full_version < '3.15' and sys_platform == 'win32') or
(platform_machine != 'arm64' and sys_platform == 'darwin') or (sys_platform !=
'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')" },
]
sdist = { url =
"https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz",
hash =
"sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size
= 19884, upload-time = "2025-11-23T19:02:53.191Z" }
wheels = [