This is an automated email from the ASF dual-hosted git repository.
potiuk 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 e87562219e4 Bump min versions of crucial providers (#50076)
e87562219e4 is described below
commit e87562219e41856417e077166f5acce34d4d083d
Author: Jarek Potiuk <[email protected]>
AuthorDate: Thu May 1 17:05:17 2025 +0200
Bump min versions of crucial providers (#50076)
There are a few min-versions of providers that should make its way
into apache-airflow pyproject.toml - because they contain crucial
Airflow 3 fixes and users should not be installng those
providers in lower versions.
This PR adds such limits and makes it clearer when updates happen
what happens and where to override them.
---
.pre-commit-config.yaml | 2 +-
dev/breeze/src/airflow_breeze/utils/packages.py | 29 +++++++++++++---------
pyproject.toml | 12 ++++-----
.../ci/pre_commit/update_airflow_pyproject_toml.py | 21 +++++++++-------
4 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c85cc059e77..8e5c8cfdab0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -889,7 +889,7 @@ repos:
name: Update Airflow's meta-package pyproject.toml
language: python
entry: ./scripts/ci/pre_commit/update_airflow_pyproject_toml.py
- files: ^pyproject\.toml$
+ files:
^.*/pyproject\.toml$|^scripts/ci/pre_commit/update_airflow_pyproject_toml\.py$
pass_filenames: false
require_serial: true
additional_dependencies: ['rich>=12.4.4', 'tomli>=2.0.1',
'packaging>=23.2' ]
diff --git a/dev/breeze/src/airflow_breeze/utils/packages.py
b/dev/breeze/src/airflow_breeze/utils/packages.py
index ea4564022c8..3eb6e1e43d0 100644
--- a/dev/breeze/src/airflow_breeze/utils/packages.py
+++ b/dev/breeze/src/airflow_breeze/utils/packages.py
@@ -1040,22 +1040,27 @@ def
update_version_suffix_in_non_provider_pyproject_toml(version_suffix: str, py
lines = pyproject_toml_path.read_text().splitlines()
updated_lines = []
for line in lines:
- if line.startswith("version = "):
+ base_line, comment = line.split(" #", 1) if " #" in line else (line,
"")
+ if comment:
+ comment = " #" + comment
+ if base_line.startswith("version = "):
get_console().print(f"[info]Updating version suffix to
{version_suffix} for {line}.")
- line = line.rstrip('"') + f'{version_suffix}"'
+ base_line = base_line.rstrip('"') + f'{version_suffix}"'
# do not modify references for .post prefixes
if not version_suffix.startswith(".post"):
- if line.strip().startswith('"apache-airflow-') and ">=" in line:
+ if base_line.strip().startswith('"apache-airflow-') and ">=" in
base_line:
floored_version_suffix = floor_version_suffix(version_suffix)
- get_console().print(f"[info]Updating version suffix to
{floored_version_suffix} for {line}.")
- line = line.rstrip('",') + f'{floored_version_suffix}",'
- if line.strip().startswith('"apache-airflow-core') and "==" in
line:
- get_console().print(f"[info]Updating version suffix to
{version_suffix} for {line}.")
- line = line.rstrip('",') + f'{version_suffix}",'
- if line.strip().startswith('"apache-airflow-task-sdk') and "==" in
line:
- get_console().print(f"[info]Updating version suffix to
{version_suffix} for {line}.")
- line = line.rstrip('",') + f'{version_suffix}",'
- updated_lines.append(line)
+ get_console().print(
+ f"[info]Updating version suffix to
{floored_version_suffix} for {base_line}."
+ )
+ base_line = base_line.rstrip('",') +
f'{floored_version_suffix}",'
+ if base_line.strip().startswith('"apache-airflow-core') and "=="
in base_line:
+ get_console().print(f"[info]Updating version suffix to
{version_suffix} for {base_line}.")
+ base_line = base_line.rstrip('",') + f'{version_suffix}",'
+ if base_line.strip().startswith('"apache-airflow-task-sdk') and
"==" in base_line:
+ get_console().print(f"[info]Updating version suffix to
{version_suffix} for {base_line}.")
+ base_line = base_line.rstrip('",') + f'{version_suffix}",'
+ updated_lines.append(f"{base_line}{comment}")
new_content = "\n".join(updated_lines) + "\n"
get_console().print(f"[info]Writing updated content to
{pyproject_toml_path}.\n")
pyproject_toml_path.write_text(new_content)
diff --git a/pyproject.toml b/pyproject.toml
index 0542218d26f..79a32907a3e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -212,7 +212,7 @@ packages = []
"apache-airflow-providers-exasol>=4.6.1"
]
"fab" = [
- "apache-airflow-providers-fab>=2.0.0"
+ "apache-airflow-providers-fab>=2.0.2" # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
]
"facebook" = [
"apache-airflow-providers-facebook>=3.7.0"
@@ -221,7 +221,7 @@ packages = []
"apache-airflow-providers-ftp>=3.12.0"
]
"git" = [
- "apache-airflow-providers-git>=0.0.1"
+ "apache-airflow-providers-git>=0.0.2" # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
]
"github" = [
"apache-airflow-providers-github>=2.8.0"
@@ -281,7 +281,7 @@ packages = []
"apache-airflow-providers-openfaas>=3.7.0"
]
"openlineage" = [
- "apache-airflow-providers-openlineage>=2.1.3"
+ "apache-airflow-providers-openlineage>=2.1.3" # Set from
MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py
]
"opensearch" = [
"apache-airflow-providers-opensearch>=1.5.0"
@@ -422,10 +422,10 @@ packages = []
"apache-airflow-providers-edge3>=1.0.0",
"apache-airflow-providers-elasticsearch>=5.5.2",
"apache-airflow-providers-exasol>=4.6.1",
- "apache-airflow-providers-fab>=2.0.0",
+ "apache-airflow-providers-fab>=2.0.2", # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
"apache-airflow-providers-facebook>=3.7.0",
"apache-airflow-providers-ftp>=3.12.0",
- "apache-airflow-providers-git>=0.0.1",
+ "apache-airflow-providers-git>=0.0.2", # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
"apache-airflow-providers-github>=2.8.0",
"apache-airflow-providers-google>=10.24.0",
"apache-airflow-providers-grpc>=3.7.0",
@@ -445,7 +445,7 @@ packages = []
"apache-airflow-providers-odbc>=4.8.0",
"apache-airflow-providers-openai>=1.5.0",
"apache-airflow-providers-openfaas>=3.7.0",
- "apache-airflow-providers-openlineage>=2.1.3",
+ "apache-airflow-providers-openlineage>=2.1.3", # Set from
MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py
"apache-airflow-providers-opensearch>=1.5.0",
"apache-airflow-providers-opsgenie>=5.8.0",
"apache-airflow-providers-oracle>=3.12.0",
diff --git a/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
b/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
index e4c56ea7d8c..224ecdaac87 100755
--- a/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
+++ b/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
@@ -56,9 +56,9 @@ CUT_OFF_TIMEDELTA = timedelta(days=6 * 30)
# minimum versions for compatibility with Airflow 3
MIN_VERSION_OVERRIDE: dict[str, Version] = {
"amazon": parse_version("2.1.3"),
- "fab": parse_version("2.0.0"),
+ "fab": parse_version("2.0.2"),
"openlineage": parse_version("2.1.3"),
- "git": parse_version("0.0.1"),
+ "git": parse_version("0.0.2"),
"common.messaging": parse_version("1.0.0"),
}
@@ -88,7 +88,7 @@ console.print("[bright_blue]Updating min-provider versions in
apache-airflow\n")
all_providers_metadata = json.loads(PROVIDER_METADATA_FILE_PATH.read_text())
-def find_min_provider_version(provider_id: str) -> Version | None:
+def find_min_provider_version(provider_id: str) -> tuple[Version | None, str]:
metadata = all_providers_metadata.get(provider_id)
# We should periodically update the starting date to avoid pip install
resolution issues
# TODO: when min Python version is 3.11 change back the code to
fromisoformat
@@ -101,7 +101,7 @@ def find_min_provider_version(provider_id: str) -> Version
| None:
min_version_override = MIN_VERSION_OVERRIDE.get(provider_id)
if not metadata:
if not min_version_override:
- return None
+ return None, ""
last_version_newer_than_cutoff = min_version_override
else:
versions: list[Version] = sorted([parse_version(version) for version
in metadata], reverse=True)
@@ -117,14 +117,17 @@ def find_min_provider_version(provider_id: str) ->
Version | None:
f"[bright_blue]Provider id {provider_id} min version found:[/] "
f"{last_version_newer_than_cutoff} (date {date_released}"
)
+ override_comment = ""
if last_version_newer_than_cutoff:
if min_version_override and min_version_override >
last_version_newer_than_cutoff:
console.print(
f"[yellow]Overriding provider id {provider_id} min version:[/]
{min_version_override} "
- f"overridden from hard-coded versions."
+ f"set from hard-coded versions.\n\n"
+ f"[yellow]Modify MIN_VERSION_OVERRIDE in {__file__} to set
different version![/]\n"
)
last_version_newer_than_cutoff = min_version_override
- return last_version_newer_than_cutoff
+ override_comment = f" # Set from MIN_VERSION_OVERRIDE in
{Path(__file__).name}"
+ return last_version_newer_than_cutoff, override_comment
PROVIDER_MIN_VERSIONS: dict[str, str | None] = {}
@@ -141,11 +144,11 @@ if __name__ == "__main__":
all_provider_lines = []
for provider_id in all_providers:
distribution_name = provider_distribution_name(provider_id)
- min_provider_version = find_min_provider_version(provider_id)
+ min_provider_version, comment = find_min_provider_version(provider_id)
if min_provider_version:
- all_provider_lines.append(f'
"{distribution_name}>={min_provider_version}",\n')
+ all_provider_lines.append(f'
"{distribution_name}>={min_provider_version}",{comment}\n')
all_optional_dependencies.append(
- f'"{provider_id}" = [\n
"{distribution_name}>={min_provider_version}"\n]\n'
+ f'"{provider_id}" = [\n
"{distribution_name}>={min_provider_version}"{comment}\n]\n'
)
else:
all_optional_dependencies.append(f'"{provider_id}" = [\n
"{distribution_name}"\n]\n')