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

taragolis pushed a commit to branch pendulum-prerelease
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 8da25f1427ea83487030a9b7a5f31a3813364521
Author: Andrey Anshin <[email protected]>
AuthorDate: Wed Oct 4 03:08:22 2023 +0400

    Allow to use pre-release version of `pendulum` in the breeze
---
 Dockerfile.ci                                      |  7 ++++
 .../airflow_breeze/commands/developer_commands.py  |  4 ++
 .../commands/developer_commands_config.py          |  1 +
 .../airflow_breeze/commands/testing_commands.py    |  6 +++
 .../commands/testing_commands_config.py            |  3 ++
 .../src/airflow_breeze/params/shell_params.py      |  1 +
 .../src/airflow_breeze/utils/common_options.py     |  8 ++++
 .../src/airflow_breeze/utils/custom_param_types.py | 17 ++++++++
 .../airflow_breeze/utils/docker_command_utils.py   |  2 +
 images/breeze/output_shell.svg                     | 46 ++++++++++++----------
 images/breeze/output_shell.txt                     |  2 +-
 images/breeze/output_testing_db-tests.svg          | 26 ++++++------
 images/breeze/output_testing_db-tests.txt          |  2 +-
 images/breeze/output_testing_non-db-tests.svg      | 26 ++++++------
 images/breeze/output_testing_non-db-tests.txt      |  2 +-
 images/breeze/output_testing_tests.svg             | 26 ++++++------
 images/breeze/output_testing_tests.txt             |  2 +-
 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                    |  7 ++++
 21 files changed, 133 insertions(+), 58 deletions(-)

diff --git a/Dockerfile.ci b/Dockerfile.ci
index c3e5e2e3a0..333277d4ea 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -1054,6 +1054,13 @@ if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
     pip install --root-user-action ignore 
"sqlalchemy==${min_sqlalchemy_version}"
     pip check
 fi
+if [[ -n ${USE_PENDULUM_PRERELEASE:=} ]]; then
+    echo
+    echo "${COLOR_BLUE}Replace pendulum by pre-release version: 
${USE_PENDULUM_PRERELEASE}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore 
"pendulum==${USE_PENDULUM_PRERELEASE}"
+    pip check
+fi
 
 pip uninstall --root-user-action ignore "pytest-capture-warnings" -y 
>/dev/null 2>&1 || true
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py 
b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index a8c257a2df..0b495f80cc 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -78,6 +78,7 @@ from airflow_breeze.utils.common_options import (
     option_upgrade_boto,
     option_use_airflow_version,
     option_use_packages_from_dist,
+    option_use_pendulum_prerelease,
     option_verbose,
 )
 from airflow_breeze.utils.console import get_console
@@ -171,6 +172,7 @@ class TimerThread(threading.Thread):
 @option_include_mypy_volume
 @option_upgrade_boto
 @option_downgrade_sqlalchemy
+@option_use_pendulum_prerelease
 @option_run_db_tests_only
 @option_skip_db_tests
 @option_verbose
