This is an automated email from the ASF dual-hosted git repository.

ephraimanierobi pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 5014dd32c1245a52b245ecb2e8e886f9661d571f
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Jan 9 01:12:06 2026 +0100

    [v3-1-test] Automatically add pydantic extra when installing airflow 2 in 
breeze (#60264) (#60267)
    
    When installing Airflow 2 in Breeze, we need to add pydantic as
    extra, because pydantic in Airflow 2 was not a required dependency
    and installation of airflow even with constraints willl not
    downgrade pydantic to the version that was supported in Airflow 2.
    
    When we detect that airflow 2 is installed (either by specified
    version number or by retrieving the version from the dist package)
    we simply extend the extras with pydantic and that causes airflow
    installation to downgrade pydantic to the version that is specified
    in constraints of selected airflow version.
    (cherry picked from commit 336b8161608409f6ff935af4e2be96e32fb0c0f2)
    
    Co-authored-by: Jarek Potiuk <[email protected]>
---
 scripts/in_container/install_airflow_and_providers.py | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/scripts/in_container/install_airflow_and_providers.py 
b/scripts/in_container/install_airflow_and_providers.py
index 49fb52ffb62..1b3341ef954 100755
--- a/scripts/in_container/install_airflow_and_providers.py
+++ b/scripts/in_container/install_airflow_and_providers.py
@@ -393,6 +393,11 @@ def find_installation_spec(
                     github_repository=github_repository,
                     python_version=python_version,
                 )
+            if airflow_version.startswith("2."):
+                # We need to make sure that pydantic is added as extra for 
Airflow 2.x
+                # because it's not in extras by default, and pydantic 
incompatible version is
+                # installed by default in the container and breaks 
serialization import
+                airflow_extras = _add_pydantic_to_extras(airflow_extras)
             if airflow_extras:
                 airflow_distribution_spec += airflow_extras
         # We always install latest task-sdk - it's independent from Airflow
@@ -490,6 +495,8 @@ def find_installation_spec(
         sys.exit(1)
     else:
         compile_ui_assets = False
+        if use_airflow_version.startswith("2"):
+            airflow_extras = _add_pydantic_to_extras(airflow_extras)
         console.print(f"\nInstalling airflow via 
apache-airflow=={use_airflow_version}")
         airflow_distribution_spec = 
f"apache-airflow{airflow_extras}=={use_airflow_version}"
         airflow_core_distribution_spec = (
@@ -559,6 +566,16 @@ def find_installation_spec(
     return installation_spec
 
 
+def _add_pydantic_to_extras(airflow_extras: str) -> str:
+    console.print("[yellow]Adding pydantic to airflow extras for Airflow 2.x")
+    if airflow_extras:
+        airflow_extras = "[" + airflow_extras.strip("[]") + ",pydantic]"
+    else:
+        airflow_extras = "[pydantic]"
+    console.print(f"[yellow]New extras: {airflow_extras.strip('[]')}")
+    return airflow_extras
+
+
 def download_airflow_source_tarball(installation_spec: InstallationSpec):
     """Download Airflow source tarball from GitHub."""
     if not installation_spec.compile_ui_assets:

Reply via email to