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 = [

Reply via email to