@@ -215,6 +217,7 @@ def shell(
     run_db_tests_only: bool,
     skip_db_tests: bool,
     standalone_dag_processor: bool,
+    use_pendulum_prerelease: str,
     database_isolation: bool,
 ):
     """Enter breeze environment. this is the default command use when no other 
is selected."""
@@ -256,6 +259,7 @@ def shell(
         upgrade_boto=upgrade_boto,
         downgrade_sqlalchemy=downgrade_sqlalchemy,
         standalone_dag_processor=standalone_dag_processor,
+        use_pendulum_prerelease=use_pendulum_prerelease,
         database_isolation=database_isolation,
         run_db_tests_only=run_db_tests_only,
         skip_db_tests=skip_db_tests,
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 65af7d0162..a1cdd0d2c6 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -126,6 +126,7 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
             "options": [
                 "--upgrade-boto",
                 "--downgrade-sqlalchemy",
+                "--use-pendulum-prerelease",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py 
b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index fdd712087b..81d9e12275 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -64,6 +64,7 @@ from airflow_breeze.utils.common_options import (
     option_test_type,
     option_upgrade_boto,
     option_use_airflow_version,
+    option_use_pendulum_prerelease,
     option_use_xdist,
     option_verbose,
 )
@@ -413,6 +414,7 @@ def _verify_parallelism_parameters(
 @option_excluded_parallel_test_types
 @option_upgrade_boto
 @option_downgrade_sqlalchemy
+@option_use_pendulum_prerelease
 @option_collect_only
 @option_remove_arm_packages
 @option_skip_docker_compose_down
@@ -454,6 +456,7 @@ def command_for_tests(**kwargs):
 @option_excluded_parallel_test_types
 @option_upgrade_boto
 @option_downgrade_sqlalchemy
+@option_use_pendulum_prerelease
 @option_collect_only
 @option_remove_arm_packages
 @option_skip_docker_compose_down
@@ -499,6 +502,7 @@ def command_for_db_tests(**kwargs):
 @option_excluded_parallel_test_types
 @option_upgrade_boto
 @option_downgrade_sqlalchemy
+@option_use_pendulum_prerelease
 @option_collect_only
 @option_remove_arm_packages
 @option_skip_docker_compose_down
@@ -551,6 +555,7 @@ def _run_test_command(
     test_type: str,
     upgrade_boto: bool,
     use_airflow_version: str | None,
+    use_pendulum_prerelease: str,
     use_xdist: bool,
     mssql_version: str = "",
     mysql_version: str = "",
@@ -581,6 +586,7 @@ def _run_test_command(
         test_type=test_type,
         upgrade_boto=upgrade_boto,
         downgrade_sqlalchemy=downgrade_sqlalchemy,
+        use_pendulum_prerelease=use_pendulum_prerelease,
         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 17ecfa52c5..6e4f26a53a 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -78,6 +78,7 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--mount-sources",
                 "--upgrade-boto",
                 "--downgrade-sqlalchemy",
+                "--use-pendulum-prerelease",
                 "--remove-arm-packages",
                 "--skip-docker-compose-down",
             ],
@@ -124,6 +125,7 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--mount-sources",
                 "--upgrade-boto",
                 "--downgrade-sqlalchemy",
+                "--use-pendulum-prerelease",
                 "--remove-arm-packages",
                 "--skip-docker-compose-down",
             ],
@@ -174,6 +176,7 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--mount-sources",
                 "--upgrade-boto",
                 "--downgrade-sqlalchemy",
+                "--use-pendulum-prerelease",
                 "--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 182befccdd..729a4ecbcf 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -123,6 +123,7 @@ class ShellParams:
     verbose: bool = False
     upgrade_boto: bool = False
     downgrade_sqlalchemy: bool = False
+    use_pendulum_prerelease: str = ""
     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 249faaafd1..ba6206bdd3 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -57,6 +57,7 @@ from airflow_breeze.utils.custom_param_types import (
     DryRunOption,
     MySQLBackendVersionType,
     NotVerifiedBetterChoice,
+    PreReleaseVersion,
     UseAirflowVersionType,
     VerboseOption,
 )
@@ -659,6 +660,13 @@ option_downgrade_sqlalchemy = click.option(
     is_flag=True,
     envvar="DOWNGRADE_SQLALCHEMY",
 )
+option_use_pendulum_prerelease = click.option(
+    "--use-pendulum-prerelease",
+    help="Use pre-released version of pendulum.",
+    required=False,
+    type=PreReleaseVersion(),
+    envvar="USE_PENDULUM_PRERELEASE",
+)
 option_run_db_tests_only = click.option(
     "--run-db-tests-only",
     help="Only runs tests that require a database",
diff --git a/dev/breeze/src/airflow_breeze/utils/custom_param_types.py 
b/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
index f4983aa33f..063d9d2477 100644
--- a/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
+++ b/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
@@ -224,3 +224,20 @@ class UseAirflowVersionType(BetterChoice):
         if re.match(r"^\d*\.\d*\.\d*\S*$", value):
             return value
         return super().convert(value, param, ctx)
+
+
+class PreReleaseVersion(ParamType):
+    name = "PreReleaseVersion"
+
+    def convert(self, value, param, ctx):
+        from packaging.version import Version
+
+        if value:
+            try:
+                version = Version(value)
+            except ValueError:
+                self.fail(f"Unable to parse version {value!r}.", param, ctx)
+            else:
+                if not version.is_prerelease:
+                    self.fail(f"Expected pre-release version, but got 
{value!r}.", param, ctx)
+        return super().convert(value, param, ctx)
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 78a8d69754..e3efbb9b9d 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -575,6 +575,7 @@ def update_expected_environment_variables(env: dict[str, 
str]) -> None:
     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_PENDULUM_PRERELEASE", "")
     set_value_to_default_if_not_set(env, "USE_PACKAGES_FROM_DIST", "false")
     set_value_to_default_if_not_set(env, "VERBOSE", "false")
     set_value_to_default_if_not_set(env, "VERBOSE_COMMANDS", "false")
@@ -624,6 +625,7 @@ DERIVE_ENV_VARIABLES_FROM_ATTRIBUTES = {
     "UPGRADE_BOTO": "upgrade_boto",
     "USE_XDIST": "use_xdist",
     "DOWNGRADE_SQLALCHEMY": "downgrade_sqlalchemy",
+    "USE_PENDULUM_PRERELEASE": "use_pendulum_prerelease",
     "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_shell.svg b/images/breeze/output_shell.svg
index 115a00a3c1..4d51cf9029 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 2050.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2075.2" 
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="1999.8" />
+      <rect x="0" y="0" width="1463.0" height="2024.1999999999998" />
     </clipPath>
     <clipPath id="breeze-shell-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -288,9 +288,12 @@
 <clipPath id="breeze-shell-line-80">
     <rect x="0" y="1953.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-shell-line-81">
+    <rect x="0" y="1977.9" 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="2048.8" 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="2073.2" 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"/>
@@ -364,24 +367,25 @@
 </text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" 
x="451.4" y="1508.4" textLength="658.8" 
clip-path="url(#breeze-shell-line-61)">[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-r5" x="0" y="1532.8" textLength="1464" 
clip-path="url(#breeze-shell-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">
 </text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-63)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1557.2" textLength="500.2" 
clip-path="url(#breeze-shell-line-63)">&#160;Upgrading/downgrading&#160;selected&#160;packages&#160;</text><text
 class="breeze-shell-r5" x="524.6" y="1557.2" textLength="915" 
clip-path="url(#breeze-shell-line-63)">───────────────────────────────────────────────────────────────────────────</text><text
 c [...]
-</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1581.6" textLength="97.6" 
clip-path="url(#breeze-shell-line-64)">-upgrade</text><text 
class="breeze-shell-r4" x="134.2" y="1581.6" textLength="61" 
clip-path="url(#breeze-shell-line-64)">-boto</text><text class="breez [...]
-</text><text class="breeze-shell-r5" x="0" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1606" textLength="122" 
clip-path="url(#breeze-shell-line-65)">-downgrade</text><text 
class="breeze-shell-r4" x="158.6" y="1606" textLength="134.2" 
clip-path="url(#breeze-shell-line-65)">-sqlalchemy</text><text class="bre [...]
-</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="1464" 
clip-path="url(#breeze-shell-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-66)">
-</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-67)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1654.8" textLength="183" 
clip-path="url(#breeze-shell-line-67)">&#160;DB&#160;test&#160;flags&#160;</text><text
 class="breeze-shell-r5" x="207.4" y="1654.8" textLength="1232.2" 
clip-path="url(#breeze-shell-line-67)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
  [...]
-</text><text class="breeze-shell-r5" x="0" y="1679.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-68)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1679.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-68)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1679.2" textLength="48.8" 
clip-path="url(#breeze-shell-line-68)">-run</text><text class="breeze-shell-r4" 
x="85.4" y="1679.2" textLength="170.8" 
clip-path="url(#breeze-shell-line-68)">-db-tests-only</text><text class [...]
-</text><text class="breeze-shell-r5" x="0" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-69)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-69)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1703.6" textLength="61" 
clip-path="url(#breeze-shell-line-69)">-skip</text><text 
class="breeze-shell-r4" x="97.6" y="1703.6" textLength="109.8" 
clip-path="url(#breeze-shell-line-69)">-db-tests</text><text class="bree [...]
-</text><text class="breeze-shell-r5" x="0" y="1728" textLength="1464" 
clip-path="url(#breeze-shell-line-70)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1728" textLength="12.2" 
clip-path="url(#breeze-shell-line-70)">
-</text><text class="breeze-shell-r5" x="0" y="1752.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-71)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1752.4" textLength="183" 
clip-path="url(#breeze-shell-line-71)">&#160;Other&#160;options&#160;</text><text
 class="breeze-shell-r5" x="207.4" y="1752.4" textLength="1232.2" 
clip-path="url(#breeze-shell-line-71)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
-</text><text class="breeze-shell-r5" x="0" y="1776.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-72)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1776.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-72)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1776.8" textLength="97.6" 
clip-path="url(#breeze-shell-line-72)">-forward</text><text 
class="breeze-shell-r4" x="134.2" y="1776.8" textLength="146.4" 
clip-path="url(#breeze-shell-line-72)">-credentials</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-73)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-73)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1801.2" textLength="48.8" 
clip-path="url(#breeze-shell-line-73)">-max</text><text class="breeze-shell-r4" 
x="85.4" y="1801.2" textLength="61" 
clip-path="url(#breeze-shell-line-73)">-time</text><text class="breeze-she [...]
-</text><text class="breeze-shell-r5" x="0" y="1825.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-74)">│</text><text class="breeze-shell-r7" 
x="353.8" y="1825.6" textLength="1049.2" 
clip-path="url(#breeze-shell-line-74)">(INTEGER&#160;RANGE)&#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;&#160;&#160;&#1
 [...]
-</text><text class="breeze-shell-r5" x="0" y="1850" textLength="1464" 
clip-path="url(#breeze-shell-line-75)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1850" textLength="12.2" 
clip-path="url(#breeze-shell-line-75)">
-</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-76)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1874.4" textLength="195.2" 
clip-path="url(#breeze-shell-line-76)">&#160;Common&#160;options&#160;</text><text
 class="breeze-shell-r5" x="219.6" y="1874.4" textLength="1220" 
clip-path="url(#breeze-shell-line-76)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
-</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-77)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1898.8" textLength="97.6" 
clip-path="url(#breeze-shell-line-77)">-verbose</text><text 
class="breeze-shell-r6" x="158.6" y="1898.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-77)">-v</text><text class="breeze [...]
-</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-78)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1923.2" textLength="48.8" 
clip-path="url(#breeze-shell-line-78)">-dry</text><text class="breeze-shell-r4" 
x="85.4" y="1923.2" textLength="48.8" 
clip-path="url(#breeze-shell-line-78)">-run</text><text class="breeze-sh [...]
-</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1947.6" textLength="85.4" 
clip-path="url(#breeze-shell-line-79)">-answer</text><text 
class="breeze-shell-r6" x="158.6" y="1947.6" textLength="24.4" 
clip-path="url(#breeze-shell-line-79)">-a</text><text class="breeze- [...]
-</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" 
clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1972" textLength="61" 
clip-path="url(#breeze-shell-line-80)">-help</text><text 
class="breeze-shell-r6" x="158.6" y="1972" textLength="24.4" 
clip-path="url(#breeze-shell-line-80)">-h</text><text class="breeze-shell-r1" 
x= [...]
-</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="1464" 
clip-path="url(#breeze-shell-line-81)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-81)">
+</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1581.6" textLength="97.6" 
clip-path="url(#breeze-shell-line-64)">-upgrade</text><text 
class="breeze-shell-r4" x="134.2" y="1581.6" textLength="61" 
clip-path="url(#breeze-shell-line-64)">-boto</text><text class="breez [...]
+</text><text class="breeze-shell-r5" x="0" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1606" textLength="122" 
clip-path="url(#breeze-shell-line-65)">-downgrade</text><text 
class="breeze-shell-r4" x="158.6" y="1606" textLength="134.2" 
clip-path="url(#breeze-shell-line-65)">-sqlalchemy</text><text class="bre [...]
+</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-66)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-66)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1630.4" textLength="48.8" 
clip-path="url(#breeze-shell-line-66)">-use</text><text class="breeze-shell-r4" 
x="85.4" y="1630.4" textLength="244" 
clip-path="url(#breeze-shell-line-66)">-pendulum-prerelease</text><text c [...]
+</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="1464" 
clip-path="url(#breeze-shell-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1654.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-67)">
+</text><text class="breeze-shell-r5" x="0" y="1679.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-68)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1679.2" textLength="183" 
clip-path="url(#breeze-shell-line-68)">&#160;DB&#160;test&#160;flags&#160;</text><text
 class="breeze-shell-r5" x="207.4" y="1679.2" textLength="1232.2" 
