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 efbead9fe7 Update min-sqlalchemy version to account for latest 
features used (#34293)
efbead9fe7 is described below

commit efbead9fe7462b3634b6d9c842bd9a7ac78a0207
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Sep 12 11:49:56 2023 +0200

    Update min-sqlalchemy version to account for latest features used (#34293)
    
    Some of the recent sqlalchemy changes are not working with minimum
    version of sqlalchemy of ours - for example `where` syntax does
    not allow moe than one clause and we are already passing more
    in _do_delete_old_records (added in #33527). This syntax however
    was added in SQL Alchemy 1.4.28 and our minimum version was
    1.4.27.
    
    This change bumps the minimum SQLAlchemy version to 1.4.28 but it also
    adds a special test job that only runs on Postgres that downgrades
    the SQLAlchemy to the minimum supported version (retrieved from
    setup.cfg). This way, we will be able to detect such incompatible
    changes at the PR time. This is a new flag `--downgrade-sqlalchemy`
    on test command that works similar to earlier `--upgrade-boto`.
    
    We also enable the `--upgrade-boto` and `--downgrade-sqlalchemy` flags
    to be used for `breeze shell` command - thanks to that we can
    easily test both flags with `breeze shell` command.
---
 .github/workflows/ci.yml                           | 49 ++++++++++++++++++++++
 Dockerfile.ci                                      | 23 ++++++----
 .../airflow_breeze/commands/developer_commands.py  |  8 ++++
 .../commands/developer_commands_config.py          |  7 ++++
 .../airflow_breeze/commands/testing_commands.py    | 12 +++---
 .../commands/testing_commands_config.py            |  1 +
 .../src/airflow_breeze/params/shell_params.py      |  1 +
 .../src/airflow_breeze/utils/common_options.py     | 12 ++++++
 .../airflow_breeze/utils/docker_command_utils.py   |  2 +
 images/breeze/output-commands-hash.txt             |  6 +--
 images/breeze/output_shell.svg                     | 24 +++++++----
 images/breeze/output_testing_tests.svg             | 26 +++++++-----
 scripts/ci/docker-compose/_docker.env              |  1 +
 scripts/ci/docker-compose/base.yml                 |  1 +
 scripts/ci/docker-compose/devcontainer.env         |  1 +
 scripts/docker/entrypoint_ci.sh                    | 23 ++++++----
 setup.cfg                                          |  2 +-
 17 files changed, 156 insertions(+), 43 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index df31ab2d38..7a2d6998f0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1024,6 +1024,55 @@ jobs:
         uses: ./.github/actions/post_tests_failure
         if: failure()
 
+  tests-postgres-min-sqlalchemy:
+    timeout-minutes: 130
+    name: >
+      MinSQLAlchemy${{needs.build-info.outputs.default-postgres-version}},
+      Py${{needs.build-info.outputs.default-python-version}}:
+      ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+    runs-on: "${{needs.build-info.outputs.runs-on}}"
+    needs: [build-info, wait-for-ci-images]
+    env:
+      RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+      PARALLEL_TEST_TYPES: 
"${{needs.build-info.outputs.parallel-test-types-list-as-string}}"
+      PR_LABELS: "${{needs.build-info.outputs.pull-request-labels}}"
+      FULL_TESTS_NEEDED: "${{needs.build-info.outputs.full-tests-needed}}"
+      DEBUG_RESOURCES: "${{needs.build-info.outputs.debug-resources}}"
+      BACKEND: "postgres"
+      PYTHON_MAJOR_MINOR_VERSION: 
"${{needs.build-info.outputs.default-python-version}}"
+      PYTHON_VERSION: "${needs.build-info.outputs.default-python-version}}"
+      POSTGRES_VERSION: 
"${{needs.build-info.outputs.default-postgres-version}}"
+      BACKEND_VERSION: "${{needs.build-info.outputs.default-postgres-version}}"
+      DOWNGRADE_SQLALCHEMY: "true"
+      JOB_ID: >
+        
postgres-min-sqlalchemy-${{needs.build-info.outputs.default-python-version}}-
+        ${{needs.build-info.outputs.default-postgres-version}}
+      COVERAGE: "${{needs.build-info.outputs.run-coverage}}"
+    if: needs.build-info.outputs.run-tests == 'true'
+    steps:
+      - name: Cleanup repo
+        shell: bash
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm 
-rf /workspace/*"
+      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+        uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+      - name: >
+          Prepare breeze & CI image: 
${{needs.build-info.outputs.default-python-version}}:${{env.IMAGE_TAG}}
+        uses: ./.github/actions/prepare_breeze_and_image
+      - name: >
+          Tests: ${{needs.build-info.outputs.default-python-version}}:
+          ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+        run: breeze testing tests --run-in-parallel
+      - name: >
+          Post Tests success: 
${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_success
+        if: success()
+      - name: >
+          Post Tests failure: 
${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_failure
+        if: failure()
+
   tests-postgres-in-progress-features-disabled:
     timeout-minutes: 130
     name: >
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 48e626e570..55fc05cc0e 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -949,6 +949,22 @@ fi
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
 rm -f "${AIRFLOW_SOURCES}/.coveragerc"
 
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run 
Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed 
"s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: 
${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore 
"sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 if [[ "${RUN_TESTS}" != "true" ]]; then
@@ -1179,13 +1195,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run 
Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS 
WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py 
b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 21f2852951..60ac45d4cf 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -51,6 +51,7 @@ from airflow_breeze.utils.common_options import (
     option_celery_broker,
     option_celery_flower,
     option_db_reset,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_executor,
     option_force_build,
@@ -70,6 +71,7 @@ from airflow_breeze.utils.common_options import (
     option_platform_single,
     option_postgres_version,
     option_python,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_use_packages_from_dist,
     option_verbose,
@@ -161,6 +163,8 @@ class TimerThread(threading.Thread):
 @option_image_tag_for_running
 @option_max_time
 @option_include_mypy_volume
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @option_verbose
 @option_dry_run
 @option_github_repository
@@ -196,6 +200,8 @@ def shell(
     celery_broker: str,
     celery_flower: bool,
     extra_args: tuple,
+    upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
 ):
     """Enter breeze environment. this is the default command use when no other 
is selected."""
     if get_verbose() or get_dry_run():
@@ -233,6 +239,8 @@ def shell(
         executor=executor,
         celery_broker=celery_broker,
         celery_flower=celery_flower,
+        upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
     )
     sys.exit(result.returncode)
 
diff --git 
a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 81c99e793f..9ef4f8ca96 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -99,6 +99,13 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--package-format",
             ],
         },
+        {
+            "name": "Upgrading/downgrading selected packages",
+            "options": [
+                "--upgrade-boto",
+                "--downgrade-sqlalchemy",
+            ],
+        },
     ],
     "breeze compile-www-assets": [
         {
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py 
b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index ee3b445cb3..b5d09c944b 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -38,6 +38,7 @@ from airflow_breeze.utils.common_options import (
     option_backend,
     option_db_reset,
     option_debug_resources,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_github_repository,
     option_image_name,
@@ -52,6 +53,7 @@ from airflow_breeze.utils.common_options import (
     option_python,
     option_run_in_parallel,
     option_skip_cleanup,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_verbose,
 )
@@ -359,12 +361,8 @@ def run_tests_in_parallel(
     show_default=True,
     envvar="PARALLEL_TEST_TYPES",
 )
[email protected](
-    "--upgrade-boto",
-    help="Remove aiobotocore and upgrade botocore and boto to the latest 
version.",
-    is_flag=True,
-    envvar="UPGRADE_BOTO",
-)
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @click.option(
     "--collect-only",
     help="Collect tests only, do not run them.",
@@ -408,6 +406,7 @@ def command_for_tests(
     mount_sources: str,
     extra_pytest_args: tuple,
     upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
     collect_only: bool,
     remove_arm_packages: bool,
     github_repository: str,
@@ -428,6 +427,7 @@ def command_for_tests(
         forward_ports=False,
         test_type=test_type,
         upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
         collect_only=collect_only,
         remove_arm_packages=remove_arm_packages,
         github_repository=github_repository,
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
index 0c91145b5e..b1913d9f05 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -56,6 +56,7 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--use-airflow-version",
                 "--mount-sources",
                 "--upgrade-boto",
+                "--downgrade-sqlalchemy",
                 "--remove-arm-packages",
                 "--skip-docker-compose-down",
             ],
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py 
b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 99bc8c4d3c..b2240a42c9 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -120,6 +120,7 @@ class ShellParams:
     dry_run: bool = False
     verbose: bool = False
     upgrade_boto: bool = False
+    downgrade_sqlalchemy: bool = False
     executor: str = START_AIRFLOW_DEFAULT_ALLOWED_EXECUTORS
     celery_broker: str = DEFAULT_CELERY_BROKER
     celery_flower: bool = False
diff --git a/dev/breeze/src/airflow_breeze/utils/common_options.py 
b/dev/breeze/src/airflow_breeze/utils/common_options.py
index 95a0b46ebe..f443587913 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -623,3 +623,15 @@ option_airflow_site_directory = click.option(
     help="Local directory path of cloned airflow-site repo.",
     required=True,
 )
+option_upgrade_boto = click.option(
+    "--upgrade-boto",
+    help="Remove aiobotocore and upgrade botocore and boto to the latest 
version.",
+    is_flag=True,
+    envvar="UPGRADE_BOTO",
+)
+option_downgrade_sqlalchemy = click.option(
+    "--downgrade-sqlalchemy",
+    help="Downgrade SQLAlchemy to minimum supported version.",
+    is_flag=True,
+    envvar="DOWNGRADE_SQLALCHEMY",
+)
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py 
b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 82527e6710..3dd9b4ffb6 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -596,6 +596,7 @@ def update_expected_environment_variables(env: dict[str, 
str]) -> None:
     set_value_to_default_if_not_set(env, "TEST_TYPE", "")
     set_value_to_default_if_not_set(env, "TEST_TIMEOUT", "60")
     set_value_to_default_if_not_set(env, "UPGRADE_BOTO", "false")
+    set_value_to_default_if_not_set(env, "DOWNGRADE_SQLALCHEMY", "false")
     set_value_to_default_if_not_set(env, "UPGRADE_TO_NEWER_DEPENDENCIES", 
"false")
     set_value_to_default_if_not_set(env, "USE_PACKAGES_FROM_DIST", "false")
     set_value_to_default_if_not_set(env, "VERBOSE", "false")
@@ -643,6 +644,7 @@ DERIVE_ENV_VARIABLES_FROM_ATTRIBUTES = {
     "SQLITE_URL": "sqlite_url",
     "START_AIRFLOW": "start_airflow",
     "UPGRADE_BOTO": "upgrade_boto",
+    "DOWNGRADE_SQLALCHEMY": "downgrade_sqlalchemy",
     "USE_AIRFLOW_VERSION": "use_airflow_version",
     "USE_PACKAGES_FROM_DIST": "use_packages_from_dist",
     "VERSION_SUFFIX_FOR_PYPI": "version_suffix_for_pypi",
diff --git a/images/breeze/output-commands-hash.txt 
b/images/breeze/output-commands-hash.txt
index 3d22259a4b..9331ce8e37 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -62,11 +62,11 @@ 
setup:regenerate-command-images:d5e29ec6acb1a6af7d83772c2962f89d
 setup:self-upgrade:4af905a147fcd6670a0e33d3d369a94b
 setup:version:be116d90a21c2afe01087f7609774e1e
 setup:fd391bab5277ad3aca65987a84144d51
-shell:1462cde6f7e11a73cb42d4eec93c598e
+shell:1d7a1d16c4c9da86a3d8dc19ee698278
 start-airflow:d4815dea2cfc0af7038697c1d9a13996
 static-checks:19926b8fcea5784b28d4a0d99865363c
 testing:docker-compose-tests:fd154a058082fcfda12eb877a9a89338
 testing:helm-tests:0669be17b744ba057adbf38681bd8e68
 testing:integration-tests:e745af9dd595adaa6f17ef02fbaae3b5
-testing:tests:29da9579379b1d013c02dd6c4471b958
-testing:355a33f1e38298dba301d638d956fb55
+testing:tests:f5b196d717b2099172595063a7a3d0aa
+testing:a9bdfb94a0d08deee7aaf4037cc55a34
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index e9414eda1e..2fbccea481 100644
--- a/images/breeze/output_shell.svg
+++ b/images/breeze/output_shell.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1611.6" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1660.3999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-shell-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1560.6" />
+      <rect x="0" y="0" width="1463.0" height="1609.3999999999999" />
     </clipPath>
     <clipPath id="breeze-shell-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -234,9 +234,15 @@
 <clipPath id="breeze-shell-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-shell-line-63">
+    <rect x="0" y="1538.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-64">
+    <rect x="0" y="1563.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1609.6" rx="8"/><text 
class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;shell</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1658.4" rx="8"/><text 
class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;shell</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -305,11 +311,13 @@
 </text><text class="breeze-shell-r4" x="0" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r4" 
x="451.4" y="1386.4" textLength="658.8" 
clip-path="url(#breeze-shell-line-56)">[default:&#160;wheel]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 cl [...]
 </text><text class="breeze-shell-r4" x="0" y="1410.8" textLength="1464" 
clip-path="url(#breeze-shell-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r2" x="1464" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-57)">
 </text><text class="breeze-shell-r4" x="0" y="1435.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r4" 
x="24.4" y="1435.2" textLength="195.2" 
clip-path="url(#breeze-shell-line-58)">&#160;Common&#160;options&#160;</text><text
 class="breeze-shell-r4" x="219.6" y="1435.2" textLength="1220" 
clip-path="url(#breeze-shell-line-58)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
-</text><text class="breeze-shell-r4" x="0" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1459.6" textLength="97.6" 
clip-path="url(#breeze-shell-line-59)">-verbose</text><text 
class="breeze-shell-r6" x="158.6" y="1459.6" textLength="24.4" 
clip-path="url(#breeze-shell-line-59)">-v</text><text class="breeze [...]
-</text><text class="breeze-shell-r4" x="0" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1484" textLength="48.8" 
clip-path="url(#breeze-shell-line-60)">-dry</text><text class="breeze-shell-r5" 
x="85.4" y="1484" textLength="48.8" 
clip-path="url(#breeze-shell-line-60)">-run</text><text class="breeze-shell-r6" 
 [...]
-</text><text class="breeze-shell-r4" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1508.4" textLength="85.4" 
clip-path="url(#breeze-shell-line-61)">-answer</text><text 
class="breeze-shell-r6" x="158.6" y="1508.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-61)">-a</text><text class="breeze- [...]
-</text><text class="breeze-shell-r4" x="0" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1532.8" textLength="61" 
clip-path="url(#breeze-shell-line-62)">-help</text><text 
class="breeze-shell-r6" x="158.6" y="1532.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-62)">-h</text><text class="breeze-shel [...]
-</text><text class="breeze-shell-r4" x="0" y="1557.2" textLength="1464" 
clip-path="url(#breeze-shell-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r2" x="1464" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">
+</text><text class="breeze-shell-r4" x="0" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1459.6" textLength="97.6" 
clip-path="url(#breeze-shell-line-59)">-upgrade</text><text 
class="breeze-shell-r5" x="134.2" y="1459.6" textLength="61" 
clip-path="url(#breeze-shell-line-59)">-boto</text><text class="breez [...]
+</text><text class="breeze-shell-r4" x="0" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1484" textLength="122" 
clip-path="url(#breeze-shell-line-60)">-downgrade</text><text 
class="breeze-shell-r5" x="158.6" y="1484" textLength="134.2" 
clip-path="url(#breeze-shell-line-60)">-sqlalchemy</text><text class="bre [...]
+</text><text class="breeze-shell-r4" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1508.4" textLength="97.6" 
clip-path="url(#breeze-shell-line-61)">-verbose</text><text 
class="breeze-shell-r6" x="317.2" y="1508.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-61)">-v</text><text class="breeze [...]
+</text><text class="breeze-shell-r4" x="0" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1532.8" textLength="48.8" 
clip-path="url(#breeze-shell-line-62)">-dry</text><text class="breeze-shell-r5" 
x="85.4" y="1532.8" textLength="48.8" 
clip-path="url(#breeze-shell-line-62)">-run</text><text class="breeze-sh [...]
+</text><text class="breeze-shell-r4" x="0" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1557.2" textLength="85.4" 
clip-path="url(#breeze-shell-line-63)">-answer</text><text 
class="breeze-shell-r6" x="317.2" y="1557.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-63)">-a</text><text class="breeze- [...]
+</text><text class="breeze-shell-r4" x="0" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r5" 
x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r5" 
x="36.6" y="1581.6" textLength="61" 
clip-path="url(#breeze-shell-line-64)">-help</text><text 
class="breeze-shell-r6" x="317.2" y="1581.6" textLength="24.4" 
clip-path="url(#breeze-shell-line-64)">-h</text><text class="breeze-shel [...]
+</text><text class="breeze-shell-r4" x="0" y="1606" textLength="1464" 
clip-path="url(#breeze-shell-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r2" x="1464" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_tests.svg 
b/images/breeze/output_testing_tests.svg
index 1799ff0437..062258fcbc 100644
--- a/images/breeze/output_testing_tests.svg
+++ b/images/breeze/output_testing_tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1465.1999999999998" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1489.6" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-testing-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1414.1999999999998" />
+      <rect x="0" y="0" width="1463.0" height="1438.6" />
     </clipPath>
     <clipPath id="breeze-testing-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -216,9 +216,12 @@
 <clipPath id="breeze-testing-tests-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-tests-line-57">
+    <rect x="0" y="1392.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1463.2" rx="8"/><text 
class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;testing&#160;tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1487.6" rx="8"/><text 
class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;testing&#160;tests</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -278,14 +281,15 @@
 </text><text class="breeze-testing-tests-r4" x="0" y="1166.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-47)">│</text><text 
class="breeze-testing-tests-r7" x="390.4" y="1166.8" textLength="1049.2" 
clip-path="url(#breeze-testing-tests-line-47)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
 </text><text class="breeze-testing-tests-r4" x="0" y="1191.2" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text 
class="breeze-testing-tests-r4" x="390.4" y="1191.2" textLength="1049.2" 
clip-path="url(#breeze-testing-tests-line-48)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
 </text><text class="breeze-testing-tests-r4" x="0" y="1215.6" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1215.6" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-49)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1215.6" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-49)">-upgrade</text><text 
class="breeze-testing-tests-r5" x="134.2" y="1215.6" textLength="61" 
clip-path="ur [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1240" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-50)">-remove</text><text 
class="breeze-testing-tests-r5" x="122" y="1240" textLength="158.6" 
clip-path="url(#breez [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1264.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-51)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1264.4" textLength="61" 
clip-path="url(#breeze-testing-tests-line-51)">-skip</text><text 
class="breeze-testing-tests-r5" x="97.6" y="1264.4" textLength="244" 
clip-path="url(#br [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1288.8" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r2" x="1464" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-52)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1313.2" 
textLength="24.4" clip-path="url(#breeze-testing-tests-line-53)">╭─</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1313.2" textLength="195.2" 
clip-path="url(#breeze-testing-tests-line-53)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-tests-r4" x="219.6" y="1313.2" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-53)">──────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1337.6" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1337.6" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-54)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1337.6" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-54)">-verbose</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1337.6" textLength="24.4" 
clip-path=" [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1362" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-55)">-dry</text><text 
class="breeze-testing-tests-r5" x="85.4" y="1362" textLength="48.8" 
clip-path="url(#breeze-t [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-56)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1386.4" textLength="61" 
clip-path="url(#breeze-testing-tests-line-56)">-help</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="24.4" 
clip-path="url(# [...]
-</text><text class="breeze-testing-tests-r4" x="0" y="1410.8" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r2" x="1464" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-57)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1240" textLength="122" 
clip-path="url(#breeze-testing-tests-line-50)">-downgrade</text><text 
class="breeze-testing-tests-r5" x="158.6" y="1240" textLength="134.2" 
clip-path="url(#b [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1264.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-51)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1264.4" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-51)">-remove</text><text 
class="breeze-testing-tests-r5" x="122" y="1264.4" textLength="158.6" 
clip-path="ur [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1288.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-52)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1288.8" textLength="61" 
clip-path="url(#breeze-testing-tests-line-52)">-skip</text><text 
class="breeze-testing-tests-r5" x="97.6" y="1288.8" textLength="244" 
clip-path="url(#br [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1313.2" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r2" x="1464" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-53)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1337.6" 
textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">╭─</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1337.6" textLength="195.2" 
clip-path="url(#breeze-testing-tests-line-54)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-tests-r4" x="219.6" y="1337.6" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-54)">──────────────────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1362" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-55)">-verbose</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1362" textLength="24.4" 
clip-path="url(#bre [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-56)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1386.4" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-56)">-dry</text><text 
class="breeze-testing-tests-r5" x="85.4" y="1386.4" textLength="48.8" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1410.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-57)">-</text><text 
class="breeze-testing-tests-r5" x="36.6" y="1410.8" textLength="61" 
clip-path="url(#breeze-testing-tests-line-57)">-help</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1410.8" textLength="24.4" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r4" x="0" y="1435.2" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r2" x="1464" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-58)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/docker-compose/_docker.env 
b/scripts/ci/docker-compose/_docker.env
index 2cd4bc0f7d..aa21804e9b 100644
--- a/scripts/ci/docker-compose/_docker.env
+++ b/scripts/ci/docker-compose/_docker.env
@@ -75,6 +75,7 @@ TEST_TIMEOUT
 TEST_TYPE
 UPGRADE_BOTO
 UPGRADE_TO_NEWER_DEPENDENCIES
+DOWNGRADE_SQLALCHEMY
 VERBOSE
 VERBOSE_COMMANDS
 VERSION_SUFFIX_FOR_PYPI
diff --git a/scripts/ci/docker-compose/base.yml 
b/scripts/ci/docker-compose/base.yml
index 17b2a197c8..1ce740d801 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -84,6 +84,7 @@ services:
       - TEST_TYPE=${TEST_TYPE}
       - TEST_TIMEOUT=${TEST_TIMEOUT}
       - UPGRADE_BOTO=${UPGRADE_BOTO}
+      - DOWNGRADE_SQLALCHEMY=${DOWNGRADE_SQLALCHEMY}
       - UPGRADE_TO_NEWER_DEPENDENCIES=${UPGRADE_TO_NEWER_DEPENDENCIES}
       - VERBOSE=${VERBOSE}
       - VERBOSE_COMMANDS=${VERBOSE_COMMANDS}
diff --git a/scripts/ci/docker-compose/devcontainer.env 
b/scripts/ci/docker-compose/devcontainer.env
index d66767fa02..f71a0e1e39 100644
--- a/scripts/ci/docker-compose/devcontainer.env
+++ b/scripts/ci/docker-compose/devcontainer.env
@@ -69,6 +69,7 @@ START_AIRFLOW="false"
 SUSPENDED_PROVIDERS_FOLDERS=""
 TEST_TYPE=
 UPGRADE_BOTO="false"
+DOWNGRADE_SQLALCHEMY="false"
 UPGRADE_TO_NEWER_DEPENDENCIES="false"
 VERBOSE="false"
 VERBOSE_COMMANDS="false"
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 67eb96defc..23ad3c5328 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -328,6 +328,22 @@ fi
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
 rm -f "${AIRFLOW_SOURCES}/.coveragerc"
 
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run 
Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed 
"s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: 
${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore 
"sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 # If we do not want to run tests, we simply drop into bash
@@ -561,13 +577,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run 
Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS 
WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
diff --git a/setup.cfg b/setup.cfg
index 367924d82d..26c8cb2e03 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -142,7 +142,7 @@ install_requires =
     # See https://sqlalche.me/e/b8d9 for details of deprecated features
     # you can set environment variable SQLALCHEMY_WARN_20=1 to show all 
deprecation warnings.
     # The issue tracking it is https://github.com/apache/airflow/issues/28723
-    sqlalchemy>=1.4.24,<2.0
+    sqlalchemy>=1.4.28,<2.0
     sqlalchemy_jsonfield>=1.0
     tabulate>=0.7.5
     tenacity>=6.2.0,!=8.2.0


Reply via email to