From afc02f1dfe49e684a792546bcdbd089f92fd9945 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Oct 2025 16:24:15 +0000 Subject: [PATCH 1/2] Support use-airflow-version with PR num for Breeze Add PR number support to --use-airflow-version option Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Add tests for PR number pattern matching Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Move PR_NUMBER_PATTERN to global_constants for consistency Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Add error handling for deleted fork repositories Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Refactor: consolidate PR number and repo:branch logic in find_installation_spec Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Remove unused get_repo_and_branch_from_pr function Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Support use-airflow-version with PR num for Breeze Add PR number support to --use-airflow-version option Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Add tests for PR number pattern matching Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Move PR_NUMBER_PATTERN to global_constants for consistency Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> Add error handling for deleted fork repositories Co-authored-by: jason810496 <68415893+jason810496@users.noreply.github.com> --- .../airflow_breeze/commands/common_options.py | 5 +- .../src/airflow_breeze/global_constants.py | 1 + .../utils/custom_param_types.py | 5 +- dev/breeze/src/airflow_breeze/utils/github.py | 66 +++++++++++++ dev/breeze/tests/test_use_airflow_version.py | 54 +++++++++++ .../install_airflow_and_providers.py | 92 +++++++++++++++++-- 6 files changed, 212 insertions(+), 11 deletions(-) create mode 100644 dev/breeze/tests/test_use_airflow_version.py diff --git a/dev/breeze/src/airflow_breeze/commands/common_options.py b/dev/breeze/src/airflow_breeze/commands/common_options.py index c2c72f307e5d0..88758531b9bc5 100644 --- a/dev/breeze/src/airflow_breeze/commands/common_options.py +++ b/dev/breeze/src/airflow_breeze/commands/common_options.py @@ -431,8 +431,9 @@ def _set_default_from_parent(ctx: click.core.Context, option: click.core.Option, option_use_airflow_version = click.option( "--use-airflow-version", help="Use (reinstall at entry) Airflow version from PyPI. It can also be version (to install from PyPI), " - "`none`, `wheel`, or `sdist` to install from `dist` folder or `owner/repo:branch` to " - "install from GitHub repo. Uses --mount-sources `remove` if not specified, but `providers-and-tests` " + "`none`, `wheel`, or `sdist` to install from `dist` folder, `owner/repo:branch` to " + "install from GitHub repo, or a PR number (e.g., `57219`) to install from a pull request. " + "Uses --mount-sources `remove` if not specified, but `providers-and-tests` " "or `tests` can be specified for `--mount-sources` when `--use-airflow-version` is used.", type=UseAirflowVersionType(ALLOWED_USE_AIRFLOW_VERSIONS), envvar="USE_AIRFLOW_VERSION", diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py index e6df162f5d576..74fe8689981cd 100644 --- a/dev/breeze/src/airflow_breeze/global_constants.py +++ b/dev/breeze/src/airflow_breeze/global_constants.py @@ -391,6 +391,7 @@ def all_ctl_test_packages() -> list[str]: ALL_HISTORICAL_PYTHON_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] GITHUB_REPO_BRANCH_PATTERN = r"^([^/]+)/([^/:]+):([^:]+)$" +PR_NUMBER_PATTERN = r"^\d+$" def normalize_platform_machine(platform_machine: str) -> str: 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 1c3397f6775c6..83a94cec15501 100644 --- a/dev/breeze/src/airflow_breeze/utils/custom_param_types.py +++ b/dev/breeze/src/airflow_breeze/utils/custom_param_types.py @@ -242,11 +242,14 @@ class UseAirflowVersionType(BetterChoice): def __init__(self, *args): super().__init__(*args) - self.all_choices = [*self.choices, "", ""] + self.all_choices = [*self.choices, "", "", ""] def convert(self, value, param, ctx): if re.match(r"^\d*\.\d*\.\d*\S*$", value): return value if re.match(GITHUB_REPO_BRANCH_PATTERN, value): return value + # Check if it's a PR number (digits only) + if re.match(r"^\d+$", value): + return value return super().convert(value, param, ctx) diff --git a/dev/breeze/src/airflow_breeze/utils/github.py b/dev/breeze/src/airflow_breeze/utils/github.py index 4b4ea3f50226d..16caca71c6a28 100644 --- a/dev/breeze/src/airflow_breeze/utils/github.py +++ b/dev/breeze/src/airflow_breeze/utils/github.py @@ -307,6 +307,72 @@ def download_artifact_from_run_id(run_id: str, output_file: Path, github_reposit os.remove(temp_file) +def get_repo_and_branch_from_pr( + pr_number: str, github_repository: str = "apache/airflow", github_token: str | None = None +) -> tuple[str, str, str]: + """ + Gets the owner, repo, and branch from a PR number using GitHub API. + + :param pr_number: PR number (without #) + :param github_repository: GitHub repository in format owner/repo (default: apache/airflow) + :param github_token: GitHub token for API authentication (optional, but recommended to avoid rate limits) + :return: tuple of (owner, repo, branch) + """ + import requests + + pr_url = f"https://api.github.com/repos/{github_repository}/pulls/{pr_number}" + + headers = {"Accept": "application/vnd.github.v3+json"} + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + headers["X-GitHub-Api-Version"] = "2022-11-28" + + try: + response = requests.get(pr_url, headers=headers, timeout=10) + log_github_rate_limit_error(response) + + if response.status_code == 404: + get_console().print(f"[error]PR #{pr_number} not found in {github_repository}") + sys.exit(1) + if response.status_code != 200: + get_console().print( + f"[error]Failed to fetch PR #{pr_number} from {github_repository}. " + f"Status code: {response.status_code}" + ) + if response.status_code == 403: + get_console().print( + "[warning]GitHub API rate limit may have been exceeded. " + "Consider setting GITHUB_TOKEN environment variable." + ) + sys.exit(1) + + pr_data = response.json() + + # Check if the head repo exists (could be None if fork was deleted) + if pr_data.get("head", {}).get("repo") is None: + get_console().print( + f"[error]PR #{pr_number} head repository is not available. " + "This can happen if the fork has been deleted." + ) + sys.exit(1) + + owner = pr_data["head"]["repo"]["owner"]["login"] + repo = pr_data["head"]["repo"]["name"] + branch = pr_data["head"]["ref"] + + get_console().print( + f"[info]Resolved PR #{pr_number} to {owner}/{repo}:{branch}[/]" + ) + return owner, repo, branch + + except requests.Timeout: + get_console().print(f"[error]Request to GitHub API timed out while fetching PR #{pr_number}") + sys.exit(1) + except Exception as e: + get_console().print(f"[error]Error fetching PR #{pr_number}: {e}") + sys.exit(1) + + def download_artifact_from_pr(pr: str, output_file: Path, github_repository: str, github_token: str): import requests diff --git a/dev/breeze/tests/test_use_airflow_version.py b/dev/breeze/tests/test_use_airflow_version.py new file mode 100644 index 0000000000000..4e7f2a9ed7507 --- /dev/null +++ b/dev/breeze/tests/test_use_airflow_version.py @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import re + +import pytest + +from airflow_breeze.global_constants import GITHUB_REPO_BRANCH_PATTERN, PR_NUMBER_PATTERN + + +@pytest.mark.parametrize( + "value, should_match_pr, should_match_repo", + [ + pytest.param("57219", True, False, id="pr_number"), + pytest.param("12345", True, False, id="another_pr_number"), + pytest.param("jason810496/airflow:ci/breeze/compile-ui-assets", False, True, id="repo_branch"), + pytest.param("apache/airflow:main", False, True, id="apache_repo"), + pytest.param("2.7.3", False, False, id="version_number"), + pytest.param("wheel", False, False, id="wheel"), + pytest.param("sdist", False, False, id="sdist"), + pytest.param("none", False, False, id="none"), + pytest.param("57219abc", False, False, id="pr_with_chars"), + pytest.param("abc57219", False, False, id="chars_with_number"), + ], +) +def test_pr_number_pattern(value, should_match_pr, should_match_repo): + """Test that PR number pattern correctly matches PR numbers only.""" + pr_match = re.match(PR_NUMBER_PATTERN, value) + repo_match = re.match(GITHUB_REPO_BRANCH_PATTERN, value) + + if should_match_pr: + assert pr_match is not None, f"Expected {value} to match PR pattern" + else: + assert pr_match is None, f"Expected {value} to NOT match PR pattern" + + if should_match_repo: + assert repo_match is not None, f"Expected {value} to match repo pattern" + else: + assert repo_match is None, f"Expected {value} to NOT match repo pattern" diff --git a/scripts/in_container/install_airflow_and_providers.py b/scripts/in_container/install_airflow_and_providers.py index 6358e615d0098..632920eca1d93 100755 --- a/scripts/in_container/install_airflow_and_providers.py +++ b/scripts/in_container/install_airflow_and_providers.py @@ -259,6 +259,70 @@ class InstallationSpec(NamedTuple): GITHUB_REPO_BRANCH_PATTERN = r"^([^/]+)/([^/:]+):([^:]+)$" +PR_NUMBER_PATTERN = r"^\d+$" + + +def resolve_pr_number_to_repo_branch(pr_number: str, github_repository: str) -> tuple[str, str, str]: + """ + Resolve a PR number to owner/repo:branch format using GitHub API. + + :param pr_number: PR number as a string + :param github_repository: GitHub repository in format owner/repo (default: apache/airflow) + :return: tuple of (owner, repo, branch) + """ + import requests + + github_token = os.environ.get("GITHUB_TOKEN") + pr_url = f"https://api.github.com/repos/{github_repository}/pulls/{pr_number}" + + headers = {"Accept": "application/vnd.github.v3+json"} + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + headers["X-GitHub-Api-Version"] = "2022-11-28" + + try: + console.print(f"[info]Fetching PR #{pr_number} information from GitHub API...") + response = requests.get(pr_url, headers=headers, timeout=10) + + if response.status_code == 404: + console.print(f"[error]PR #{pr_number} not found in {github_repository}") + sys.exit(1) + if response.status_code == 403: + console.print( + "[error]GitHub API rate limit may have been exceeded or access denied. " + "Consider setting GITHUB_TOKEN environment variable." + ) + sys.exit(1) + if response.status_code != 200: + console.print( + f"[error]Failed to fetch PR #{pr_number} from {github_repository}. " + f"Status code: {response.status_code}" + ) + sys.exit(1) + + pr_data = response.json() + + # Check if the head repo exists (could be None if fork was deleted) + if pr_data.get("head", {}).get("repo") is None: + console.print( + f"[error]PR #{pr_number} head repository is not available. " + "This can happen if the fork has been deleted." + ) + sys.exit(1) + + owner = pr_data["head"]["repo"]["owner"]["login"] + repo = pr_data["head"]["repo"]["name"] + branch = pr_data["head"]["ref"] + + console.print(f"[info]Resolved PR #{pr_number} to {owner}/{repo}:{branch}") + return owner, repo, branch + + except requests.Timeout: + console.print(f"[error]Request to GitHub API timed out while fetching PR #{pr_number}") + sys.exit(1) + except Exception as e: + console.print(f"[error]Error fetching PR #{pr_number}: {e}") + sys.exit(1) def find_installation_spec( @@ -361,9 +425,21 @@ def find_installation_spec( airflow_ctl_distribution = None airflow_ctl_constraints_location = None compile_ui_assets = False - elif repo_match := re.match(GITHUB_REPO_BRANCH_PATTERN, use_airflow_version): - owner, repo, branch = repo_match.groups() - console.print(f"\nInstalling airflow from GitHub: {use_airflow_version}\n") + elif re.match(PR_NUMBER_PATTERN, use_airflow_version) or ( + repo_match := re.match(GITHUB_REPO_BRANCH_PATTERN, use_airflow_version) + ): + # Handle PR number format - resolve to owner/repo:branch first + if re.match(PR_NUMBER_PATTERN, use_airflow_version): + owner, repo, branch = resolve_pr_number_to_repo_branch(use_airflow_version, github_repository) + resolved_version = f"{owner}/{repo}:{branch}" + console.print(f"\nInstalling airflow from GitHub PR #{use_airflow_version}: {resolved_version}\n") + else: + # Handle owner/repo:branch format + owner, repo, branch = repo_match.groups() + resolved_version = use_airflow_version + console.print(f"\nInstalling airflow from GitHub: {use_airflow_version}\n") + + # Common logic for both PR number and repo:branch formats vcs_url = f"git+https://github.com/{owner}/{repo}.git@{branch}" if airflow_extras: airflow_distribution_spec = f"apache-airflow{airflow_extras} @ {vcs_url}" @@ -376,32 +452,32 @@ def find_installation_spec( airflow_constraints_mode=airflow_constraints_mode, airflow_constraints_location=airflow_constraints_location, airflow_constraints_reference=airflow_constraints_reference, - airflow_package_version=use_airflow_version, + airflow_package_version=resolved_version, default_constraints_branch=default_constraints_branch, github_repository=github_repository, python_version=python_version, ) compile_ui_assets = True - console.print(f"\nInstalling airflow task-sdk from GitHub {use_airflow_version}\n") + console.print(f"\nInstalling airflow task-sdk from GitHub {resolved_version}\n") airflow_task_sdk_distribution = f"apache-airflow-task-sdk @ {vcs_url}#subdirectory=task-sdk" airflow_constraints_location = get_airflow_constraints_location( install_airflow_with_constraints=install_airflow_with_constraints, airflow_constraints_mode=airflow_constraints_mode, airflow_constraints_location=airflow_constraints_location, airflow_constraints_reference=airflow_constraints_reference, - airflow_package_version=use_airflow_version, + airflow_package_version=resolved_version, default_constraints_branch=default_constraints_branch, github_repository=github_repository, python_version=python_version, ) - console.print(f"\nInstalling airflow ctl from remote spec {use_airflow_version}\n") + console.print(f"\nInstalling airflow ctl from GitHub {resolved_version}\n") airflow_ctl_distribution = f"apache-airflow-ctl @ {vcs_url}#subdirectory=airflow-ctl" airflow_ctl_constraints_location = get_airflow_constraints_location( install_airflow_with_constraints=install_airflow_with_constraints, airflow_constraints_mode=airflow_constraints_mode, airflow_constraints_location=airflow_constraints_location, airflow_constraints_reference=airflow_constraints_reference, - airflow_package_version=use_airflow_version, + airflow_package_version=resolved_version, default_constraints_branch=default_constraints_branch, github_repository=github_repository, python_version=python_version, From 44935eeb5090a0db657809190085200f7bc876e2 Mon Sep 17 00:00:00 2001 From: LIU ZHE YOU Date: Sat, 1 Nov 2025 16:45:54 +0800 Subject: [PATCH 2/2] Remove not used github utils --- dev/breeze/doc/images/output-commands.svg | 4 +- ...agement_install-provider-distributions.svg | 74 +++++++------ ...agement_install-provider-distributions.txt | 2 +- ...nagement_verify-provider-distributions.svg | 56 +++++----- ...nagement_verify-provider-distributions.txt | 2 +- dev/breeze/doc/images/output_shell.svg | 100 +++++++++--------- dev/breeze/doc/images/output_shell.txt | 2 +- .../doc/images/output_start-airflow.svg | 76 ++++++------- .../doc/images/output_start-airflow.txt | 2 +- .../doc/images/output_testing_core-tests.svg | 56 +++++----- .../doc/images/output_testing_core-tests.txt | 2 +- .../images/output_testing_providers-tests.svg | 74 +++++++------ .../images/output_testing_providers-tests.txt | 2 +- .../images/output_testing_system-tests.svg | 56 +++++----- .../images/output_testing_system-tests.txt | 2 +- .../utils/custom_param_types.py | 4 +- dev/breeze/src/airflow_breeze/utils/github.py | 66 ------------ .../install_airflow_and_providers.py | 6 +- 18 files changed, 274 insertions(+), 312 deletions(-) diff --git a/dev/breeze/doc/images/output-commands.svg b/dev/breeze/doc/images/output-commands.svg index d8ec4f40c1d95..84ee1aa8caeab 100644 --- a/dev/breeze/doc/images/output-commands.svg +++ b/dev/breeze/doc/images/output-commands.svg @@ -345,8 +345,8 @@ localstack | mongo | mssql | openlineage | otel | pinot | qdrant | redis | redis | statsd | tinkerpop | trino | ydb)                                                    ---standalone-dag-processor/--no-standalone-dag-processoRun standalone dag processor for start-airflow          -r(required for Airflow 3).                               +--standalone-dag-processor/--no-standalone-dag-process…Run standalone dag processor for start-airflow          +(required for Airflow 3).                               [default: standalone-dag-processor]                     --auth-managerSpecify the auth manager to set        (>SimpleAuthManager< | FabAuthManager) diff --git a/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg b/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg index 6c728099b2204..ed224cddc77d5 100644 --- a/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg +++ b/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg @@ -1,4 +1,4 @@ - + Airflow.                                                --load-default-connections-cEnable configuration to load default connections when   starting Airflow.                                       ---standalone-dag-processor/--no-standalone-dag-processoRun standalone dag processor for start-airflow          -r(required for Airflow 3).                               +--standalone-dag-processor/--no-standalone-dag-process…Run standalone dag processor for start-airflow          +(required for Airflow 3).                               [default: standalone-dag-processor]                     --start-api-server-with-examplesStart minimal airflow api-server with examples (for     testing purposes) when entering breeze.                 @@ -710,8 +713,8 @@ --excluded-providersJSON-string of dictionary containing excluded providers  per python version ({'3.12': ['provider']})              (TEXT)                                                   ---install-airflow-with-constraints/--no-install-airflow-Install airflow in a separate step, with constraints     -with-constraintsdetermined from package or airflow version.              +--install-airflow-with-constraints/--no-install-airflow…Install airflow in a separate step, with constraints     +determined from package or airflow version.              [default: install-airflow-with-constraints]              --install-selected-providersComma-separated list of providers selected to be         installed (implies --use-distributions-from-dist).       @@ -733,47 +736,48 @@ --providers-skip-constraintsDo not use constraints when installing providers. --use-airflow-versionUse (reinstall at entry) Airflow version from PyPI. It   can also be version (to install from PyPI), `none`,      -`wheel`, or `sdist` to install from `dist` folder or     -`owner/repo:branch` to install from GitHub repo. Uses    ---mount-sources `remove` if not specified, but           -`providers-and-tests` or `tests` can be specified for    -`--mount-sources` when `--use-airflow-version` is used.  -(none | wheel | sdist | <airflow_version> |              -<owner/repo:branch>)                                     ---allow-pre-releasesAllow pre-releases of Airflow, task-sdk, providers and   -airflowctl to be installed. Set to true automatically    -for pre-release --use-airflow-version)                   ---use-distributions-from-distInstall all found distributions (--distribution-format -determines type) from 'dist' folder when entering        -breeze.                                                  ---install-airflow-python-clientInstall airflow python client packages                   -(--distribution-format determines type) from 'dist'      -folder when entering breeze.                             -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Upgrading/downgrading/removing selected packages ───────────────────────────────────────────────────────────────────╮ ---upgrade-botoRemove aiobotocore and upgrade botocore and boto to the latest version. ---upgrade-sqlalchemyUpgrade SQLAlchemy to the latest version. ---downgrade-sqlalchemyDowngrade SQLAlchemy to minimum supported version. ---downgrade-pendulumDowngrade Pendulum to minimum supported version. -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ DB test flags ──────────────────────────────────────────────────────────────────────────────────────────────────────╮ ---run-db-tests-onlyOnly runs tests that require a database ---skip-db-testsSkip tests that require a database -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Other options ──────────────────────────────────────────────────────────────────────────────────────────────────────╮ ---forward-credentials-fForward local credentials to container when running. ---max-timeMaximum time that the command should take - if it takes longer, the command will fail. -(INTEGER RANGE)                                                                        ---verbose-commandsShow details of commands executed. ---keep-env-variablesDo not clear environment variables that might have side effect while running tests ---no-db-cleanupDo not clear the database before each test module -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ ---answer-aForce answer to questions.(y | n | q | yes | no | quit) ---dry-run-DIf dry-run is set, commands are only printed, not executed. ---verbose-vPrint verbose information about performed steps. ---help-hShow this message and exit. -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +`wheel`, or `sdist` to install from `dist` folder,       +`owner/repo:branch` to install from GitHub repo, or a PR +number (e.g., `57219`) to install from a pull request.   +Uses --mount-sources `remove` if not specified, but      +`providers-and-tests` or `tests` can be specified for    +`--mount-sources` when `--use-airflow-version` is used.  +(none | wheel | sdist | <airflow_version> |              +<owner/repo:branch> | <pr_number>)                       +--allow-pre-releasesAllow pre-releases of Airflow, task-sdk, providers and   +airflowctl to be installed. Set to true automatically    +for pre-release --use-airflow-version)                   +--use-distributions-from-distInstall all found distributions (--distribution-format +determines type) from 'dist' folder when entering        +breeze.                                                  +--install-airflow-python-clientInstall airflow python client packages                   +(--distribution-format determines type) from 'dist'      +folder when entering breeze.                             +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Upgrading/downgrading/removing selected packages ───────────────────────────────────────────────────────────────────╮ +--upgrade-botoRemove aiobotocore and upgrade botocore and boto to the latest version. +--upgrade-sqlalchemyUpgrade SQLAlchemy to the latest version. +--downgrade-sqlalchemyDowngrade SQLAlchemy to minimum supported version. +--downgrade-pendulumDowngrade Pendulum to minimum supported version. +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ DB test flags ──────────────────────────────────────────────────────────────────────────────────────────────────────╮ +--run-db-tests-onlyOnly runs tests that require a database +--skip-db-testsSkip tests that require a database +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Other options ──────────────────────────────────────────────────────────────────────────────────────────────────────╮ +--forward-credentials-fForward local credentials to container when running. +--max-timeMaximum time that the command should take - if it takes longer, the command will fail. +(INTEGER RANGE)                                                                        +--verbose-commandsShow details of commands executed. +--keep-env-variablesDo not clear environment variables that might have side effect while running tests +--no-db-cleanupDo not clear the database before each test module +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ +--answer-aForce answer to questions.(y | n | q | yes | no | quit) +--dry-run-DIf dry-run is set, commands are only printed, not executed. +--verbose-vPrint verbose information about performed steps. +--help-hShow this message and exit. +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/dev/breeze/doc/images/output_shell.txt b/dev/breeze/doc/images/output_shell.txt index cdcf48abeb93d..90366bcf773e4 100644 --- a/dev/breeze/doc/images/output_shell.txt +++ b/dev/breeze/doc/images/output_shell.txt @@ -1 +1 @@ -7ddf177fe50f2574e5242e9c3741363a +95e0df9ab3cf89dbd869e6e9de9062ea diff --git a/dev/breeze/doc/images/output_start-airflow.svg b/dev/breeze/doc/images/output_start-airflow.svg index 04684c6ef8e86..147bf7d18c79d 100644 --- a/dev/breeze/doc/images/output_start-airflow.svg +++ b/dev/breeze/doc/images/output_start-airflow.svg @@ -1,4 +1,4 @@ - +