clip-path="url(#breeze-shell-line-68)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
  [...]
+</text><text class="breeze-shell-r5" x="0" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-69)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-69)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1703.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-69)">-run</text><text class="breeze-shell-r4" 
x="85.4" y="1703.6" textLength="170.8" 
clip-path="url(#breeze-shell-line-69)">-db-tests-only</text><text class [...]
+</text><text class="breeze-shell-r5" x="0" y="1728" textLength="12.2" 
clip-path="url(#breeze-shell-line-70)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1728" textLength="12.2" 
clip-path="url(#breeze-shell-line-70)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1728" textLength="61" 
clip-path="url(#breeze-shell-line-70)">-skip</text><text 
class="breeze-shell-r4" x="97.6" y="1728" textLength="109.8" 
clip-path="url(#breeze-shell-line-70)">-db-tests</text><text 
class="breeze-shell [...]
+</text><text class="breeze-shell-r5" x="0" y="1752.4" textLength="1464" 
clip-path="url(#breeze-shell-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1752.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-71)">
+</text><text class="breeze-shell-r5" x="0" y="1776.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-72)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1776.8" textLength="183" 
clip-path="url(#breeze-shell-line-72)">&#160;Other&#160;options&#160;</text><text
 class="breeze-shell-r5" x="207.4" y="1776.8" textLength="1232.2" 
