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 5f3b716f880b5..b21cd08852f31 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 1c7973b38ce4a..a55e60fa07c9a 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 9c6f97e512554..fe41fb720b408 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 a85b3dc24fa17..7070d48912b86 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 3d94b96505f62..1e04ec497f44e 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 ba08bbb1186b9..8f8d6afd93807 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 7ca0d3e793b09..4bace9dffa864 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 22f172b451599..446af3cb9c49e 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 3eba167ebea31..5676d3ae48444 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 6dd34fde568b4..a2e45d856caf2 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 4fe4cd584b1f5..95354a6e37a7d 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 = [