clip-path="url(#breeze-shell-line-72)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
+</text><text class="breeze-shell-r5" x="0" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-73)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-73)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1801.2" textLength="97.6" 
clip-path="url(#breeze-shell-line-73)">-forward</text><text 
class="breeze-shell-r4" x="134.2" y="1801.2" textLength="146.4" 
clip-path="url(#breeze-shell-line-73)">-credentials</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="1825.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-74)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1825.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-74)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1825.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-74)">-max</text><text class="breeze-shell-r4" 
x="85.4" y="1825.6" textLength="61" 
clip-path="url(#breeze-shell-line-74)">-time</text><text class="breeze-she [...]
+</text><text class="breeze-shell-r5" x="0" y="1850" textLength="12.2" 
clip-path="url(#breeze-shell-line-75)">│</text><text class="breeze-shell-r7" 
x="353.8" y="1850" textLength="1049.2" 
clip-path="url(#breeze-shell-line-75)">(INTEGER&#160;RANGE)&#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;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="1464" 
clip-path="url(#breeze-shell-line-76)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1874.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-76)">
+</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-77)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1898.8" textLength="195.2" 
clip-path="url(#breeze-shell-line-77)">&#160;Common&#160;options&#160;</text><text
 class="breeze-shell-r5" x="219.6" y="1898.8" textLength="1220" 
clip-path="url(#breeze-shell-line-77)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
+</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-78)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1923.2" textLength="97.6" 
clip-path="url(#breeze-shell-line-78)">-verbose</text><text 
class="breeze-shell-r6" x="158.6" y="1923.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-78)">-v</text><text class="breeze [...]
+</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1947.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-79)">-dry</text><text class="breeze-shell-r4" 
x="85.4" y="1947.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-79)">-run</text><text class="breeze-sh [...]
+</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" 
clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1972" textLength="85.4" 
clip-path="url(#breeze-shell-line-80)">-answer</text><text 
class="breeze-shell-r6" x="158.6" y="1972" textLength="24.4" 
clip-path="url(#breeze-shell-line-80)">-a</text><text class="breeze-shell-r1 
[...]
+</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-81)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1996.4" textLength="61" 
clip-path="url(#breeze-shell-line-81)">-help</text><text 
class="breeze-shell-r6" x="158.6" y="1996.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-81)">-h</text><text class="breeze-shel [...]
+</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="1464" 
clip-path="url(#breeze-shell-line-82)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="2020.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-82)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_shell.txt b/images/breeze/output_shell.txt
index 7ae7c30c84..b8dd60684f 100644
--- a/images/breeze/output_shell.txt
+++ b/images/breeze/output_shell.txt
@@ -1 +1 @@
-64d63199a5c877a0bf9e1da29de02b67
+5b97e504d471f220741a8f78788689ef
diff --git a/images/breeze/output_testing_db-tests.svg 
b/images/breeze/output_testing_db-tests.svg
index 734dd26079..6e55fe5650 100644
--- a/images/breeze/output_testing_db-tests.svg
+++ b/images/breeze/output_testing_db-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1782.3999999999999" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1806.8" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-testing-db-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1731.3999999999999" />
+      <rect x="0" y="0" width="1463.0" height="1755.8" />
     </clipPath>
     <clipPath id="breeze-testing-db-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -255,9 +255,12 @@
 <clipPath id="breeze-testing-db-tests-line-69">
     <rect x="0" y="1685.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-db-tests-line-70">
+    <rect x="0" y="1709.5" 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="1780.4" rx="8"/><text 
class="breeze-testing-db-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;db-tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1804.8" rx="8"/><text 
class="breeze-testing-db-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;db-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"/>
@@ -330,14 +333,15 @@
 </text><text class="breeze-testing-db-tests-r5" x="0" y="1484" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-60)">│</text><text 
class="breeze-testing-db-tests-r5" x="414.8" y="1484" textLength="1024.8" 
clip-path="url(#breeze-testing-db-tests-line-60)">[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;&
 [...]
 </text><text class="breeze-testing-db-tests-r5" x="0" y="1508.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-61)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-61)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1508.4" textLength="97.6" 
clip-path="url(#breeze-testing-db-tests-line-61)">-upgrade</text><text 
class="breeze-testing-db-tests-r4" x="134.2" y="1508.4" textLeng [...]
 </text><text class="breeze-testing-db-tests-r5" x="0" y="1532.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-62)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-62)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1532.8" textLength="122" 
clip-path="url(#breeze-testing-db-tests-line-62)">-downgrade</text><text 
class="breeze-testing-db-tests-r4" x="158.6" y="1532.8" textLen [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1557.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-63)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-63)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1557.2" textLength="85.4" 
clip-path="url(#breeze-testing-db-tests-line-63)">-remove</text><text 
class="breeze-testing-db-tests-r4" x="122" y="1557.2" textLength= [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1581.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-64)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-64)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1581.6" textLength="61" 
clip-path="url(#breeze-testing-db-tests-line-64)">-skip</text><text 
class="breeze-testing-db-tests-r4" x="97.6" y="1581.6" textLength="24 [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1606" 
textLength="1464" 
clip-path="url(#breeze-testing-db-tests-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-db-tests-r1" x="1464" y="1606" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-65)">
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1630.4" 
textLength="24.4" 
clip-path="url(#breeze-testing-db-tests-line-66)">╭─</text><text 
class="breeze-testing-db-tests-r5" x="24.4" y="1630.4" textLength="195.2" 
clip-path="url(#breeze-testing-db-tests-line-66)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-db-tests-r5" x="219.6" y="1630.4" textLength="1220" 
clip-path="url(#breeze-testing-db-tests-line-66)">────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1654.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-67)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1654.8" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-67)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1654.8" textLength="97.6" 
clip-path="url(#breeze-testing-db-tests-line-67)">-verbose</text><text 
class="breeze-testing-db-tests-r7" x="158.6" y="1654.8" textLeng [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1679.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-68)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1679.2" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-68)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1679.2" textLength="48.8" 
clip-path="url(#breeze-testing-db-tests-line-68)">-dry</text><text 
class="breeze-testing-db-tests-r4" x="85.4" y="1679.2" textLength="4 [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1703.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-69)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-69)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1703.6" textLength="61" 
clip-path="url(#breeze-testing-db-tests-line-69)">-help</text><text 
class="breeze-testing-db-tests-r7" x="158.6" y="1703.6" textLength="2 [...]
-</text><text class="breeze-testing-db-tests-r5" x="0" y="1728" 
textLength="1464" 
clip-path="url(#breeze-testing-db-tests-line-70)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-db-tests-r1" x="1464" y="1728" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-70)">
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1557.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-63)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-63)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1557.2" textLength="48.8" 
clip-path="url(#breeze-testing-db-tests-line-63)">-use</text><text 
class="breeze-testing-db-tests-r4" x="85.4" y="1557.2" textLength="2 [...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1581.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-64)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-64)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1581.6" textLength="85.4" 
clip-path="url(#breeze-testing-db-tests-line-64)">-remove</text><text 
class="breeze-testing-db-tests-r4" x="122" y="1581.6" textLength= [...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1606" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-65)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1606" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-65)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1606" textLength="61" 
clip-path="url(#breeze-testing-db-tests-line-65)">-skip</text><text 
class="breeze-testing-db-tests-r4" x="97.6" y="1606" textLength="244" clip- 
[...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1630.4" 
textLength="1464" 
clip-path="url(#breeze-testing-db-tests-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-db-tests-r1" x="1464" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-66)">
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1654.8" 
textLength="24.4" 
clip-path="url(#breeze-testing-db-tests-line-67)">╭─</text><text 
class="breeze-testing-db-tests-r5" x="24.4" y="1654.8" textLength="195.2" 
clip-path="url(#breeze-testing-db-tests-line-67)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-db-tests-r5" x="219.6" y="1654.8" textLength="1220" 
clip-path="url(#breeze-testing-db-tests-line-67)">────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1679.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-68)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1679.2" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-68)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1679.2" textLength="97.6" 
clip-path="url(#breeze-testing-db-tests-line-68)">-verbose</text><text 
class="breeze-testing-db-tests-r7" x="158.6" y="1679.2" textLeng [...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1703.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-69)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-69)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1703.6" textLength="48.8" 
clip-path="url(#breeze-testing-db-tests-line-69)">-dry</text><text 
class="breeze-testing-db-tests-r4" x="85.4" y="1703.6" textLength="4 [...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1728" 
textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-70)">│</text><text 
class="breeze-testing-db-tests-r4" x="24.4" y="1728" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-70)">-</text><text 
class="breeze-testing-db-tests-r4" x="36.6" y="1728" textLength="61" 
clip-path="url(#breeze-testing-db-tests-line-70)">-help</text><text 
class="breeze-testing-db-tests-r7" x="158.6" y="1728" textLength="24.4" cli 
[...]
+</text><text class="breeze-testing-db-tests-r5" x="0" y="1752.4" 
textLength="1464" 
clip-path="url(#breeze-testing-db-tests-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-db-tests-r1" x="1464" y="1752.4" textLength="12.2" 
clip-path="url(#breeze-testing-db-tests-line-71)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_db-tests.txt 
b/images/breeze/output_testing_db-tests.txt
index 9c1af589ad..62af611161 100644
--- a/images/breeze/output_testing_db-tests.txt
+++ b/images/breeze/output_testing_db-tests.txt
@@ -1 +1 @@
-c45075080add9d991477e7f0779c9759
+3a2df90bcf5973892ced65b19739f5c0
diff --git a/images/breeze/output_testing_non-db-tests.svg 
b/images/breeze/output_testing_non-db-tests.svg
index ff187835fa..c1c1b5b032 100644
--- a/images/breeze/output_testing_non-db-tests.svg
+++ b/images/breeze/output_testing_non-db-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1587.1999999999998" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1611.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-non-db-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1536.1999999999998" />
+      <rect x="0" y="0" width="1463.0" height="1560.6" />
     </clipPath>
     <clipPath id="breeze-testing-non-db-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -231,9 +231,12 @@
 <clipPath id="breeze-testing-non-db-tests-line-61">
     <rect x="0" y="1489.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-non-db-tests-line-62">
+    <rect x="0" y="1514.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="1585.2" rx="8"/><text 
class="breeze-testing-non-db-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;non-db-tests</text>
+    <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-testing-non-db-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;non-db-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"/>
@@ -298,14 +301,15 @@
 </text><text class="breeze-testing-non-db-tests-r5" x="0" y="1288.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-52)">│</text><text 
class="breeze-testing-non-db-tests-r5" x="414.8" y="1288.8" textLength="1024.8" 
clip-path="url(#breeze-testing-non-db-tests-line-52)">[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
 [...]
 </text><text class="breeze-testing-non-db-tests-r5" x="0" y="1313.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-53)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-53)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1313.2" textLength="97.6" 
clip-path="url(#breeze-testing-non-db-tests-line-53)">-upgrade</text><text 
class="breeze-testing-non-db-tests-r4" x [...]
 </text><text class="breeze-testing-non-db-tests-r5" x="0" y="1337.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-54)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1337.6" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-54)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1337.6" textLength="122" 
clip-path="url(#breeze-testing-non-db-tests-line-54)">-downgrade</text><text 
class="breeze-testing-non-db-tests-r4"  [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1362" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1362" textLength="85.4" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">-remove</text><text 
class="breeze-testing-non-db-tests-r4" x="122"  [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1386.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1386.4" textLength="61" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">-skip</text><text 
class="breeze-testing-non-db-tests-r4" x="97. [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1410.8" 
textLength="1464" 
clip-path="url(#breeze-testing-non-db-tests-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-non-db-tests-r1" x="1464" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-57)">
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1435.2" 
textLength="24.4" 
clip-path="url(#breeze-testing-non-db-tests-line-58)">╭─</text><text 
class="breeze-testing-non-db-tests-r5" x="24.4" y="1435.2" textLength="195.2" 
clip-path="url(#breeze-testing-non-db-tests-line-58)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-non-db-tests-r5" x="219.6" y="1435.2" textLength="1220" 
clip-path="url(#breeze-testing-non-db-tests-line-58)">────────────────────────────
 [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1459.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1459.6" textLength="97.6" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">-verbose</text><text 
class="breeze-testing-non-db-tests-r7" x [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1484" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1484" textLength="48.8" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">-dry</text><text 
class="breeze-testing-non-db-tests-r4" x="85.4" y= [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1508.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1508.4" textLength="61" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">-help</text><text 
class="breeze-testing-non-db-tests-r7" x="158 [...]
-</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1532.8" 
textLength="1464" 
clip-path="url(#breeze-testing-non-db-tests-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-non-db-tests-r1" x="1464" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-62)">
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1362" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1362" textLength="48.8" 
clip-path="url(#breeze-testing-non-db-tests-line-55)">-use</text><text 
class="breeze-testing-non-db-tests-r4" x="85.4" y= [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1386.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1386.4" textLength="85.4" 
clip-path="url(#breeze-testing-non-db-tests-line-56)">-remove</text><text 
class="breeze-testing-non-db-tests-r4" x= [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1410.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-57)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-57)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1410.8" textLength="61" 
clip-path="url(#breeze-testing-non-db-tests-line-57)">-skip</text><text 
class="breeze-testing-non-db-tests-r4" x="97. [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1435.2" 
textLength="1464" 
clip-path="url(#breeze-testing-non-db-tests-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-non-db-tests-r1" x="1464" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-58)">
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1459.6" 
textLength="24.4" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">╭─</text><text 
class="breeze-testing-non-db-tests-r5" x="24.4" y="1459.6" textLength="195.2" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-non-db-tests-r5" x="219.6" y="1459.6" textLength="1220" 
clip-path="url(#breeze-testing-non-db-tests-line-59)">────────────────────────────
 [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1484" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1484" textLength="97.6" 
clip-path="url(#breeze-testing-non-db-tests-line-60)">-verbose</text><text 
class="breeze-testing-non-db-tests-r7" x="158. [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1508.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1508.4" textLength="48.8" 
clip-path="url(#breeze-testing-non-db-tests-line-61)">-dry</text><text 
class="breeze-testing-non-db-tests-r4" x="85 [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1532.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-62)">│</text><text 
class="breeze-testing-non-db-tests-r4" x="24.4" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-62)">-</text><text 
class="breeze-testing-non-db-tests-r4" x="36.6" y="1532.8" textLength="61" 
clip-path="url(#breeze-testing-non-db-tests-line-62)">-help</text><text 
class="breeze-testing-non-db-tests-r7" x="158 [...]
+</text><text class="breeze-testing-non-db-tests-r5" x="0" y="1557.2" 
textLength="1464" 
clip-path="url(#breeze-testing-non-db-tests-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-non-db-tests-r1" x="1464" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-testing-non-db-tests-line-63)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_non-db-tests.txt 
b/images/breeze/output_testing_non-db-tests.txt
index 36452a650f..efd8911103 100644
--- a/images/breeze/output_testing_non-db-tests.txt
+++ b/images/breeze/output_testing_non-db-tests.txt
@@ -1 +1 @@
-ed916603036dd9979b1593c4d088eb40
+67d3975a5ca34ed28b32e7bd66490a8a
diff --git a/images/breeze/output_testing_tests.svg 
b/images/breeze/output_testing_tests.svg
index f307efb40f..35afeea59c 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 2197.2" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2221.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="2146.2" />
+      <rect x="0" y="0" width="1463.0" height="2170.6" />
     </clipPath>
     <clipPath id="breeze-testing-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -306,9 +306,12 @@
 <clipPath id="breeze-testing-tests-line-86">
     <rect x="0" y="2099.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-tests-line-87">
+    <rect x="0" y="2124.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="2195.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="2219.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"/>
@@ -398,14 +401,15 @@
 </text><text class="breeze-testing-tests-r5" x="0" y="1898.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-77)">│</text><text 
class="breeze-testing-tests-r5" x="414.8" y="1898.8" textLength="1024.8" 
clip-path="url(#breeze-testing-tests-line-77)">[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-r5" x="0" y="1923.2" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-78)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-78)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1923.2" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-78)">-upgrade</text><text 
class="breeze-testing-tests-r4" x="134.2" y="1923.2" textLength="61" 
clip-path="ur [...]
 </text><text class="breeze-testing-tests-r5" x="0" y="1947.6" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-79)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-79)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1947.6" textLength="122" 
clip-path="url(#breeze-testing-tests-line-79)">-downgrade</text><text 
class="breeze-testing-tests-r4" x="158.6" y="1947.6" textLength="134.2" 
clip-path [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1972" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-80)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-80)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1972" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-80)">-remove</text><text 
class="breeze-testing-tests-r4" x="122" y="1972" textLength="158.6" 
clip-path="url(#breez [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1996.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-81)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-81)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1996.4" textLength="61" 
clip-path="url(#breeze-testing-tests-line-81)">-skip</text><text 
class="breeze-testing-tests-r4" x="97.6" y="1996.4" textLength="244" 
clip-path="url(#br [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="2020.8" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-82)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r1" x="1464" y="2020.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-82)">
-</text><text class="breeze-testing-tests-r5" x="0" y="2045.2" 
textLength="24.4" clip-path="url(#breeze-testing-tests-line-83)">╭─</text><text 
class="breeze-testing-tests-r5" x="24.4" y="2045.2" textLength="195.2" 
clip-path="url(#breeze-testing-tests-line-83)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-tests-r5" x="219.6" y="2045.2" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-83)">──────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="2069.6" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-84)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2069.6" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-84)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2069.6" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-84)">-verbose</text><text 
class="breeze-testing-tests-r6" x="158.6" y="2069.6" textLength="24.4" 
clip-path=" [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="2094" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-85)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2094" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-85)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2094" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-85)">-dry</text><text 
class="breeze-testing-tests-r4" x="85.4" y="2094" textLength="48.8" 
clip-path="url(#breeze-t [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="2118.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-86)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-86)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2118.4" textLength="61" 
clip-path="url(#breeze-testing-tests-line-86)">-help</text><text 
class="breeze-testing-tests-r6" x="158.6" y="2118.4" textLength="24.4" 
clip-path="url(# [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="2142.8" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r1" x="1464" y="2142.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-87)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1972" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-80)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-80)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1972" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-80)">-use</text><text 
class="breeze-testing-tests-r4" x="85.4" y="1972" textLength="244" 
clip-path="url(#breeze-te [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1996.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-81)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-81)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1996.4" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-81)">-remove</text><text 
class="breeze-testing-tests-r4" x="122" y="1996.4" textLength="158.6" 
clip-path="ur [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2020.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-82)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2020.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-82)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2020.8" textLength="61" 
clip-path="url(#breeze-testing-tests-line-82)">-skip</text><text 
class="breeze-testing-tests-r4" x="97.6" y="2020.8" textLength="244" 
clip-path="url(#br [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2045.2" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r1" x="1464" y="2045.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-83)">
+</text><text class="breeze-testing-tests-r5" x="0" y="2069.6" 
textLength="24.4" clip-path="url(#breeze-testing-tests-line-84)">╭─</text><text 
class="breeze-testing-tests-r5" x="24.4" y="2069.6" textLength="195.2" 
clip-path="url(#breeze-testing-tests-line-84)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-tests-r5" x="219.6" y="2069.6" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-84)">──────────────────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2094" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-85)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2094" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-85)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2094" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-85)">-verbose</text><text 
class="breeze-testing-tests-r6" x="158.6" y="2094" textLength="24.4" 
clip-path="url(#bre [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2118.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-86)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-86)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2118.4" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-86)">-dry</text><text 
class="breeze-testing-tests-r4" x="85.4" y="2118.4" textLength="48.8" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2142.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-87)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="2142.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-87)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="2142.8" textLength="61" 
clip-path="url(#breeze-testing-tests-line-87)">-help</text><text 
class="breeze-testing-tests-r6" x="158.6" y="2142.8" textLength="24.4" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="2167.2" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-88)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r1" x="1464" y="2167.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-88)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_tests.txt 
b/images/breeze/output_testing_tests.txt
index 49117f9f21..fc813d1a75 100644
--- a/images/breeze/output_testing_tests.txt
+++ b/images/breeze/output_testing_tests.txt
@@ -1 +1 @@
-1620dc0e96578677e8f6ce48cbcd2daa
+935c42956f1bcd1328005ecdb3fa9244
diff --git a/scripts/ci/docker-compose/_docker.env 
b/scripts/ci/docker-compose/_docker.env
index ae3c567bfd..72d1b643d0 100644
--- a/scripts/ci/docker-compose/_docker.env
+++ b/scripts/ci/docker-compose/_docker.env
@@ -80,6 +80,7 @@ UPGRADE_BOTO
 UPGRADE_TO_NEWER_DEPENDENCIES
 USE_XDIST
 DOWNGRADE_SQLALCHEMY
+USE_PENDULUM_PRERELEASE
 VERBOSE
 VERBOSE_COMMANDS
 VERSION_SUFFIX_FOR_PYPI
diff --git a/scripts/ci/docker-compose/base.yml 
b/scripts/ci/docker-compose/base.yml
index 76e41adfcf..1ba8c2b6f9 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -90,6 +90,7 @@ services:
       - USE_XDIST=${USE_XDIST}
       - DOWNGRADE_SQLALCHEMY=${DOWNGRADE_SQLALCHEMY}
       - UPGRADE_TO_NEWER_DEPENDENCIES=${UPGRADE_TO_NEWER_DEPENDENCIES}
+      - USE_PENDULUM_PRERELEASE=${USE_PENDULUM_PRERELEASE}
       - VERBOSE=${VERBOSE}
       - VERBOSE_COMMANDS=${VERBOSE_COMMANDS}
       - VERSION_SUFFIX_FOR_PYPI=${VERSION_SUFFIX_FOR_PYPI}
diff --git a/scripts/ci/docker-compose/devcontainer.env 
b/scripts/ci/docker-compose/devcontainer.env
index aa5798beb0..644d195aea 100644
--- a/scripts/ci/docker-compose/devcontainer.env
+++ b/scripts/ci/docker-compose/devcontainer.env
@@ -70,6 +70,7 @@ SUSPENDED_PROVIDERS_FOLDERS=""
 TEST_TYPE=
 UPGRADE_BOTO="false"
 DOWNGRADE_SQLALCHEMY="false"
+USE_PENDULUM_PRERELEASE=
 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 d16134b482..43bfd05475 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -354,6 +354,13 @@ if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
     pip install --root-user-action ignore 
"sqlalchemy==${min_sqlalchemy_version}"
     pip check
 fi
+if [[ -n ${USE_PENDULUM_PRERELEASE:=} ]]; then
+    echo
+    echo "${COLOR_BLUE}Replace pendulum by pre-release version: 
${USE_PENDULUM_PRERELEASE}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore 
"pendulum==${USE_PENDULUM_PRERELEASE}"
+    pip check
+fi
 
 # Just in case uninstall the pytest-capture-warning which we vendored-in
 pip uninstall --root-user-action ignore "pytest-capture-warnings" -y 
>/dev/null 2>&1 || true

Reply via email to