You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by je...@apache.org on 2022/05/01 00:41:40 UTC
[airflow] branch v2-3-test updated (9a5a495485 -> 072d441f0b)
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a change to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
discard 9a5a495485 Add missing --for-production parameter for new breeze docs building (#23376)
discard 8430808567 When exec fails in breeze we do not print stack-trace (#23342)
discard c37ccff9f9 Fix mssql in the new Breeze (#23368)
discard 18d1ba0e0a Fix regeneration of breeze screenshots (#23344)
discard 7aeba270df Cleaner default output when breeze starts (#23341)
discard 93b485f304 resolving conflict (#23052)
discard 14223ef7f0 Remove confusion about upgrade-to-newer-dependencies breeze param (#23334)
discard 2357959845 Unify style of communication with the users for Breeze. (#23311)
discard 0022a5e696 Fix empty image preparation (#23304)
omit efdb945505 update release note
omit 0adcfa7ca1 Fix retrieval of the right branch in pre-commits (#23297)
omit f22dab0f90 Add missing licenses and update `.rat-excludes` (#23296)
omit a83b6d4630 Revert "EdgeModifier refactoring (#21404)" (#23291)
omit 5617ca009c We weren't checking .jsx files for licenses and missed one (#23289)
add 5bc507584a We weren't checking .jsx files for licenses and missed one (#23289)
add e56078f534 Revert "EdgeModifier refactoring (#21404)" (#23291)
add 331ed72e18 Add missing licenses and update `.rat-excludes` (#23296)
add 4b7c308f91 Fix retrieval of the right branch in pre-commits (#23297)
add 6b772f68db update release note
new c4f6886485 Fix empty image preparation (#23304)
new 807983166e Unify style of communication with the users for Breeze. (#23311)
new c062edd46c Remove confusion about upgrade-to-newer-dependencies breeze param (#23334)
new 4a12b5b0a9 resolving conflict (#23052)
new 53964ccf81 Cleaner default output when breeze starts (#23341)
new ea8d4a3ac4 Fix regeneration of breeze screenshots (#23344)
new 75301c4242 Fix mssql in the new Breeze (#23368)
new c514758c0e When exec fails in breeze we do not print stack-trace (#23342)
new 072d441f0b Add missing --for-production parameter for new breeze docs building (#23376)
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (9a5a495485)
\
N -- N -- N refs/heads/v2-3-test (072d441f0b)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
[airflow] 02/09: Unify style of communication with the users for Breeze. (#23311)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 807983166e65f69d1d3701740ee23dcc60961a26
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Thu Apr 28 17:35:05 2022 +0200
Unify style of communication with the users for Breeze. (#23311)
Fixes: #22906
(cherry picked from commit 505af06303d8160c71f6a7abe4792746f640083d)
---
BREEZE.rst | 11 ++
.../0011-unified-communication-with-the-users.md | 94 ++++++++++++++++
.../build_image/ci/build_ci_image.py | 35 +++---
.../build_image/ci/build_ci_params.py | 4 +-
.../build_image/prod/build_prod_image.py | 30 ++---
.../build_image/prod/build_prod_params.py | 10 +-
.../src/airflow_breeze/commands/ci_image_tools.py | 8 +-
.../commands/configuration_and_maintenance.py | 125 ++++++++++++---------
.../commands/configure_rich_click.py | 2 +-
.../airflow_breeze/commands/custom_param_types.py | 10 +-
.../airflow_breeze/commands/developer_commands.py | 10 +-
.../commands/production_image_tools.py | 8 +-
.../airflow_breeze/commands/release_management.py | 12 +-
dev/breeze/src/airflow_breeze/commands/testing.py | 4 +-
dev/breeze/src/airflow_breeze/shell/enter_shell.py | 18 +--
.../src/airflow_breeze/shell/shell_params.py | 16 +--
dev/breeze/src/airflow_breeze/utils/cache.py | 8 +-
dev/breeze/src/airflow_breeze/utils/console.py | 51 ++++++---
dev/breeze/src/airflow_breeze/utils/constraints.py | 6 +-
.../airflow_breeze/utils/docker_command_utils.py | 41 +++----
.../utils/find_newer_dependencies.py | 23 ++--
.../src/airflow_breeze/utils/md5_build_check.py | 14 ++-
dev/breeze/src/airflow_breeze/utils/parallel.py | 22 ++--
dev/breeze/src/airflow_breeze/utils/path_utils.py | 8 +-
dev/breeze/src/airflow_breeze/utils/pulll_image.py | 26 +++--
.../src/airflow_breeze/utils/python_versions.py | 8 +-
dev/breeze/src/airflow_breeze/utils/registry.py | 10 +-
dev/breeze/src/airflow_breeze/utils/reinstall.py | 30 ++---
dev/breeze/src/airflow_breeze/utils/run_tests.py | 8 +-
dev/breeze/src/airflow_breeze/utils/run_utils.py | 61 +++++-----
dev/breeze/src/airflow_breeze/utils/visuals.py | 8 +-
dev/breeze/tests/test_docker_command_utils.py | 68 ++++++-----
dev/provider_packages/prepare_provider_packages.py | 2 +-
docs/build_docs.py | 32 +++---
docs/exts/docs_build/docs_builder.py | 18 +--
docs/exts/docs_build/errors.py | 4 +-
docs/exts/docs_build/spelling_checks.py | 4 +-
images/breeze/output-config.svg | 3 +-
.../ci/pre_commit/pre_commit_check_order_setup.py | 10 +-
39 files changed, 520 insertions(+), 342 deletions(-)
diff --git a/BREEZE.rst b/BREEZE.rst
index 64ae2ea346..37b47f29cf 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -378,6 +378,17 @@ default settings.
You can see which value of the parameters that can be stored persistently in cache marked with >VALUE<
in the help of the commands.
+Another part of configuration is enabling/disabling cheatsheet, asciiart. The cheatsheet and asciiart can
+be disabled - they are "nice looking" and cheatsheet
+contains useful information for first time users but eventually you might want to disable both if you
+find it repetitive and annoying.
+
+With the config setting colour-blind-friendly communication for Breeze messages. By default we communicate
+with the users about information/errors/warnings/successes via colour-coded messages, but we can switch
+it off by passing ``--no-colour`` to config in which case the messages to the user printed by Breeze
+will be printed using different schemes (italic/bold/underline) to indicate different kind of messages
+rather than colours.
+
Here is the part of Breeze video which is relevant (note that it refers to the old ``./breeze-legacy``
command but it is very similar to current ``breeze`` command):
diff --git a/dev/breeze/doc/adr/0011-unified-communication-with-the-users.md b/dev/breeze/doc/adr/0011-unified-communication-with-the-users.md
new file mode 100644
index 0000000000..89f967e350
--- /dev/null
+++ b/dev/breeze/doc/adr/0011-unified-communication-with-the-users.md
@@ -0,0 +1,94 @@
+<!--
+ 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.
+ -->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
+
+- [11. Unified communication with the users](#11-unified-communication-with-the-users)
+ - [Status](#status)
+ - [Context](#context)
+ - [Decision](#decision)
+ - [Consequences](#consequences)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+# 11. Unified communication with the users
+
+Date: 2022-04-27
+
+## Status
+
+Accepted
+
+## Context
+
+We communicate with the user via messages printed in get_console() And we should
+make sure we communicate the msssages in a consistent way so that the users would
+understand:
+
+* whether verification of a condition succeeded
+* whether a message is just informational that might be used to understand what's going on
+* whether there is some important warning to potentially act on
+* whether there is a definite error that the user should fix
+* instructions how to proceed
+
+The messages should be:
+
+* short
+* informative
+* readable
+* actionable
+
+## Decision
+
+We are using rich and colours to communicate the type of messages:
+
+* [success] - to show verification success (green)
+* [info] - to present inform users (bright_blue)
+* [warning] - to print warning that the user probably should read and act on (bright_yellow)
+* [error] - when there is an error that the user should fix (red)
+* instructions should be printed without style and default rich rendering should be used
+
+By default, we map those styles to those colors, but we can change configuration of Breeze to
+be colour-blind-friendly by disabling colours in communication via `breeze config --no-colour`.
+
+When signalling warning or error The communication should not be confusing and
+should not contain "noise". It should contain simple - usually one-liner -
+information on what's wrong or what the user is warned against, possibly
+followed by instructions telling the user what to do. When we are able to
+foresee that error will happen, we should print the message only with
+explanation, and we should suppress any stack-traces as they are not really
+useful for the users. When an error is unexpected, full stack trace should
+be written to allow easier investigation of the problem.
+
+We should also support `--verbose` flag to display all the commands being executed, and
+the --dry-run flag to only display commands and not execute the commands. This will allow to
+diagnose any problems that the user might have.
+
+Whenever we print a logically separated message we should add EOL to separate the logical part of the
+message as well as when you want to separate the header description from bullet lists (very similar to
+what .rst rules are for readability). Whitespace improves readability of communication and messages
+separated in sections separated by whitespace and marked with colors are much more readable than the
+wall of text without visible structure.
+
+## Consequences
+
+Users will get consistent approach when it comes to context and expectations of their reaction for the
+messages. Developers will use consistent styles.
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
index 7c1bca1eb1..f511c7ac55 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
@@ -28,7 +28,7 @@ from airflow_breeze.build_image.ci.build_ci_params import (
from airflow_breeze.utils.cache import touch_cache_file
from airflow_breeze.utils.ci_group import ci_group
from airflow_breeze.utils.confirm import Answer, user_confirm
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
construct_docker_build_command,
construct_empty_docker_build_command,
@@ -71,9 +71,8 @@ def should_we_run_the_build(build_ci_params: BuildCiParams) -> bool:
if is_repo_rebased(build_ci_params.github_repository, build_ci_params.airflow_branch):
return True
else:
- console.print(
- "\n[bright_yellow]This might take a lot of time, w"
- "e think you should rebase first.[/]\n"
+ get_console().print(
+ "\n[warning]This might take a lot of time, w" "e think you should rebase first.[/]\n"
)
answer = user_confirm(
"But if you really, really want - you can do it", timeout=5, default_answer=Answer.NO
@@ -81,25 +80,25 @@ def should_we_run_the_build(build_ci_params: BuildCiParams) -> bool:
if answer == Answer.YES:
return True
else:
- console.print(
- "[bright_blue]Please rebase your code before continuing.[/]\n"
+ get_console().print(
+ "[info]Please rebase your code before continuing.[/]\n"
"Check this link to know more "
"https://github.com/apache/airflow/blob/main/CONTRIBUTING.rst#id15\n"
)
- console.print('[red]Exiting the process[/]\n')
+ get_console().print('[error]Exiting the process[/]\n')
sys.exit(1)
elif answer == Answer.NO:
instruct_build_image(build_ci_params.python)
return False
else: # users_status == Answer.QUIT:
- console.print('\n[bright_yellow]Quitting the process[/]\n')
+ get_console().print('\n[warning]Quitting the process[/]\n')
sys.exit()
except TimeoutOccurred:
- console.print('\nTimeout. Considering your response as No\n')
+ get_console().print('\nTimeout. Considering your response as No\n')
instruct_build_image(build_ci_params.python)
return False
except Exception as e:
- console.print(f'\nTerminating the process on {e}')
+ get_console().print(f'\nTerminating the process on {e}')
sys.exit(1)
@@ -126,8 +125,8 @@ def build_ci_image(
"""
fix_group_permissions()
if verbose or dry_run:
- console.print(
- f"\n[bright_blue]Building CI image of airflow from {AIRFLOW_SOURCES_ROOT} "
+ get_console().print(
+ f"\n[info]Building CI image of airflow from {AIRFLOW_SOURCES_ROOT} "
f"python version: {ci_image_params.python}[/]\n"
)
with ci_group(
@@ -158,7 +157,7 @@ def build_ci_image(
if ci_image_params.empty_image:
env = os.environ.copy()
env['DOCKER_BUILDKIT'] = "1"
- console.print(f"\n[blue]Building empty CI Image for Python {ci_image_params.python}\n")
+ get_console().print(f"\n[info]Building empty CI Image for Python {ci_image_params.python}\n")
cmd = construct_empty_docker_build_command(image_params=ci_image_params)
build_result = run_command(
cmd,
@@ -170,7 +169,7 @@ def build_ci_image(
env=env,
)
else:
- console.print(f"\n[blue]Building CI Image for Python {ci_image_params.python}\n")
+ get_console().print(f"\n[info]Building CI Image for Python {ci_image_params.python}\n")
build_result = run_command(
cmd, verbose=verbose, dry_run=dry_run, cwd=AIRFLOW_SOURCES_ROOT, text=True, check=False
)
@@ -181,13 +180,13 @@ def build_ci_image(
touch_cache_file(f"built_{ci_image_params.python}", root_dir=ci_image_cache_dir)
calculate_md5_checksum_for_files(ci_image_params.md5sum_cache_dir, update=True)
else:
- console.print("[red]Error when building image![/]")
+ get_console().print("[error]Error when building image![/]")
return (
build_result.returncode,
f"Image build: {ci_image_params.python}",
)
else:
- console.print("[blue]Not updating build cache because we are in `dry_run` mode.[/]")
+ get_console().print("[info]Not updating build cache because we are in `dry_run` mode.[/]")
if ci_image_params.push_image:
return tag_and_push_image(image_params=ci_image_params, dry_run=dry_run, verbose=verbose)
return build_result.returncode, f"Image build: {ci_image_params.python}"
@@ -197,8 +196,8 @@ def build_ci_image_in_parallel(
verbose: bool, dry_run: bool, parallelism: int, python_version_list: List[str], **kwargs
):
"""Run CI image builds in parallel."""
- console.print(
- f"\n[bright_blue]Running with parallelism = {parallelism} for the images: {python_version_list}:"
+ get_console().print(
+ f"\n[info]Running with parallelism = {parallelism} for the images: {python_version_list}:"
)
pool = mp.Pool(parallelism)
results = [pool.apply_async(build_ci_image, args=(verbose, dry_run, False), kwds=kwargs)]
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
index f726b000f7..da5364d087 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
@@ -23,7 +23,7 @@ from typing import List, Optional
from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
from airflow_breeze.global_constants import get_airflow_version
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import BUILD_CACHE_DIR
@@ -149,7 +149,7 @@ class BuildCiParams:
return Path(BUILD_CACHE_DIR, self.airflow_branch, self.python, "CI")
def print_info(self):
- console.print(f"CI Image: {self.airflow_version} Python: {self.python}.")
+ get_console().print(f"CI Image: {self.airflow_version} Python: {self.python}.")
REQUIRED_CI_IMAGE_ARGS = [
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
index 2caeeb7ef5..967a655899 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
@@ -22,7 +22,7 @@ from typing import Tuple
from airflow_breeze.build_image.prod.build_prod_params import BuildProdParams
from airflow_breeze.utils.ci_group import ci_group
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
construct_docker_build_command,
construct_empty_docker_build_command,
@@ -76,7 +76,7 @@ def clean_docker_context_files(verbose: bool, dry_run: bool):
Cleans up docker context files folder - leaving only .README.md there.
"""
if verbose or dry_run:
- console.print("[bright_blue]Cleaning docker-context-files[/]")
+ get_console().print("[info]Cleaning docker-context-files[/]")
if dry_run:
return
with contextlib.suppress(FileNotFoundError):
@@ -101,20 +101,20 @@ def check_docker_context_files(install_packages_from_context: bool):
)
if number_of_context_files == 0:
if install_packages_from_context:
- console.print('[bright_yellow]\nERROR! You want to install packages from docker-context-files')
- console.print('[bright_yellow]\n but there are no packages to install in this folder.')
+ get_console().print('[warning]\nERROR! You want to install packages from docker-context-files')
+ get_console().print('[warning]\n but there are no packages to install in this folder.')
sys.exit(1)
else:
if not install_packages_from_context:
- console.print(
- '[bright_yellow]\n ERROR! There are some extra files in docker-context-files except README.md'
+ get_console().print(
+ '[warning]\n ERROR! There are some extra files in docker-context-files except README.md'
)
- console.print('[bright_yellow]\nAnd you did not choose --install-packages-from-context flag')
- console.print(
- '[bright_yellow]\nThis might result in unnecessary cache invalidation and long build times'
+ get_console().print('[warning]\nAnd you did not choose --install-packages-from-context flag')
+ get_console().print(
+ '[warning]\nThis might result in unnecessary cache invalidation and long build times'
)
- console.print(
- '[bright_yellow]\nExiting now \
+ get_console().print(
+ '[warning]\nExiting now \
- please restart the command with --cleanup-context switch'
)
sys.exit(1)
@@ -145,8 +145,8 @@ def build_production_image(
"""
fix_group_permissions()
if verbose or dry_run:
- console.print(
- f"\n[bright_blue]Building PROD image of airflow from {AIRFLOW_SOURCES_ROOT} "
+ get_console().print(
+ f"\n[info]Building PROD image of airflow from {AIRFLOW_SOURCES_ROOT} "
f"python version: {prod_image_params.python}[/]\n"
)
with ci_group(
@@ -168,11 +168,11 @@ def build_production_image(
text=True,
check=False,
)
- console.print(f"\n[blue]Building PROD Image for Python {prod_image_params.python}\n")
+ get_console().print(f"\n[info]Building PROD Image for Python {prod_image_params.python}\n")
if prod_image_params.empty_image:
env = os.environ.copy()
env['DOCKER_BUILDKIT'] = "1"
- console.print(f"\n[blue]Building empty PROD Image for Python {prod_image_params.python}\n")
+ get_console().print(f"\n[info]Building empty PROD Image for Python {prod_image_params.python}\n")
cmd = construct_empty_docker_build_command(image_params=prod_image_params)
build_command_result = run_command(
cmd,
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
index 50eeca452b..116fae9333 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
@@ -31,7 +31,7 @@ from airflow_breeze.global_constants import (
get_airflow_extras,
get_airflow_version,
)
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
@dataclass
@@ -173,10 +173,10 @@ class BuildProdParams:
self.airflow_version = self.install_airflow_reference
elif len(self.install_airflow_version) > 0:
if not re.match(r'^[0-9\.]+((a|b|rc|alpha|beta|pre)[0-9]+)?$', self.install_airflow_version):
- console.print(
- f'\n[red]ERROR: Bad value for install-airflow-version:{self.install_airflow_version}'
+ get_console().print(
+ f'\n[error]ERROR: Bad value for install-airflow-version:{self.install_airflow_version}'
)
- console.print('[red]Only numerical versions allowed for PROD image here !')
+ get_console().print('[error]Only numerical versions allowed for PROD image here !')
sys.exit()
extra_build_flags.extend(["--build-arg", "AIRFLOW_INSTALLATION_METHOD=apache-airflow"])
extra_build_flags.extend(
@@ -239,7 +239,7 @@ class BuildProdParams:
return "https://raw.githubusercontent.com/apache/airflow/main/docs/docker-stack/README.md"
def print_info(self):
- console.print(f"CI Image: {self.airflow_version} Python: {self.python}.")
+ get_console().print(f"CI Image: {self.airflow_version} Python: {self.python}.")
@property
def airflow_pre_cached_pip_packages(self) -> str:
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_tools.py b/dev/breeze/src/airflow_breeze/commands/ci_image_tools.py
index eb7ec5f667..15fd2d52f5 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_tools.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_tools.py
@@ -66,7 +66,7 @@ from airflow_breeze.commands.common_options import (
from airflow_breeze.commands.main import main
from airflow_breeze.utils.ci_group import ci_group
from airflow_breeze.utils.confirm import set_forced_answer
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.pulll_image import run_pull_image, run_pull_in_parallel
from airflow_breeze.utils.python_versions import get_python_version_list
from airflow_breeze.utils.run_tests import verify_an_image
@@ -216,7 +216,7 @@ def build_image(
verbose=verbose, dry_run=dry_run, with_ci_group=with_ci_group, ci_image_params=ci_image_params
)
if return_code != 0:
- console.print(f"[red]Error when building image! {info}")
+ get_console().print(f"[error]Error when building image! {info}")
sys.exit(return_code)
set_forced_answer(answer)
@@ -290,7 +290,7 @@ def pull_image(
poll_time=10.0,
)
if return_code != 0:
- console.print(f"[red]There was an error when pulling CI image: {info}[/]")
+ get_console().print(f"[error]There was an error when pulling CI image: {info}[/]")
sys.exit(return_code)
@@ -321,7 +321,7 @@ def verify_image(
if image_name is None:
build_params = BuildCiParams(python=python, image_tag=image_tag, github_repository=github_repository)
image_name = build_params.airflow_image_name_with_tag
- console.print(f"[bright_blue]Verifying CI image: {image_name}[/]")
+ get_console().print(f"[info]Verifying CI image: {image_name}[/]")
return_code, info = verify_an_image(
image_name=image_name,
verbose=verbose,
diff --git a/dev/breeze/src/airflow_breeze/commands/configuration_and_maintenance.py b/dev/breeze/src/airflow_breeze/commands/configuration_and_maintenance.py
index 153a11b208..a83d24c921 100644
--- a/dev/breeze/src/airflow_breeze/commands/configuration_and_maintenance.py
+++ b/dev/breeze/src/airflow_breeze/commands/configuration_and_maintenance.py
@@ -41,7 +41,7 @@ from airflow_breeze.global_constants import DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
from airflow_breeze.shell.shell_params import ShellParams
from airflow_breeze.utils.cache import check_if_cache_exists, delete_cache, touch_cache_file
from airflow_breeze.utils.confirm import Answer, set_forced_answer, user_confirm
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
check_docker_resources,
construct_env_variables_docker_compose_command,
@@ -109,6 +109,7 @@ CONFIGURATION_AND_MAINTENANCE_PARAMETERS = {
"--backend",
"--cheatsheet",
"--asciiart",
+ "--colour",
],
},
],
@@ -131,12 +132,12 @@ CONFIGURATION_AND_MAINTENANCE_PARAMETERS = {
def cleanup(verbose: bool, dry_run: bool, github_repository: str, all: bool, answer: Optional[str]):
set_forced_answer(answer)
if all:
- console.print(
- "\n[bright_yellow]Removing cache of parameters, clean up docker cache "
+ get_console().print(
+ "\n[info]Removing cache of parameters, clean up docker cache "
"and remove locally downloaded images[/]"
)
else:
- console.print("\n[bright_yellow]Removing cache of parameters, and cleans up docker cache[/]")
+ get_console().print("[info]Removing cache of parameters, and cleans up docker cache[/]")
if all:
docker_images_command_to_execute = [
'docker',
@@ -151,10 +152,10 @@ def cleanup(verbose: bool, dry_run: bool, github_repository: str, all: bool, ans
)
images = command_result.stdout.splitlines() if command_result and command_result.stdout else []
if images:
- console.print("[light_blue]Removing images:[/]")
+ get_console().print("[light_blue]Removing images:[/]")
for image in images:
- console.print(f"[light_blue] * {image}[/]")
- console.print()
+ get_console().print(f"[light_blue] * {image}[/]")
+ get_console().print()
docker_rmi_command_to_execute = [
'docker',
'rmi',
@@ -167,15 +168,15 @@ def cleanup(verbose: bool, dry_run: bool, github_repository: str, all: bool, ans
elif given_answer == Answer.QUIT:
sys.exit(0)
else:
- console.print("[light_blue]No locally downloaded images to remove[/]\n")
- console.print("Pruning docker images")
+ get_console().print("[light_blue]No locally downloaded images to remove[/]\n")
+ get_console().print("Pruning docker images")
given_answer = user_confirm("Are you sure?", timeout=None)
if given_answer == Answer.YES:
system_prune_command_to_execute = ['docker', 'system', 'prune']
run_command(system_prune_command_to_execute, verbose=verbose, dry_run=dry_run, check=False)
elif given_answer == Answer.QUIT:
sys.exit(0)
- console.print(f"Removing build cache dir ${BUILD_CACHE_DIR}")
+ get_console().print(f"Removing build cache dir ${BUILD_CACHE_DIR}")
given_answer = user_confirm("Are you sure?", timeout=None)
if given_answer == Answer.YES:
if not dry_run:
@@ -239,14 +240,14 @@ def setup_autocomplete(verbose: bool, dry_run: bool, force: bool, answer: Option
detected_shell = os.environ.get('SHELL')
detected_shell = None if detected_shell is None else detected_shell.split(os.sep)[-1]
if detected_shell not in ['bash', 'zsh', 'fish']:
- console.print(f"\n[red] The shell {detected_shell} is not supported for autocomplete![/]\n")
+ get_console().print(f"\n[error] The shell {detected_shell} is not supported for autocomplete![/]\n")
sys.exit(1)
- console.print(f"Installing {detected_shell} completion for local user")
+ get_console().print(f"Installing {detected_shell} completion for local user")
autocomplete_path = (
AIRFLOW_SOURCES_ROOT / "dev" / "breeze" / "autocomplete" / f"{NAME}-complete-{detected_shell}.sh"
)
- console.print(f"[bright_blue]Activation command script is available here: {autocomplete_path}[/]\n")
- console.print(f"[bright_yellow]We need to add above script to your {detected_shell} profile.[/]\n")
+ get_console().print(f"[info]Activation command script is available here: {autocomplete_path}[/]\n")
+ get_console().print(f"[info]We need to add above script to your {detected_shell} profile.[/]\n")
given_answer = user_confirm("Should we proceed ?", default_answer=Answer.NO, timeout=3)
if given_answer == Answer.YES:
if detected_shell == 'bash':
@@ -261,8 +262,8 @@ def setup_autocomplete(verbose: bool, dry_run: bool, force: bool, answer: Option
# Include steps for fish shell
script_path = str(Path('~').expanduser() / f'.config/fish/completions/{NAME}.fish')
if os.path.exists(script_path) and not force:
- console.print(
- "\n[bright_yellow]Autocompletion is already setup. Skipping. "
+ get_console().print(
+ "\n[warning]Autocompletion is already setup. Skipping. "
"You can force autocomplete installation by adding --force/]\n"
)
else:
@@ -278,7 +279,7 @@ def setup_autocomplete(verbose: bool, dry_run: bool, force: bool, answer: Option
command_to_execute = f". {autocomplete_path}"
write_to_shell(command_to_execute, dry_run, script_path, force)
elif given_answer == Answer.NO:
- console.print(
+ get_console().print(
"\nPlease follow the https://click.palletsprojects.com/en/8.1.x/shell-completion/ "
"to setup autocompletion for breeze manually if you want to use it.\n"
)
@@ -290,20 +291,21 @@ def setup_autocomplete(verbose: bool, dry_run: bool, force: bool, answer: Option
@main.command()
def version(verbose: bool, python: str):
"""Print information about version of apache-airflow-breeze."""
- console.print(ASCIIART, style=ASCIIART_STYLE)
- console.print(f"\n[bright_blue]Breeze version: {VERSION}[/]")
- console.print(f"[bright_blue]Breeze installed from: {get_installation_airflow_sources()}[/]")
- console.print(f"[bright_blue]Used Airflow sources : {get_used_airflow_sources()}[/]\n")
+
+ get_console().print(ASCIIART, style=ASCIIART_STYLE)
+ get_console().print(f"\n[info]Breeze version: {VERSION}[/]")
+ get_console().print(f"[info]Breeze installed from: {get_installation_airflow_sources()}[/]")
+ get_console().print(f"[info]Used Airflow sources : {get_used_airflow_sources()}[/]\n")
if verbose:
- console.print(
- f"[bright_blue]Installation sources config hash : "
+ get_console().print(
+ f"[info]Installation sources config hash : "
f"{get_installation_sources_config_metadata_hash()}[/]"
)
- console.print(
- f"[bright_blue]Used sources config hash : " f"{get_used_sources_setup_metadata_hash()}[/]"
+ get_console().print(
+ f"[info]Used sources config hash : " f"{get_used_sources_setup_metadata_hash()}[/]"
)
- console.print(
- f"[bright_blue]Package config hash : " f"{(get_package_setup_metadata_hash())}[/]\n"
+ get_console().print(
+ f"[info]Package config hash : " f"{(get_package_setup_metadata_hash())}[/]\n"
)
@@ -315,6 +317,12 @@ def version(verbose: bool, python: str):
@option_mssql_version
@click.option('-C/-c', '--cheatsheet/--no-cheatsheet', help="Enable/disable cheatsheet.", default=None)
@click.option('-A/-a', '--asciiart/--no-asciiart', help="Enable/disable ASCIIart.", default=None)
+@click.option(
+ '-B/-b',
+ '--colour/--no-colour',
+ help="Enable/disable Colour mode (useful for colour blind-friendly communication).",
+ default=None,
+)
def change_config(
python: str,
backend: str,
@@ -323,44 +331,56 @@ def change_config(
mssql_version: str,
cheatsheet: bool,
asciiart: bool,
+ colour: bool,
):
"""
Show/update configuration (Python, Backend, Cheatsheet, ASCIIART).
"""
asciiart_file = "suppress_asciiart"
cheatsheet_file = "suppress_cheatsheet"
+ colour_file = "suppress_colour"
if asciiart is not None:
if asciiart:
delete_cache(asciiart_file)
- console.print('[bright_blue]Enable ASCIIART![/]')
+ get_console().print('[info]Enable ASCIIART![/]')
else:
touch_cache_file(asciiart_file)
- console.print('[bright_blue]Disable ASCIIART![/]')
+ get_console().print('[info]Disable ASCIIART![/]')
if cheatsheet is not None:
if cheatsheet:
delete_cache(cheatsheet_file)
- console.print('[bright_blue]Enable Cheatsheet[/]')
+ get_console().print('[info]Enable Cheatsheet[/]')
elif cheatsheet is not None:
touch_cache_file(cheatsheet_file)
- console.print('[bright_blue]Disable Cheatsheet[/]')
+ get_console().print('[info]Disable Cheatsheet[/]')
+ if colour is not None:
+ if colour:
+ delete_cache(colour_file)
+ get_console().print('[info]Enable Colour[/]')
+ elif colour is not None:
+ touch_cache_file(colour_file)
+ get_console().print('[info]Disable Colour[/]')
def get_status(file: str):
return "disabled" if check_if_cache_exists(file) else "enabled"
- console.print()
- console.print("[bright_blue]Current configuration:[/]")
- console.print()
- console.print(f"[bright_blue]* Python: {python}[/]")
- console.print(f"[bright_blue]* Backend: {backend}[/]")
- console.print()
- console.print(f"[bright_blue]* Postgres version: {postgres_version}[/]")
- console.print(f"[bright_blue]* MySQL version: {mysql_version}[/]")
- console.print(f"[bright_blue]* MsSQL version: {mssql_version}[/]")
- console.print()
- console.print(f"[bright_blue]* ASCIIART: {get_status(asciiart_file)}[/]")
- console.print(f"[bright_blue]* Cheatsheet: {get_status(cheatsheet_file)}[/]")
- console.print()
+ get_console().print()
+ get_console().print("[info]Current configuration:[/]")
+ get_console().print()
+ get_console().print(f"[info]* Python: {python}[/]")
+ get_console().print(f"[info]* Backend: {backend}[/]")
+ get_console().print()
+ get_console().print(f"[info]* Postgres version: {postgres_version}[/]")
+ get_console().print(f"[info]* MySQL version: {mysql_version}[/]")
+ get_console().print(f"[info]* MsSQL version: {mssql_version}[/]")
+ get_console().print()
+ get_console().print(f"[info]* ASCIIART: {get_status(asciiart_file)}[/]")
+ get_console().print(f"[info]* Cheatsheet: {get_status(cheatsheet_file)}[/]")
+ get_console().print()
+ get_console().print()
+ get_console().print(f"[info]* Colour: {get_status(colour_file)}[/]")
+ get_console().print()
@main.command(name="free-space", help="Free space for jobs run in CI.")
@@ -426,8 +446,8 @@ def write_to_shell(command_to_execute: str, dry_run: bool, script_path: str, for
if not skip_check:
if BREEZE_COMMENT in script_path_file.read_text():
if not force_setup:
- console.print(
- "\n[bright_yellow]Autocompletion is already setup. Skipping. "
+ get_console().print(
+ "\n[warning]Autocompletion is already setup. Skipping. "
"You can force autocomplete installation by adding --force[/]\n"
)
return False
@@ -436,13 +456,13 @@ def write_to_shell(command_to_execute: str, dry_run: bool, script_path: str, for
remove_autogenerated_code(script_path)
text = ''
if script_path_file.exists():
- console.print(f"\nModifying the {script_path} file!\n")
- console.print(f"\nCopy of the original file is held in {script_path}.bak !\n")
+ get_console().print(f"\nModifying the {script_path} file!\n")
+ get_console().print(f"\nCopy of the original file is held in {script_path}.bak !\n")
if not dry_run:
backup(script_path_file)
text = script_path_file.read_text()
else:
- console.print(f"\nCreating the {script_path} file!\n")
+ get_console().print(f"\nCreating the {script_path} file!\n")
if not dry_run:
script_path_file.write_text(
text
@@ -453,10 +473,9 @@ def write_to_shell(command_to_execute: str, dry_run: bool, script_path: str, for
+ END_LINE
)
else:
- console.print(f"[bright_blue]The autocomplete script would be added to {script_path}[/]")
- console.print(
- f"\n[bright_yellow]IMPORTANT!!!! Please exit and re-enter your shell or run:[/]"
- f"\n\n source {script_path}\n"
+ get_console().print(f"[info]The autocomplete script would be added to {script_path}[/]")
+ get_console().print(
+ f"\n[warning]Please exit and re-enter your shell or run:[/]" f"\n\n source {script_path}\n"
)
return True
diff --git a/dev/breeze/src/airflow_breeze/commands/configure_rich_click.py b/dev/breeze/src/airflow_breeze/commands/configure_rich_click.py
index 2eeac20db0..1807ad3fb0 100644
--- a/dev/breeze/src/airflow_breeze/commands/configure_rich_click.py
+++ b/dev/breeze/src/airflow_breeze/commands/configure_rich_click.py
@@ -44,7 +44,7 @@ try:
click.rich_click.STYLE_ERRORS_SUGGESTION = "bright_blue italic"
click.rich_click.ERRORS_SUGGESTION = "\nTry running the '--help' flag for more information.\n"
click.rich_click.ERRORS_EPILOGUE = (
- "\nTo find out more, visit [bright_blue]https://github.com/apache/airflow/blob/main/BREEZE.rst[/]\n"
+ "\nTo find out more, visit [info]https://github.com/apache/airflow/blob/main/BREEZE.rst[/]\n"
)
click.rich_click.OPTION_GROUPS = {
**DEVELOPER_PARAMETERS,
diff --git a/dev/breeze/src/airflow_breeze/commands/custom_param_types.py b/dev/breeze/src/airflow_breeze/commands/custom_param_types.py
index 7a779865f6..4737aa2737 100644
--- a/dev/breeze/src/airflow_breeze/commands/custom_param_types.py
+++ b/dev/breeze/src/airflow_breeze/commands/custom_param_types.py
@@ -26,7 +26,7 @@ from airflow_breeze.utils.cache import (
read_from_cache_file,
write_to_cache_file,
)
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.recording import output_file_for_recording
@@ -71,8 +71,8 @@ class CacheableChoice(click.Choice):
if isinstance(value, CacheableDefault):
is_cached, new_value = read_and_validate_value_from_cache(param_name, value.value)
if not is_cached:
- console.print(
- f"\n[bright_blue]Default value of {param.name} " f"parameter {new_value} used.[/]\n"
+ get_console().print(
+ f"\n[info]Default value of {param.name} " f"parameter {new_value} used.[/]\n"
)
else:
allowed, allowed_values = check_if_values_allowed(param_name, value)
@@ -81,8 +81,8 @@ class CacheableChoice(click.Choice):
write_to_cache_file(param_name, new_value, check_allowed_values=False)
else:
new_value = allowed_values[0]
- console.print(
- f"\n[yellow]The value {value} is not allowed for parameter {param.name}. "
+ get_console().print(
+ f"\n[warning]The value {value} is not allowed for parameter {param.name}. "
f"Setting default value to {new_value}"
)
write_to_cache_file(param_name, new_value, check_allowed_values=False)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index c909821d38..e44c360b6c 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -53,7 +53,7 @@ from airflow_breeze.pre_commit_ids import PRE_COMMIT_LIST
from airflow_breeze.shell.enter_shell import enter_shell
from airflow_breeze.shell.shell_params import ShellParams
from airflow_breeze.utils.confirm import set_forced_answer
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
construct_env_variables_docker_compose_command,
get_extra_docker_flags,
@@ -221,8 +221,8 @@ def shell(
"""Enter breeze.py environment. this is the default command use when no other is selected."""
set_forced_answer(answer)
if verbose or dry_run:
- console.print("\n[green]Welcome to breeze.py[/]\n")
- console.print(f"\n[green]Root of Airflow Sources = {AIRFLOW_SOURCES_ROOT}[/]\n")
+ get_console().print("\n[success]Welcome to breeze.py[/]\n")
+ get_console().print(f"\n[success]Root of Airflow Sources = {AIRFLOW_SOURCES_ROOT}[/]\n")
enter_shell(
verbose=verbose,
dry_run=dry_run,
@@ -409,7 +409,7 @@ def static_checks(
assert_pre_commit_installed(verbose=verbose)
command_to_execute = [sys.executable, "-m", "pre_commit", 'run']
if last_commit and commit_ref:
- console.print("\n[red]You cannot specify both --last-commit and --commit-ref[/]\n")
+ get_console().print("\n[error]You cannot specify both --last-commit and --commit-ref[/]\n")
sys.exit(1)
for single_check in type:
command_to_execute.append(single_check)
@@ -439,7 +439,7 @@ def static_checks(
env=env,
)
if static_checks_result.returncode != 0:
- console.print("[red]There were errors during pre-commit check. They should be fixed[/]")
+ get_console().print("[error]There were errors during pre-commit check. They should be fixed[/]")
sys.exit(static_checks_result.returncode)
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_tools.py b/dev/breeze/src/airflow_breeze/commands/production_image_tools.py
index 06ba3142da..52fd3ec2a3 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_tools.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_tools.py
@@ -67,7 +67,7 @@ from airflow_breeze.commands.main import main
from airflow_breeze.global_constants import ALLOWED_INSTALLATION_METHODS, DEFAULT_EXTRAS
from airflow_breeze.utils.ci_group import ci_group
from airflow_breeze.utils.confirm import set_forced_answer
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.pulll_image import run_pull_image, run_pull_in_parallel
from airflow_breeze.utils.python_versions import get_python_version_list
from airflow_breeze.utils.run_tests import verify_an_image
@@ -268,7 +268,7 @@ def build_prod_image(
verbose=verbose, dry_run=dry_run, with_ci_group=with_ci_group, prod_image_params=prod_image_params
)
if return_code != 0:
- console.print(f"[red]Error when building image! {info}")
+ get_console().print(f"[error]Error when building image! {info}")
sys.exit(return_code)
set_forced_answer(answer)
@@ -344,7 +344,7 @@ def pull_prod_image(
poll_time=10.0,
)
if return_code != 0:
- console.print(f"[red]There was an error when pulling PROD image: {info}[/]")
+ get_console().print(f"[error]There was an error when pulling PROD image: {info}[/]")
sys.exit(return_code)
@@ -377,7 +377,7 @@ def verify_prod_image(
python=python, image_tag=image_tag, github_repository=github_repository
)
image_name = build_params.airflow_image_name_with_tag
- console.print(f"[bright_blue]Verifying PROD image: {image_name}[/]")
+ get_console().print(f"[info]Verifying PROD image: {image_name}[/]")
return_code, info = verify_an_image(
image_name=image_name,
verbose=verbose,
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management.py b/dev/breeze/src/airflow_breeze/commands/release_management.py
index f9fe3a3948..72e2756878 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management.py
@@ -49,7 +49,7 @@ from airflow_breeze.global_constants import (
from airflow_breeze.shell.shell_params import ShellParams
from airflow_breeze.utils.ci_group import ci_group
from airflow_breeze.utils.confirm import Answer, set_forced_answer, user_confirm
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.constraints import run_generate_constraints, run_generate_constraints_in_parallel
from airflow_breeze.utils.docker_command_utils import (
construct_env_variables_docker_compose_command,
@@ -331,8 +331,8 @@ def generate_constraints(
)
if given_answer != Answer.YES:
if run_in_parallel:
- console.print("\n[yellow]Use this command to build the images:[/]\n")
- console.print(
+ get_console().print("\n[info]Use this command to build the images:[/]\n")
+ get_console().print(
f" breeze build-image --run-in-parallel --python-versions '{python_versions}' "
f"--upgrade-to-newer-dependencies true\n"
)
@@ -340,8 +340,8 @@ def generate_constraints(
shell_params = ShellParams(
image_tag=image_tag, python=python, github_repository=github_repository, answer=answer
)
- console.print("\n[yellow]Use this command to build the image:[/]\n")
- console.print(
+ get_console().print("\n[info]Use this command to build the image:[/]\n")
+ get_console().print(
f" breeze build-image --python'{shell_params.python}' "
f"--upgrade-to-newer-dependencies true\n"
)
@@ -375,7 +375,7 @@ def generate_constraints(
generate_constraints_mode=generate_constraints_mode,
)
if return_code != 0:
- console.print(f"[red]There was an error when generating constraints: {info}[/]")
+ get_console().print(f"[error]There was an error when generating constraints: {info}[/]")
sys.exit(return_code)
diff --git a/dev/breeze/src/airflow_breeze/commands/testing.py b/dev/breeze/src/airflow_breeze/commands/testing.py
index df124749c4..456544b57f 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing.py
@@ -30,7 +30,7 @@ from airflow_breeze.commands.common_options import (
option_verbose,
)
from airflow_breeze.commands.main import main
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.run_tests import run_docker_compose_tests
TESTING_COMMANDS = {
@@ -83,7 +83,7 @@ def docker_compose_tests(
python=python, image_tag=image_tag, github_repository=github_repository
)
image_name = build_params.airflow_image_name_with_tag
- console.print(f"[bright_blue]Running docker-compose with PROD image: {image_name}[/]")
+ get_console().print(f"[info]Running docker-compose with PROD image: {image_name}[/]")
return_code, info = run_docker_compose_tests(
image_name=image_name,
verbose=verbose,
diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
index 933f85ca4d..51294d55bb 100644
--- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py
+++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
@@ -29,7 +29,7 @@ from airflow_breeze.utils.cache import (
read_from_cache_file,
write_to_cache_file,
)
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
SOURCE_OF_DEFAULT_VALUES_FOR_VARIABLES,
VARIABLES_IN_CACHE,
@@ -83,18 +83,18 @@ def enter_shell(**kwargs) -> Union[subprocess.CompletedProcess, subprocess.Calle
verbose = kwargs['verbose']
dry_run = kwargs['dry_run']
if not check_docker_is_running(verbose):
- console.print(
- '[red]Docker is not running.[/]\n'
- '[bright_yellow]Please make sure Docker is installed and running.[/]'
+ get_console().print(
+ '[error]Docker is not running.[/]\n'
+ '[warning]Please make sure Docker is installed and running.[/]'
)
sys.exit(1)
check_docker_version(verbose)
check_docker_compose_version(verbose)
updated_kwargs = synchronize_cached_params(kwargs)
if read_from_cache_file('suppress_asciiart') is None:
- console.print(ASCIIART, style=ASCIIART_STYLE)
+ get_console().print(ASCIIART, style=ASCIIART_STYLE)
if read_from_cache_file('suppress_cheatsheet') is None:
- console.print(CHEATSHEET, style=CHEATSHEET_STYLE)
+ get_console().print(CHEATSHEET, style=CHEATSHEET_STYLE)
enter_shell_params = ShellParams(**filter_out_none(**updated_kwargs))
return run_shell_with_build_image_checks(verbose, dry_run, enter_shell_params)
@@ -122,10 +122,10 @@ def run_shell_with_build_image_checks(
)
ci_image_params = BuildCiParams(python=shell_params.python, upgrade_to_newer_dependencies="false")
if build_ci_image_check_cache.exists():
- console.print(f'[bright_blue]{shell_params.the_image_type} image already built locally.[/]')
+ get_console().print(f'[info]{shell_params.the_image_type} image already built locally.[/]')
else:
- console.print(
- f'[bright_yellow]{shell_params.the_image_type} image not built locally. ' f'Forcing build.[/]'
+ get_console().print(
+ f'[warning]{shell_params.the_image_type} image not built locally. Forcing build.[/]'
)
ci_image_params.force_build = True
diff --git a/dev/breeze/src/airflow_breeze/shell/shell_params.py b/dev/breeze/src/airflow_breeze/shell/shell_params.py
index eb4ae34a7a..7d7f1daf53 100644
--- a/dev/breeze/src/airflow_breeze/shell/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/shell/shell_params.py
@@ -31,7 +31,7 @@ from airflow_breeze.global_constants import (
MOUNT_SELECTED,
get_airflow_version,
)
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, BUILD_CACHE_DIR, SCRIPTS_CI_DIR
from airflow_breeze.utils.run_utils import get_filesystem_type, run_command
@@ -143,13 +143,13 @@ class ShellParams:
return sqlite_url
def print_badge_info(self):
- console.print(f'Use {self.the_image_type} image')
- console.print(f'Branch Name: {self.airflow_branch}')
- console.print(f'Docker Image: {self.airflow_image_name_with_tag}')
- console.print(f'Airflow source version:{self.airflow_version}')
- console.print(f'Python Version: {self.python}')
- console.print(f'Backend: {self.backend} {self.backend_version}')
- console.print(f'Airflow used at runtime: {self.use_airflow_version}')
+ get_console().print(f'Use {self.the_image_type} image')
+ get_console().print(f'Branch Name: {self.airflow_branch}')
+ get_console().print(f'Docker Image: {self.airflow_image_name_with_tag}')
+ get_console().print(f'Airflow source version:{self.airflow_version}')
+ get_console().print(f'Python Version: {self.python}')
+ get_console().print(f'Backend: {self.backend} {self.backend_version}')
+ get_console().print(f'Airflow used at runtime: {self.use_airflow_version}')
@property
def compose_files(self):
diff --git a/dev/breeze/src/airflow_breeze/utils/cache.py b/dev/breeze/src/airflow_breeze/utils/cache.py
index 2319ee4505..19b0fae0bd 100644
--- a/dev/breeze/src/airflow_breeze/utils/cache.py
+++ b/dev/breeze/src/airflow_breeze/utils/cache.py
@@ -27,7 +27,7 @@ from pathlib import Path
from typing import Any, List, Optional, Tuple
from airflow_breeze import global_constants
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import BUILD_CACHE_DIR
@@ -64,9 +64,9 @@ def write_to_cache_file(param_name: str, param_value: str, check_allowed_values:
cache_path.parent.mkdir(parents=True, exist_ok=True)
cache_path.write_text(param_value)
else:
- console.print(f'[cyan]You have sent the {param_value} for {param_name}')
- console.print(f'[cyan]Allowed value for the {param_name} are {allowed_values}')
- console.print('[cyan]Provide one of the supported params. Write to cache dir failed')
+ get_console().print(f'[cyan]You have sent the {param_value} for {param_name}')
+ get_console().print(f'[cyan]Allowed value for the {param_name} are {allowed_values}')
+ get_console().print('[cyan]Provide one of the supported params. Write to cache dir failed')
sys.exit(1)
diff --git a/dev/breeze/src/airflow_breeze/utils/console.py b/dev/breeze/src/airflow_breeze/utils/console.py
index ca5a4a3096..9a14d91eae 100644
--- a/dev/breeze/src/airflow_breeze/utils/console.py
+++ b/dev/breeze/src/airflow_breeze/utils/console.py
@@ -19,24 +19,49 @@ Console used by all processes. We are forcing colors and terminal output as Bree
to be only run in CI or real development terminal - in both cases we want to have colors on.
"""
import os
+from functools import lru_cache
-try:
- from rich.console import Console
- from rich.theme import Theme
+from rich.console import Console
+from rich.theme import Theme
- recording_width = os.environ.get("RECORD_BREEZE_WIDTH")
- recording_file = os.environ.get("RECORD_BREEZE_OUTPUT_FILE")
+recording_width = os.environ.get("RECORD_BREEZE_WIDTH")
+recording_file = os.environ.get("RECORD_BREEZE_OUTPUT_FILE")
- custom_theme = Theme({"info": "blue", "warning": "magenta", "error": "red"})
- console = Console(
+
+def get_theme() -> Theme:
+ try:
+ from airflow_breeze.utils.cache import read_from_cache_file
+
+ if read_from_cache_file('suppress_colour') is not None:
+ return Theme(
+ {
+ "success": "bold italic",
+ "info": "bold",
+ "warning": "italic",
+ "error": "italic underline",
+ }
+ )
+ except ImportError:
+ # sometimes we might want to use console before the cache folder is determined
+ # and in this case we will get an import error due to partial initialization.
+ # in this case we switch to default theme
+ pass
+ return Theme(
+ {
+ "success": "green",
+ "info": "bright_blue",
+ "warning": "bright_yellow",
+ "error": "red",
+ }
+ )
+
+
+@lru_cache(maxsize=None)
+def get_console() -> Console:
+ return Console(
force_terminal=True,
color_system="standard",
width=180 if not recording_width else int(recording_width),
- theme=custom_theme,
+ theme=get_theme(),
record=True if recording_file else False,
)
-
-except ImportError:
- # We handle the ImportError so that autocomplete works with just click installed
- custom_theme = None # type: ignore[assignment]
- console = None # type: ignore[assignment]
diff --git a/dev/breeze/src/airflow_breeze/utils/constraints.py b/dev/breeze/src/airflow_breeze/utils/constraints.py
index e8b28ca7dd..779b0d4924 100644
--- a/dev/breeze/src/airflow_breeze/utils/constraints.py
+++ b/dev/breeze/src/airflow_breeze/utils/constraints.py
@@ -19,7 +19,7 @@ import multiprocessing as mp
from typing import List, Tuple
from airflow_breeze.shell.shell_params import ShellParams
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.docker_command_utils import (
construct_env_variables_docker_compose_command,
get_extra_docker_flags,
@@ -63,8 +63,8 @@ def run_generate_constraints_in_parallel(
verbose: bool,
):
"""Run generate constraints in parallel"""
- console.print(
- f"\n[bright_blue]Generating constraints with parallelism = {parallelism} "
+ get_console().print(
+ f"\n[info]Generating constraints with parallelism = {parallelism} "
f"for the constraints: {python_version_list}[/]"
)
pool = mp.Pool(parallelism)
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 b6a0c7f20f..4598a6ce97 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -51,7 +51,7 @@ from airflow_breeze.global_constants import (
SSH_PORT,
WEBSERVER_HOST_PORT,
)
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.run_utils import commit_sha, prepare_build_command, run_command
NECESSARY_HOST_VOLUMES = [
@@ -101,7 +101,7 @@ def get_extra_docker_flags(mount_sources: str) -> List[str]:
for flag in NECESSARY_HOST_VOLUMES:
extra_docker_flags.extend(["-v", str(AIRFLOW_SOURCES_ROOT) + flag])
else: # none
- console.print('[bright_blue]Skip mounting host volumes to Docker[/]')
+ get_console().print('[info]Skip mounting host volumes to Docker[/]')
extra_docker_flags.extend(["-v", f"{AIRFLOW_SOURCES_ROOT}/files:/files"])
extra_docker_flags.extend(["-v", f"{AIRFLOW_SOURCES_ROOT}/dist:/dist"])
extra_docker_flags.extend(["--rm"])
@@ -159,8 +159,10 @@ def check_docker_permission_denied(verbose) -> bool:
if command_result.returncode != 0:
permission_denied = True
if command_result.stdout and 'Got permission denied while trying to connect' in command_result.stdout:
- console.print('ERROR: You have `permission denied` error when trying to communicate with docker.')
- console.print(
+ get_console().print(
+ 'ERROR: You have `permission denied` error when trying to communicate with docker.'
+ )
+ get_console().print(
'Most likely you need to add your user to `docker` group: \
https://docs.docker.com/ engine/install/linux-postinstall/ .'
)
@@ -215,20 +217,21 @@ def check_docker_version(verbose: bool):
if docker_version_result.returncode == 0:
docker_version = docker_version_result.stdout.strip()
if docker_version == '':
- console.print(
+ get_console().print(
f"""
-[yellow]Your version of docker is unknown. If the scripts fail, please make sure to[/]
-[yellow]install docker at least: {MIN_DOCKER_VERSION} version.[/]
+[warning]Your version of docker is unknown. If the scripts fail, please make sure to[/]
+[warning]install docker at least: {MIN_DOCKER_VERSION} version.[/]
"""
)
else:
good_version = compare_version(docker_version, MIN_DOCKER_VERSION)
if good_version:
- console.print(f'[green]Good version of Docker: {docker_version}.[/]')
+ get_console().print(f'[success]Good version of Docker: {docker_version}.[/]')
else:
- console.print(
+ get_console().print(
f"""
-[yellow]Your version of docker is too old:{docker_version}. Please upgrade to at least {MIN_DOCKER_VERSION}[/]
+[warning]Your version of docker is too old:{docker_version}.
+Please upgrade to at least {MIN_DOCKER_VERSION}[/]
"""
)
@@ -257,24 +260,24 @@ def check_docker_compose_version(verbose: bool):
version = '.'.join(version_extracted.groups())
good_version = compare_version(version, MIN_DOCKER_COMPOSE_VERSION)
if good_version:
- console.print(f'[green]Good version of docker-compose: {version}[/]')
+ get_console().print(f'[success]Good version of docker-compose: {version}[/]')
else:
- console.print(
+ get_console().print(
f"""
-[yellow]You have too old version of docker-compose: {version}! At least 1.29 is needed! Please upgrade!
+[warning]You have too old version of docker-compose: {version}! At least 1.29 is needed! Please upgrade!
"""
)
- console.print(
+ get_console().print(
"""
See https://docs.docker.com/compose/install/ for instructions.
Make sure docker-compose you install is first on the PATH variable of yours.
"""
)
else:
- console.print(
+ get_console().print(
"""
-[yellow]Unknown docker-compose version. At least 1.29 is needed![/]
-[yellow]If Breeze fails upgrade to latest available docker-compose version.[/]
+[warning]Unknown docker-compose version. At least 1.29 is needed![/]
+[warning]If Breeze fails upgrade to latest available docker-compose version.[/]
"""
)
@@ -376,8 +379,8 @@ def tag_and_push_image(
:param verbose: whethere we produce verbose output
:return:
"""
- console.print(
- f"[blue]Tagging and pushing the {image_params.airflow_image_name} as "
+ get_console().print(
+ f"[info]Tagging and pushing the {image_params.airflow_image_name} as "
f"{image_params.airflow_image_name_with_tag}.[/]"
)
cmd = construct_docker_tag_command(image_params)
diff --git a/dev/breeze/src/airflow_breeze/utils/find_newer_dependencies.py b/dev/breeze/src/airflow_breeze/utils/find_newer_dependencies.py
index 17d577a090..f4c37d9f22 100644
--- a/dev/breeze/src/airflow_breeze/utils/find_newer_dependencies.py
+++ b/dev/breeze/src/airflow_breeze/utils/find_newer_dependencies.py
@@ -32,10 +32,9 @@ import json
from datetime import timedelta
from typing import Any, Dict, List, Tuple
-from rich.console import Console
from rich.progress import Progress
-console = Console(width=400, color_system="standard")
+from airflow_breeze.utils.console import get_console
def find_newer_dependencies(
@@ -58,12 +57,12 @@ def find_newer_dependencies(
min_date = (pendulum.now(tz=tz) - timedelta(days=max_age)).replace(
hour=0, minute=0, second=0, microsecond=0
)
- console.print(
- "\n[bright_yellow]Those are possible candidates that broke current "
+ get_console().print(
+ "\n[info]Those are possible candidates that broke current "
"`pip` resolution mechanisms by falling back to long backtracking[/]\n"
)
- console.print(f"\n[bright_yellow]We are limiting to packages updated after {min_date} ({timezone})[/]\n")
- with Progress(console=console) as progress:
+ get_console().print(f"\n[info]We are limiting to packages updated after {min_date} ({timezone})[/]\n")
+ with Progress(console=get_console()) as progress:
task = progress.add_task(f"Processing {count_packages} packages.", total=count_packages)
for package_line in package_lines:
package, _, constraints_package_version_string = package_line.split("=")
@@ -79,17 +78,17 @@ def find_newer_dependencies(
constrained_packages[package] = constraints_package_version
progress.advance(task)
progress.refresh()
- console.print(
- "\n[bright_yellow]If you see long running builds with `pip` backtracking, you should follow[/]"
+ get_console().print(
+ "\n[warning]If you see long running builds with `pip` backtracking, you should follow[/]"
)
- console.print(
- "[bright_yellow]https://github.com/apache/airflow/blob/main/dev/TRACKING_BACKTRACKING_ISSUES.md[/]\n"
+ get_console().print(
+ "[warning]https://github.com/apache/airflow/blob/main/dev/TRACKING_BACKTRACKING_ISSUES.md[/]\n"
)
constraint_string = ""
for package, constrained_version in constrained_packages.items():
constraint_string += f' "{package}=={constrained_version}"'
- console.print("[bright_yellow]Use the following pip install command (see the doc above for details)\n")
- console.print(
+ get_console().print("[info]Use the following pip install command (see the doc above for details)\n")
+ get_console().print(
'pip install ".[devel_all]" --upgrade --upgrade-strategy eager '
'"dill<0.3.3" "certifi<2021.0.0" "google-ads<14.0.1"' + constraint_string,
markup=False,
diff --git a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
index 5d445a207f..d0933e3c2c 100644
--- a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
+++ b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
@@ -22,7 +22,7 @@ from pathlib import Path
from typing import List, Tuple
from airflow_breeze.global_constants import FILES_FOR_REBUILD_CHECK
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
@@ -96,15 +96,17 @@ def md5sum_check_if_build_is_needed(md5sum_cache_dir: Path) -> bool:
build_needed = False
modified_files, not_modified_files = calculate_md5_checksum_for_files(md5sum_cache_dir, update=False)
if len(modified_files) > 0:
- console.print(
- '[bright_yellow]The following files are modified since last time image was built: [/]\n\n'
+ get_console().print(
+ '[warning]The following files are modified since last time image was built: [/]\n\n'
)
for file in modified_files:
- console.print(f" * [bright_blue]{file}[/]")
- console.print('\n[bright_yellow]Likely CI image needs rebuild[/]\n')
+ get_console().print(f" * [info]{file}[/]")
+ get_console().print('\n[warning]Likely CI image needs rebuild[/]\n')
build_needed = True
else:
- console.print('Docker image build is not needed for CI build as no important files are changed!')
+ get_console().print(
+ 'Docker image build is not needed for CI build as no important files are changed!'
+ )
return build_needed
diff --git a/dev/breeze/src/airflow_breeze/utils/parallel.py b/dev/breeze/src/airflow_breeze/utils/parallel.py
index 565a1a52c9..211824d019 100644
--- a/dev/breeze/src/airflow_breeze/utils/parallel.py
+++ b/dev/breeze/src/airflow_breeze/utils/parallel.py
@@ -20,7 +20,7 @@ import time
from multiprocessing.pool import ApplyResult
from typing import List
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
def print_async_summary(completed_list: List[ApplyResult]) -> None:
@@ -29,14 +29,14 @@ def print_async_summary(completed_list: List[ApplyResult]) -> None:
:param completed_list: list of completed async results.
"""
completed_list.sort(key=lambda x: x.get()[1])
- console.print()
+ get_console().print()
for result in completed_list:
return_code, info = result.get()
if return_code != 0:
- console.print(f"[red]NOK[/] for {info}: Return code: {return_code}.")
+ get_console().print(f"[error]NOK[/] for {info}: Return code: {return_code}.")
else:
- console.print(f"[green]OK [/] for {info}.")
- console.print()
+ get_console().print(f"[success]OK [/] for {info}.")
+ get_console().print()
def get_completed_result_list(results: List[ApplyResult]) -> List[ApplyResult]:
@@ -57,16 +57,16 @@ def check_async_run_results(results: List[ApplyResult], poll_time: float = 0.2):
current_completed_number = len(completed_list)
if current_completed_number != completed_number:
completed_number = current_completed_number
- console.print(
- f"\n[bright_blue]Completed {completed_number} out of {total_number_of_results} "
+ get_console().print(
+ f"\n[info]Completed {completed_number} out of {total_number_of_results} "
f"({int(100*completed_number/total_number_of_results)}%).[/]\n"
)
print_async_summary(completed_list)
time.sleep(poll_time)
completed_list = get_completed_result_list(results)
completed_number = len(completed_list)
- console.print(
- f"\n[bright_blue]Completed {completed_number} out of {total_number_of_results} "
+ get_console().print(
+ f"\n[info]Completed {completed_number} out of {total_number_of_results} "
f"({int(100*completed_number/total_number_of_results)}%).[/]\n"
)
print_async_summary(completed_list)
@@ -75,7 +75,7 @@ def check_async_run_results(results: List[ApplyResult], poll_time: float = 0.2):
if result.get()[0] != 0:
errors = True
if errors:
- console.print("\n[red]There were errors when running some tasks. Quitting.[/]\n")
+ get_console().print("\n[error]There were errors when running some tasks. Quitting.[/]\n")
sys.exit(1)
else:
- console.print("\n[green]All images are OK.[/]\n")
+ get_console().print("\n[success]All images are OK.[/]\n")
diff --git a/dev/breeze/src/airflow_breeze/utils/path_utils.py b/dev/breeze/src/airflow_breeze/utils/path_utils.py
index b61fb59e20..d3003305f8 100644
--- a/dev/breeze/src/airflow_breeze/utils/path_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/path_utils.py
@@ -26,7 +26,7 @@ from pathlib import Path
from typing import Optional
from airflow_breeze import NAME
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.reinstall import (
ask_to_reinstall_breeze,
warn_dependencies_changed,
@@ -200,9 +200,9 @@ def find_airflow_sources_root_to_operate_on() -> Path:
"""
installation_airflow_sources = get_installation_airflow_sources()
if installation_airflow_sources is None and not skip_upgrade_check():
- console.print(
- "\n[red]Breeze should only be installed with -e flag[/]\n\n"
- "[bright_yellow]Please go to Airflow sources and run[/]\n\n"
+ get_console().print(
+ "\n[error]Breeze should only be installed with -e flag[/]\n\n"
+ "[warning]Please go to Airflow sources and run[/]\n\n"
f" {NAME} self-upgrade --force\n"
)
sys.exit(1)
diff --git a/dev/breeze/src/airflow_breeze/utils/pulll_image.py b/dev/breeze/src/airflow_breeze/utils/pulll_image.py
index a60a3b15e2..357fa1b77e 100644
--- a/dev/breeze/src/airflow_breeze/utils/pulll_image.py
+++ b/dev/breeze/src/airflow_breeze/utils/pulll_image.py
@@ -21,7 +21,7 @@ from typing import List, Tuple, Union
from airflow_breeze.build_image.ci.build_ci_params import BuildCiParams
from airflow_breeze.build_image.prod.build_prod_params import BuildProdParams
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.parallel import check_async_run_results
from airflow_breeze.utils.run_tests import verify_an_image
from airflow_breeze.utils.run_utils import run_command
@@ -39,8 +39,8 @@ def run_pull_in_parallel(
extra_pytest_args: Tuple,
):
"""Run image pull in parallel"""
- console.print(
- f"\n[bright_blue]Pulling with parallelism = {parallelism} for the images: {python_version_list}:"
+ get_console().print(
+ f"\n[info]Pulling with parallelism = {parallelism} for the images: {python_version_list}:"
)
pool = mp.Pool(parallelism)
poll_time = 10.0
@@ -89,8 +89,8 @@ def run_pull_image(
:param poll_time: what's the polling time between checks if images are there
:return: Tuple of return code and description of the image pulled
"""
- console.print(
- f"\n[bright_blue]Pulling {image_params.the_image_type} image of airflow python version: "
+ get_console().print(
+ f"\n[info]Pulling {image_params.the_image_type} image of airflow python version: "
f"{image_params.python} image: {image_params.airflow_image_name_with_tag} "
f"with wait for image: {wait_for_image}[/]\n"
)
@@ -115,10 +115,12 @@ def run_pull_image(
if command_result.returncode == 0:
image_size = int(command_result.stdout.strip())
if image_size == 0:
- console.print("\n[red]The image size was 0 - image creation failed.[/]\n")
+ get_console().print("\n[error]The image size was 0 - image creation failed.[/]\n")
return 1, f"Image Python {image_params.python}"
else:
- console.print("\n[red]There was an error pulling the size of the image. Failing.[/]\n")
+ get_console().print(
+ "\n[error]There was an error pulling the size of the image. Failing.[/]\n"
+ )
return (
command_result.returncode,
f"Image Python {image_params.python}",
@@ -139,11 +141,13 @@ def run_pull_image(
return command_result.returncode, f"Image Python {image_params.python}"
if wait_for_image:
if verbose or dry_run:
- console.print(f"\n[bright_blue]Waiting for {poll_time} seconds.[/]\n")
+ get_console().print(f"\n[info]Waiting for {poll_time} seconds.[/]\n")
time.sleep(poll_time)
continue
else:
- console.print(f"\n[red]There was an error pulling the image {image_params.python}. Failing.[/]\n")
+ get_console().print(
+ f"\n[error]There was an error pulling the image {image_params.python}. Failing.[/]\n"
+ )
return command_result.returncode, f"Image Python {image_params.python}"
@@ -160,7 +164,9 @@ def run_pull_and_verify_image(
image_params, dry_run, verbose, wait_for_image, tag_as_latest, poll_time
)
if return_code != 0:
- console.print(f"\n[red]Not running verification for {image_params.python} as pulling failed.[/]\n")
+ get_console().print(
+ f"\n[error]Not running verification for {image_params.python} as pulling failed.[/]\n"
+ )
return verify_an_image(
image_name=image_params.airflow_image_name_with_tag,
image_type=image_params.the_image_type,
diff --git a/dev/breeze/src/airflow_breeze/utils/python_versions.py b/dev/breeze/src/airflow_breeze/utils/python_versions.py
index e3e7523454..658d2a6958 100644
--- a/dev/breeze/src/airflow_breeze/utils/python_versions.py
+++ b/dev/breeze/src/airflow_breeze/utils/python_versions.py
@@ -19,7 +19,7 @@ import sys
from typing import List
from airflow_breeze.global_constants import ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
def get_python_version_list(python_versions: str) -> List[str]:
@@ -32,10 +32,12 @@ def get_python_version_list(python_versions: str) -> List[str]:
errors = False
for python in python_version_list:
if python not in ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS:
- console.print(f"[red]The Python version {python} passed in {python_versions} is wrong.[/]")
+ get_console().print(
+ f"[error]The Python version {python} passed in {python_versions} is wrong.[/]"
+ )
errors = True
if errors:
- console.print(
+ get_console().print(
f"\nSome of the Python versions passed are not in the "
f"list: {ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS}. Quitting.\n"
)
diff --git a/dev/breeze/src/airflow_breeze/utils/registry.py b/dev/breeze/src/airflow_breeze/utils/registry.py
index 4eac7be01a..7c2e8a6fdb 100644
--- a/dev/breeze/src/airflow_breeze/utils/registry.py
+++ b/dev/breeze/src/airflow_breeze/utils/registry.py
@@ -20,7 +20,7 @@ from typing import Tuple, Union
from airflow_breeze.build_image.ci.build_ci_params import BuildCiParams
from airflow_breeze.build_image.prod.build_prod_params import BuildProdParams
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.run_utils import run_command
@@ -36,10 +36,10 @@ def login_to_docker_registry(
"""
if os.environ.get("CI"):
if len(image_params.github_token) == 0:
- console.print("\n[bright_blue]Skip logging in to GitHub Registry. No Token available!")
+ get_console().print("\n[info]Skip logging in to GitHub Registry. No Token available!")
elif image_params.login_to_github_registry != "true":
- console.print(
- "\n[bright_blue]Skip logging in to GitHub Registry.\
+ get_console().print(
+ "\n[info]Skip logging in to GitHub Registry.\
LOGIN_TO_GITHUB_REGISTRY is set as false"
)
elif len(image_params.github_token) > 0:
@@ -60,5 +60,5 @@ def login_to_docker_registry(
)
return command_result.returncode, "Docker login"
else:
- console.print('\n[bright_blue]Skip Login to GitHub Container Registry as token is missing')
+ get_console().print('\n[info]Skip Login to GitHub Container Registry as token is missing')
return 0, "Docker login skipped"
diff --git a/dev/breeze/src/airflow_breeze/utils/reinstall.py b/dev/breeze/src/airflow_breeze/utils/reinstall.py
index 7854fc9474..ca869fd643 100644
--- a/dev/breeze/src/airflow_breeze/utils/reinstall.py
+++ b/dev/breeze/src/airflow_breeze/utils/reinstall.py
@@ -21,7 +21,7 @@ from pathlib import Path
from airflow_breeze import NAME
from airflow_breeze.utils.confirm import Answer, user_confirm
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
def reinstall_breeze(breeze_sources: Path):
@@ -32,11 +32,11 @@ def reinstall_breeze(breeze_sources: Path):
# Note that we cannot use `pipx upgrade` here because we sometimes install
# Breeze from different sources than originally installed (i.e. when we reinstall airflow
# From the current directory.
- console.print(f"\n[bright_blue]Reinstalling Breeze from {breeze_sources}\n")
+ get_console().print(f"\n[info]Reinstalling Breeze from {breeze_sources}\n")
subprocess.check_call(["pipx", "install", "-e", str(breeze_sources), "--force"])
- console.print(
- f"\n[bright_blue]Breeze has been reinstalled from {breeze_sources}. Exiting now.[/]\n\n"
- f"[bright_yellow]Please run your command again[/]\n"
+ get_console().print(
+ f"\n[info]Breeze has been reinstalled from {breeze_sources}. Exiting now.[/]\n\n"
+ f"[warning]Please run your command again[/]\n"
)
sys.exit(0)
@@ -58,30 +58,30 @@ def ask_to_reinstall_breeze(breeze_sources: Path):
def warn_non_editable():
- console.print(
- "\n[red]Breeze is installed in a wrong way.[/]\n"
- "\n[red]It should only be installed in editable mode[/]\n\n"
- "[bright_yellow]Please go to Airflow sources and run[/]\n\n"
+ get_console().print(
+ "\n[error]Breeze is installed in a wrong way.[/]\n"
+ "\n[error]It should only be installed in editable mode[/]\n\n"
+ "[info]Please go to Airflow sources and run[/]\n\n"
f" {NAME} self-upgrade --force --use-current-airflow-sources\n"
)
def warn_different_location(installation_airflow_sources: Path, current_airflow_sources: Path):
- console.print(
- f"\n[bright_yellow]WARNING! Breeze was installed from "
+ get_console().print(
+ f"\n[warning]Breeze was installed from "
f"different location![/]\n\n"
f"Breeze installed from : {installation_airflow_sources}\n"
f"Current Airflow sources : {current_airflow_sources}\n\n"
- f"[bright_yellow]This might cause various problems!![/]\n\n"
+ f"[warning]This might cause various problems!![/]\n\n"
f"If you experience problems - reinstall Breeze with:\n\n"
f" {NAME} self-upgrade --force --use-current-airflow-sources\n\n"
)
def warn_dependencies_changed():
- console.print(
- f"\n[bright_yellow]WARNING! Breeze dependencies changed since the installation![/]\n\n"
- f"[bright_yellow]This might cause various problems!![/]\n\n"
+ get_console().print(
+ f"\n[warning]Breeze dependencies changed since the installation![/]\n\n"
+ f"[warning]This might cause various problems!![/]\n\n"
f"If you experience problems - reinstall Breeze with:\n\n"
f" {NAME} self-upgrade --force\n\n"
)
diff --git a/dev/breeze/src/airflow_breeze/utils/run_tests.py b/dev/breeze/src/airflow_breeze/utils/run_tests.py
index b8b0a2276f..63c507afe4 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_tests.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_tests.py
@@ -20,7 +20,7 @@ import sys
from subprocess import DEVNULL
from typing import Tuple
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
from airflow_breeze.utils.run_utils import run_command
@@ -32,7 +32,9 @@ def verify_an_image(
["docker", "inspect", image_name], dry_run=dry_run, verbose=verbose, check=False, stdout=DEVNULL
)
if command_result.returncode != 0:
- console.print(f"[red]Error when inspecting {image_type} image: {command_result.returncode}[/]")
+ get_console().print(
+ f"[error]Error when inspecting {image_type} image: {command_result.returncode}[/]"
+ )
return command_result.returncode, f"Testing {image_type} python {image_name}"
pytest_args = ("-n", "auto", "--color=yes")
if image_type == 'PROD':
@@ -58,7 +60,7 @@ def run_docker_compose_tests(
["docker", "inspect", image_name], dry_run=dry_run, verbose=verbose, check=False, stdout=DEVNULL
)
if command_result.returncode != 0:
- console.print(f"[red]Error when inspecting PROD image: {command_result.returncode}[/]")
+ get_console().print(f"[error]Error when inspecting PROD image: {command_result.returncode}[/]")
return command_result.returncode, f"Testing docker-compose python with {image_name}"
pytest_args = ("-n", "auto", "--color=yes")
test_path = AIRFLOW_SOURCES_ROOT / "docker_tests" / "test_docker_compose_quick_start.py"
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 6ef639862a..cc2d679584 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -26,7 +26,7 @@ from functools import lru_cache
from pathlib import Path
from typing import List, Mapping, Optional, Union
-from airflow_breeze.utils.console import console
+from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
@@ -70,9 +70,9 @@ def run_command(
env_to_print = ' '.join(f'{key}="{val}"' for (key, val) in env.items()) if env else ''
if env_to_print:
env_to_print += ' '
- console.print(f"\n[bright_blue]Working directory {workdir} [/]\n")
+ get_console().print(f"\n[info]Working directory {workdir} [/]\n")
# Soft wrap allows to copy&paste and run resulting output as it has no hard EOL
- console.print(f"\n[bright_blue]{env_to_print}{command_to_print}[/]\n", soft_wrap=True)
+ get_console().print(f"\n[info]{env_to_print}{command_to_print}[/]\n", soft_wrap=True)
if dry_run:
return subprocess.CompletedProcess(cmd, returncode=0)
try:
@@ -83,13 +83,21 @@ def run_command(
except subprocess.CalledProcessError as ex:
if not no_output_dump_on_exception:
if ex.stdout:
- console.print("[blue]========================= OUTPUT start ============================[/]")
- console.print(ex.stdout)
- console.print("[blue]========================= OUTPUT end ==============================[/]")
+ get_console().print(
+ "[info]========================= OUTPUT start ============================[/]"
+ )
+ get_console().print(ex.stdout)
+ get_console().print(
+ "[info]========================= OUTPUT end ==============================[/]"
+ )
if ex.stderr:
- console.print("[red]========================= STDERR start ============================[/]")
- console.print(ex.stderr)
- console.print("[red]========================= STDERR end ==============================[/]")
+ get_console().print(
+ "[error]========================= STDERR start ============================[/]"
+ )
+ get_console().print(ex.stderr)
+ get_console().print(
+ "[error]========================= STDERR end ==============================[/]"
+ )
if check:
raise
return ex
@@ -108,7 +116,7 @@ def assert_pre_commit_installed(verbose: bool):
min_pre_commit_version = pre_commit_config["minimum_pre_commit_version"]
python_executable = sys.executable
- console.print(f"[bright_blue]Checking pre-commit installed for {python_executable}[/]")
+ get_console().print(f"[info]Checking pre-commit installed for {python_executable}[/]")
command_result = run_command(
[python_executable, "-m", "pre_commit", "--version"],
verbose=verbose,
@@ -120,25 +128,24 @@ def assert_pre_commit_installed(verbose: bool):
if command_result.stdout:
pre_commit_version = command_result.stdout.split(" ")[-1].strip()
if StrictVersion(pre_commit_version) >= StrictVersion(min_pre_commit_version):
- console.print(
- f"\n[green]Package pre_commit is installed. "
+ get_console().print(
+ f"\n[success]Package pre_commit is installed. "
f"Good version {pre_commit_version} (>= {min_pre_commit_version})[/]\n"
)
else:
- console.print(
- f"\n[red]Package name pre_commit version is wrong. It should be"
+ get_console().print(
+ f"\n[error]Package name pre_commit version is wrong. It should be"
f"aat least {min_pre_commit_version} and is {pre_commit_version}.[/]\n\n"
)
sys.exit(1)
else:
- console.print(
- "\n[bright_yellow]Could not determine version of pre-commit. "
- "You might need to update it![/]\n"
+ get_console().print(
+ "\n[warning]Could not determine version of pre-commit. " "You might need to update it![/]\n"
)
else:
- console.print("\n[red]Error checking for pre-commit-installation:[/]\n")
- console.print(command_result.stderr)
- console.print("\nMake sure to run:\n breeze self-upgrade\n\n")
+ get_console().print("\n[error]Error checking for pre-commit-installation:[/]\n")
+ get_console().print(command_result.stderr)
+ get_console().print("\nMake sure to run:\n breeze self-upgrade\n\n")
sys.exit(1)
@@ -164,8 +171,8 @@ def get_filesystem_type(filepath):
def instruct_build_image(python: str):
"""Print instructions to the user that they should build the image"""
- console.print(f'[bright_yellow]\nThe CI image for ' f'python version {python} may be outdated[/]\n')
- print(f"\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze build-image --python {python}\n\n")
+ get_console().print(f'[warning]\nThe CI image for ' f'python version {python} may be outdated[/]\n')
+ print(f"\n[info]Please run at the earliest convenience:[/]\n\nbreeze build-image --python {python}\n\n")
@contextlib.contextmanager
@@ -206,7 +213,7 @@ def change_directory_permission(directory_to_fix: Path):
@working_directory(AIRFLOW_SOURCES_ROOT)
def fix_group_permissions():
"""Fixes permissions of all the files and directories that have group-write access."""
- console.print("[bright_blue]Fixing group permissions[/]")
+ get_console().print("[info]Fixing group permissions[/]")
files_to_fix_result = run_command(['git', 'ls-files', './'], capture_output=True, text=True)
if files_to_fix_result.returncode == 0:
files_to_fix = files_to_fix_result.stdout.strip().split('\n')
@@ -288,11 +295,11 @@ def prepare_build_command(prepare_buildx_cache: bool, verbose: bool) -> List[str
build_command_param.extend(["buildx", "build", "--builder", "default", "--progress=tty"])
else:
if prepare_buildx_cache:
- console.print(
- '\n[red] Buildx cli plugin is not available and you need it to prepare buildx cache. \n'
+ get_console().print(
+ '\n[error] Buildx cli plugin is not available and you need it to prepare buildx cache. \n'
)
- console.print(
- '[red] Please install it following https://docs.docker.com/buildx/working-with-buildx/ \n'
+ get_console().print(
+ '[error] Please install it following https://docs.docker.com/buildx/working-with-buildx/ \n'
)
sys.exit(1)
build_command_param.append("build")
diff --git a/dev/breeze/src/airflow_breeze/utils/visuals.py b/dev/breeze/src/airflow_breeze/utils/visuals.py
index effbdd27ae..b5db534514 100644
--- a/dev/breeze/src/airflow_breeze/utils/visuals.py
+++ b/dev/breeze/src/airflow_breeze/utils/visuals.py
@@ -74,9 +74,9 @@ ASCIIART = """
"""
CHEATSHEET = f"""
- [bold][bright_blue]Airflow Breeze Cheatsheet[/][/]
+ [bold][info]Airflow Breeze Cheatsheet[/][/]
- [bright_blue]* Port forwarding:[/]
+ [info]* Port forwarding:[/]
Ports are forwarded to the running docker containers for webserver and database
* {SSH_PORT} -> forwarded to Airflow ssh server -> airflow:22
@@ -98,7 +98,7 @@ CHEATSHEET = f"""
Airflow123
* Redis: redis://127.0.0.1:{REDIS_HOST_PORT}/0
- [bright_blue]* How can I add my stuff in Breeze:[/]
+ [info]* How can I add my stuff in Breeze:[/]
* Your dags for webserver and scheduler are read from `/files/dags` directory
which is mounted from folder in Airflow sources:
@@ -115,7 +115,7 @@ CHEATSHEET = f"""
`{AIRFLOW_SOURCES_ROOT}/files` folder
and they will be visible in `/files/` folder inside the container
- [bright_blue]* Other options[/]
+ [info]* Other options[/]
Check out `--help` for ./breeze commands. It will show you other options, such as running
integration or starting complete Airflow using `start-airflow` command as well as ways
diff --git a/dev/breeze/tests/test_docker_command_utils.py b/dev/breeze/tests/test_docker_command_utils.py
index 8d168844b9..5be489c65e 100644
--- a/dev/breeze/tests/test_docker_command_utils.py
+++ b/dev/breeze/tests/test_docker_command_utils.py
@@ -23,8 +23,10 @@ from airflow_breeze.utils.docker_command_utils import check_docker_compose_versi
@mock.patch('airflow_breeze.utils.docker_command_utils.check_docker_permission_denied')
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_version_unknown(mock_console, mock_run_command, mock_check_docker_permission_denied):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_version_unknown(
+ mock_get_console, mock_run_command, mock_check_docker_permission_denied
+):
mock_check_docker_permission_denied.return_value = False
check_docker_version(verbose=True)
expected_run_command_calls = [
@@ -38,18 +40,20 @@ def test_check_docker_version_unknown(mock_console, mock_run_command, mock_check
),
]
mock_run_command.assert_has_calls(expected_run_command_calls)
- mock_console.print.assert_called_with(
+ mock_get_console.return_value.print.assert_called_with(
"""
-[yellow]Your version of docker is unknown. If the scripts fail, please make sure to[/]
-[yellow]install docker at least: 20.10.0 version.[/]
+[warning]Your version of docker is unknown. If the scripts fail, please make sure to[/]
+[warning]install docker at least: 20.10.0 version.[/]
"""
)
@mock.patch('airflow_breeze.utils.docker_command_utils.check_docker_permission_denied')
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_version_too_low(mock_console, mock_run_command, mock_check_docker_permission_denied):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_version_too_low(
+ mock_get_console, mock_run_command, mock_check_docker_permission_denied
+):
mock_check_docker_permission_denied.return_value = False
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "0.9"
@@ -63,17 +67,17 @@ def test_check_docker_version_too_low(mock_console, mock_run_command, mock_check
text=True,
check=False,
)
- mock_console.print.assert_called_with(
+ mock_get_console.return_value.print.assert_called_with(
"""
-[yellow]Your version of docker is too old:0.9. Please upgrade to at least 20.10.0[/]
+[warning]Your version of docker is too old:0.9.\nPlease upgrade to at least 20.10.0[/]
"""
)
@mock.patch('airflow_breeze.utils.docker_command_utils.check_docker_permission_denied')
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_version_ok(mock_console, mock_run_command, mock_check_docker_permission_denied):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_version_ok(mock_get_console, mock_run_command, mock_check_docker_permission_denied):
mock_check_docker_permission_denied.return_value = False
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "20.10.0"
@@ -87,13 +91,13 @@ def test_check_docker_version_ok(mock_console, mock_run_command, mock_check_dock
text=True,
check=False,
)
- mock_console.print.assert_called_with("[green]Good version of Docker: 20.10.0.[/]")
+ mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 20.10.0.[/]")
@mock.patch('airflow_breeze.utils.docker_command_utils.check_docker_permission_denied')
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_version_higher(mock_console, mock_run_command, mock_check_docker_permission_denied):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_version_higher(mock_get_console, mock_run_command, mock_check_docker_permission_denied):
mock_check_docker_permission_denied.return_value = False
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "21.10.0"
@@ -107,12 +111,12 @@ def test_check_docker_version_higher(mock_console, mock_run_command, mock_check_
text=True,
check=False,
)
- mock_console.print.assert_called_with("[green]Good version of Docker: 21.10.0.[/]")
+ mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 21.10.0.[/]")
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_compose_version_unknown(mock_console, mock_run_command):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_compose_version_unknown(mock_get_console, mock_run_command):
check_docker_compose_version(verbose=True)
expected_run_command_calls = [
call(
@@ -124,17 +128,17 @@ def test_check_docker_compose_version_unknown(mock_console, mock_run_command):
),
]
mock_run_command.assert_has_calls(expected_run_command_calls)
- mock_console.print.assert_called_with(
+ mock_get_console.return_value.print.assert_called_with(
"""
-[yellow]Unknown docker-compose version. At least 1.29 is needed![/]
-[yellow]If Breeze fails upgrade to latest available docker-compose version.[/]
+[warning]Unknown docker-compose version. At least 1.29 is needed![/]
+[warning]If Breeze fails upgrade to latest available docker-compose version.[/]
"""
)
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_compose_version_low(mock_console, mock_run_command):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_compose_version_low(mock_get_console, mock_run_command):
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "1.28.5"
check_docker_compose_version(verbose=True)
@@ -148,7 +152,7 @@ def test_check_docker_compose_version_low(mock_console, mock_run_command):
expected_print_calls = [
call(
"""
-[yellow]You have too old version of docker-compose: 1.28.5! At least 1.29 is needed! Please upgrade!
+[warning]You have too old version of docker-compose: 1.28.5! At least 1.29 is needed! Please upgrade!
"""
),
call(
@@ -158,12 +162,12 @@ Make sure docker-compose you install is first on the PATH variable of yours.
"""
),
]
- mock_console.print.assert_has_calls(expected_print_calls)
+ mock_get_console.return_value.print.assert_has_calls(expected_print_calls)
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_compose_version_ok(mock_console, mock_run_command):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_compose_version_ok(mock_get_console, mock_run_command):
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "1.29.0"
check_docker_compose_version(verbose=True)
@@ -174,12 +178,14 @@ def test_check_docker_compose_version_ok(mock_console, mock_run_command):
capture_output=True,
text=True,
)
- mock_console.print.assert_called_with("[green]Good version of docker-compose: 1.29.0[/]")
+ mock_get_console.return_value.print.assert_called_with(
+ "[success]Good version of docker-compose: 1.29.0[/]"
+ )
@mock.patch('airflow_breeze.utils.docker_command_utils.run_command')
-@mock.patch('airflow_breeze.utils.docker_command_utils.console')
-def test_check_docker_compose_version_higher(mock_console, mock_run_command):
+@mock.patch('airflow_breeze.utils.docker_command_utils.get_console')
+def test_check_docker_compose_version_higher(mock_get_console, mock_run_command):
mock_run_command.return_value.returncode = 0
mock_run_command.return_value.stdout = "1.29.2"
check_docker_compose_version(verbose=True)
@@ -190,4 +196,6 @@ def test_check_docker_compose_version_higher(mock_console, mock_run_command):
capture_output=True,
text=True,
)
- mock_console.print.assert_called_with("[green]Good version of docker-compose: 1.29.2[/]")
+ mock_get_console.return_value.print.assert_called_with(
+ "[success]Good version of docker-compose: 1.29.2[/]"
+ )
diff --git a/dev/provider_packages/prepare_provider_packages.py b/dev/provider_packages/prepare_provider_packages.py
index 1a46c7292d..319f4447fd 100755
--- a/dev/provider_packages/prepare_provider_packages.py
+++ b/dev/provider_packages/prepare_provider_packages.py
@@ -171,7 +171,7 @@ def with_group(title):
https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#grouping-log-lines
"""
if os.environ.get('GITHUB_ACTIONS', 'false') != "true":
- console.print("[blue]" + "#" * 10 + ' ' + title + ' ' + "#" * 10 + "[/]")
+ console.print("[info]" + "#" * 10 + ' ' + title + ' ' + "#" * 10 + "[/]")
yield
return
console.print(f"::group::{title}")
diff --git a/docs/build_docs.py b/docs/build_docs.py
index f2361f00ab..d7edad1cad 100755
--- a/docs/build_docs.py
+++ b/docs/build_docs.py
@@ -69,21 +69,21 @@ def _promote_new_flags():
console.print()
if ON_GITHUB_ACTIONS:
console.print("You can quickly build documentation locally with just one command.")
- console.print(" [blue]breeze build-docs[/]")
+ console.print(" [info]breeze build-docs[/]")
console.print()
console.print("[yellow]Still too slow?[/]")
console.print()
console.print("You can only build one documentation package:")
- console.print(" [blue]breeze build-docs --package-filter <PACKAGE-NAME>[/]")
+ console.print(" [info]breeze build-docs --package-filter <PACKAGE-NAME>[/]")
console.print()
console.print("This usually takes from [yellow]20 seconds[/] to [yellow]2 minutes[/].")
console.print()
console.print("You can also use other extra flags to iterate faster:")
- console.print(" [blue]--docs-only - Only build documentation[/]")
- console.print(" [blue]--spellcheck-only - Only perform spellchecking[/]")
+ console.print(" [info]--docs-only - Only build documentation[/]")
+ console.print(" [info]--spellcheck-only - Only perform spellchecking[/]")
console.print()
console.print("For more info:")
- console.print(" [blue]breeze build-docs --help[/]")
+ console.print(" [info]breeze build-docs --help[/]")
console.print()
@@ -177,7 +177,7 @@ def perform_docs_build_for_single_package(build_specification: BuildSpecificatio
builder = AirflowDocsBuilder(
package_name=build_specification.package_name, for_production=build_specification.for_production
)
- console.print(f"[blue]{build_specification.package_name:60}:[/] Building documentation")
+ console.print(f"[info]{build_specification.package_name:60}:[/] Building documentation")
result = BuildDocsResult(
package_name=build_specification.package_name,
errors=builder.build_sphinx_docs(
@@ -193,7 +193,7 @@ def perform_spell_check_for_single_package(build_specification: BuildSpecificati
builder = AirflowDocsBuilder(
package_name=build_specification.package_name, for_production=build_specification.for_production
)
- console.print(f"[blue]{build_specification.package_name:60}:[/] Checking spelling started")
+ console.print(f"[info]{build_specification.package_name:60}:[/] Checking spelling started")
result = SpellCheckResult(
package_name=build_specification.package_name,
errors=builder.check_spelling(
@@ -201,7 +201,7 @@ def perform_spell_check_for_single_package(build_specification: BuildSpecificati
),
log_file_name=builder.log_spelling_filename,
)
- console.print(f"[blue]{build_specification.package_name:60}:[/] Checking spelling completed")
+ console.print(f"[info]{build_specification.package_name:60}:[/] Checking spelling completed")
return result
@@ -218,7 +218,7 @@ def build_docs_for_packages(
all_spelling_errors: Dict[str, List[SpellingError]] = defaultdict(list)
with with_group("Cleaning documentation files"):
for package_name in current_packages:
- console.print(f"[blue]{package_name:60}:[/] Cleaning files")
+ console.print(f"[info]{package_name:60}:[/] Cleaning files")
builder = AirflowDocsBuilder(package_name=package_name, for_production=for_production)
builder.clean_files()
if jobs > 1:
@@ -315,11 +315,11 @@ def print_build_output(result: BuildDocsResult):
"""Prints output of docs build job."""
with with_group(f"{TEXT_RED}Output for documentation build {result.package_name}{TEXT_RESET}"):
console.print()
- console.print(f"[blue]{result.package_name:60}: " + "#" * 80)
+ console.print(f"[info]{result.package_name:60}: " + "#" * 80)
with open(result.log_file_name) as output:
for line in output.read().splitlines():
console.print(f"{result.package_name:60} {line}")
- console.print(f"[blue]{result.package_name:60}: " + "#" * 80)
+ console.print(f"[info]{result.package_name:60}: " + "#" * 80)
def run_docs_build_in_parallel(
@@ -333,7 +333,7 @@ def run_docs_build_in_parallel(
doc_build_specifications: List[BuildSpecification] = []
with with_group("Scheduling documentation to build"):
for package_name in current_packages:
- console.print(f"[blue]{package_name:60}:[/] Scheduling documentation to build")
+ console.print(f"[info]{package_name:60}:[/] Scheduling documentation to build")
doc_build_specifications.append(
BuildSpecification(
package_name=package_name,
@@ -354,11 +354,11 @@ def print_spelling_output(result: SpellCheckResult):
"""Prints output of spell check job."""
with with_group(f"{TEXT_RED}Output for spelling check: {result.package_name}{TEXT_RESET}"):
console.print()
- console.print(f"[blue]{result.package_name:60}: " + "#" * 80)
+ console.print(f"[info]{result.package_name:60}: " + "#" * 80)
with open(result.log_file_name) as output:
for line in output.read().splitlines():
console.print(f"{result.package_name:60} {line}")
- console.print(f"[blue]{result.package_name:60}: " + "#" * 80)
+ console.print(f"[info]{result.package_name:60}: " + "#" * 80)
console.print()
@@ -373,7 +373,7 @@ def run_spell_check_in_parallel(
spell_check_specifications: List[BuildSpecification] = []
with with_group("Scheduling spell checking of documentation"):
for package_name in current_packages:
- console.print(f"[blue]{package_name:60}:[/] Scheduling spellchecking")
+ console.print(f"[info]{package_name:60}:[/] Scheduling spellchecking")
spell_check_specifications.append(
BuildSpecification(package_name=package_name, for_production=for_production, verbose=verbose)
)
@@ -393,7 +393,7 @@ def display_packages_summary(
packages_names = {*build_errors.keys(), *spelling_errors.keys()}
tabular_data = [
{
- "Package name": f"[blue]{package_name}[/]",
+ "Package name": f"[info]{package_name}[/]",
"Count of doc build errors": len(build_errors.get(package_name, [])),
"Count of spelling errors": len(spelling_errors.get(package_name, [])),
}
diff --git a/docs/exts/docs_build/docs_builder.py b/docs/exts/docs_build/docs_builder.py
index ad343b46cf..cc65f3f170 100644
--- a/docs/exts/docs_build/docs_builder.py
+++ b/docs/exts/docs_build/docs_builder.py
@@ -157,10 +157,10 @@ class AirflowDocsBuilder:
env['AIRFLOW_FOR_PRODUCTION'] = 'true'
if verbose:
console.print(
- f"[blue]{self.package_name:60}:[/] Executing cmd: ",
+ f"[info]{self.package_name:60}:[/] Executing cmd: ",
" ".join(shlex.quote(c) for c in build_cmd),
)
- console.print(f"[blue]{self.package_name:60}:[/] The output is hidden until an error occurs.")
+ console.print(f"[info]{self.package_name:60}:[/] The output is hidden until an error occurs.")
with open(self.log_spelling_filename, "wt") as output:
completed_proc = run(
build_cmd,
@@ -189,15 +189,15 @@ class AirflowDocsBuilder:
warning_text += spelling_file.read()
spelling_errors.extend(parse_spelling_warnings(warning_text, self._src_dir))
- console.print(f"[blue]{self.package_name:60}:[/] [red]Finished spell-checking with errors[/]")
+ console.print(f"[info]{self.package_name:60}:[/] [red]Finished spell-checking with errors[/]")
else:
if spelling_errors:
console.print(
- f"[blue]{self.package_name:60}:[/] [yellow]Finished spell-checking with warnings[/]"
+ f"[info]{self.package_name:60}:[/] [yellow]Finished spell-checking with warnings[/]"
)
else:
console.print(
- f"[blue]{self.package_name:60}:[/] [green]Finished spell-checking successfully[/]"
+ f"[info]{self.package_name:60}:[/] [green]Finished spell-checking successfully[/]"
)
return spelling_errors
@@ -232,12 +232,12 @@ class AirflowDocsBuilder:
env['AIRFLOW_FOR_PRODUCTION'] = 'true'
if verbose:
console.print(
- f"[blue]{self.package_name:60}:[/] Executing cmd: ",
+ f"[info]{self.package_name:60}:[/] Executing cmd: ",
" ".join(shlex.quote(c) for c in build_cmd),
)
else:
console.print(
- f"[blue]{self.package_name:60}:[/] Running sphinx. "
+ f"[info]{self.package_name:60}:[/] Running sphinx. "
f"The output is hidden until an error occurs."
)
with open(self.log_build_filename, "wt") as output:
@@ -264,9 +264,9 @@ class AirflowDocsBuilder:
warning_text = re.sub(r"\x1B[@-_][0-?]*[ -/]*[@-~]", "", warning_text)
build_errors.extend(parse_sphinx_warnings(warning_text, self._src_dir))
if build_errors:
- console.print(f"[blue]{self.package_name:60}:[/] [red]Finished docs building with errors[/]")
+ console.print(f"[info]{self.package_name:60}:[/] [red]Finished docs building with errors[/]")
else:
- console.print(f"[blue]{self.package_name:60}:[/] [green]Finished docs building successfully[/]")
+ console.print(f"[info]{self.package_name:60}:[/] [green]Finished docs building successfully[/]")
return build_errors
def publish(self, override_versioned: bool):
diff --git a/docs/exts/docs_build/errors.py b/docs/exts/docs_build/errors.py
index b654fc6621..d1dc48d7cd 100644
--- a/docs/exts/docs_build/errors.py
+++ b/docs/exts/docs_build/errors.py
@@ -62,9 +62,9 @@ def display_errors_summary(build_errors: Dict[str, List[DocBuildError]]) -> None
console.print()
for package_name, errors in build_errors.items():
if package_name:
- console.print("=" * 30 + f" [blue]{package_name}[/] " + "=" * 30)
+ console.print("=" * 30 + f" [info]{package_name}[/] " + "=" * 30)
else:
- console.print("=" * 30, " [blue]General[/] ", "=" * 30)
+ console.print("=" * 30, " [info]General[/] ", "=" * 30)
for warning_no, error in enumerate(sorted(errors), 1):
console.print("-" * 30, f"[red]Error {warning_no:3}[/]", "-" * 20)
console.print(error.message)
diff --git a/docs/exts/docs_build/spelling_checks.py b/docs/exts/docs_build/spelling_checks.py
index 62d4baeccb..5106d80e21 100644
--- a/docs/exts/docs_build/spelling_checks.py
+++ b/docs/exts/docs_build/spelling_checks.py
@@ -142,9 +142,9 @@ def display_spelling_error_summary(spelling_errors: Dict[str, List[SpellingError
for package_name, errors in sorted(spelling_errors.items()):
if package_name:
- console.print("=" * 30, f" [blue]{package_name}[/] ", "=" * 30)
+ console.print("=" * 30, f" [info]{package_name}[/] ", "=" * 30)
else:
- console.print("=" * 30, " [blue]General[/] ", "=" * 30)
+ console.print("=" * 30, " [info]General[/] ", "=" * 30)
for warning_no, error in enumerate(sorted(errors), 1):
console.print("-" * 30, f"Error {warning_no:3}", "-" * 30)
diff --git a/images/breeze/output-config.svg b/images/breeze/output-config.svg
index 5d20779549..35d0962e15 100644
--- a/images/breeze/output-config.svg
+++ b/images/breeze/output-config.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="802" viewBox="0 0 1720.0 802"
+<svg width="1720.0" height="824" viewBox="0 0 1720.0 824"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -128,6 +128,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r4">[default: sqlite] </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--cheatsheet</span><span class="r1">/</span><span class="r5">--no-cheatsheet</span><span class="r1"> </span><span class="r6">-C</span><span class="r1">/</span><span class="r6">-c</span><span class="r1"> </span><span class="r1">Enable/disable cheatsheet. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--asciiart</span><span class="r1">/</span><span class="r5">--no-asciiart</span><span class="r1"> </span><span class="r6">-A</span><span class="r1">/</span><span class="r6">-a</span><span class="r1"> </span><span class="r1">Enable/disable ASCIIart. </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--colour</span><span class="r1">/</span><span class="r5">--no-colour</span><span class="r1"> </span><span class="r6">-B</span><span class="r1">/</span><span class="r6">-b</span><span class="r1"> </span><span class="r1">Enable/disable Colour mode (useful for colour blind-friendly communication). </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>
<div><span class="r4">╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--postgres-version</span><span class="r1"> </span><span class="r6">-P</span><span class="r1"> </span><span class="r1">Version of Postgres used.</span><span class="r1"> </span><span class="r7">(>10< | 11 | 12 | 13)</span><span class="r1"> </span><span class="r4">[default: 10]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
diff --git a/scripts/ci/pre_commit/pre_commit_check_order_setup.py b/scripts/ci/pre_commit/pre_commit_check_order_setup.py
index 82c5f53ba8..8e4ac563f6 100755
--- a/scripts/ci/pre_commit/pre_commit_check_order_setup.py
+++ b/scripts/ci/pre_commit/pre_commit_check_order_setup.py
@@ -65,7 +65,7 @@ def check_main_dependent_group(setup_contents: str) -> None:
Test for an order of dependencies groups between mark
'# Start dependencies group' and '# End dependencies group' in setup.py
"""
- print("[blue]Checking main dependency group[/]")
+ print("[info]Checking main dependency group[/]")
pattern_main_dependent_group = re.compile(
'# Start dependencies group\n(.*)# End dependencies group', re.DOTALL
)
@@ -86,7 +86,7 @@ def check_sub_dependent_group(group_name: str) -> None:
Test for an order of each dependencies groups declare like
`^dependent_group_name = [.*?]\n` in setup.py
"""
- print(f"[blue]Checking dependency group {group_name}[/]")
+ print(f"[info]Checking dependency group {group_name}[/]")
_check_list_sorted(getattr(setup, group_name), f"Order of dependency group: {group_name}")
@@ -99,13 +99,13 @@ def check_alias_dependent_group(setup_context: str) -> None:
dependents = pattern.findall(setup_context)
for dependent in dependents:
- print(f"[blue]Checking alias-dependent group {dependent}[/]")
+ print(f"[info]Checking alias-dependent group {dependent}[/]")
src = dependent.split(' + ')
_check_list_sorted(src, f"Order of alias dependencies group: {dependent}")
def check_variable_order(var_name: str) -> None:
- print(f"[blue]Checking {var_name}[/]")
+ print(f"[info]Checking {var_name}[/]")
var = getattr(setup, var_name)
@@ -129,7 +129,7 @@ def check_install_and_setup_requires() -> None:
pattern_dependent_version = re.compile('[~|><=;].*')
for key in ('install_requires', 'setup_requires'):
- print(f"[blue]Checking setup.cfg group {key}[/]")
+ print(f"[info]Checking setup.cfg group {key}[/]")
deps = config['options'][key]
dists = [pattern_dependent_version.sub('', p) for p in deps]
_check_list_sorted(dists, f"Order of dependencies in do_setup section: {key}")
[airflow] 03/09: Remove confusion about upgrade-to-newer-dependencies breeze param (#23334)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit c062edd46c2beb6f475db006f5a8350cb0198360
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Thu Apr 28 21:12:35 2022 +0200
Remove confusion about upgrade-to-newer-dependencies breeze param (#23334)
The "upgrade-to-newer-dependencies" in the image can take "false"
"true" and <RANDOM> value (the RANDOM value is used to always
invalidate docker cache).
This has been carried to Breeze command line, but this was a source
of major confusion as the name of the parameter suggest bool value.
The change modifies the parameter to be flag, and when the flag
is set the parameter is set to random during image building.
That should help with recent bug when image was always rebuilt
without checking if it should be rebuilt.
(cherry picked from commit b6db0e90aeb30133086716a433cab9dca7408a54)
---
.../src/airflow_breeze/build_image/ci/build_ci_params.py | 2 +-
.../airflow_breeze/build_image/prod/build_prod_params.py | 2 +-
dev/breeze/src/airflow_breeze/commands/common_options.py | 5 ++---
.../src/airflow_breeze/commands/release_management.py | 9 ++++-----
dev/breeze/src/airflow_breeze/shell/enter_shell.py | 2 +-
.../src/airflow_breeze/utils/docker_command_utils.py | 16 +++++++++++++---
images/breeze/output-build-image.svg | 5 ++---
images/breeze/output-build-prod-image.svg | 5 ++---
scripts/ci/selective_ci_checks.sh | 14 ++++----------
9 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
index da5364d087..af37c71dbe 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
@@ -33,7 +33,7 @@ class BuildCiParams:
CI build parameters. Those parameters are used to determine command issued to build CI image.
"""
- upgrade_to_newer_dependencies: str = "false"
+ upgrade_to_newer_dependencies: bool = False
python: str = "3.7"
airflow_branch: str = AIRFLOW_BRANCH
build_id: int = 0
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
index 116fae9333..91a06e6e3f 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
@@ -52,7 +52,7 @@ class BuildProdParams:
empty_image: bool = False
airflow_is_in_context: bool = False
install_packages_from_context: bool = False
- upgrade_to_newer_dependencies: str = "false"
+ upgrade_to_newer_dependencies: bool = False
airflow_version: str = get_airflow_version()
python: str = "3.7"
airflow_branch_for_pypi_preloading: str = AIRFLOW_BRANCH
diff --git a/dev/breeze/src/airflow_breeze/commands/common_options.py b/dev/breeze/src/airflow_breeze/commands/common_options.py
index e169697cd2..a2d2e8c0f9 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_options.py
@@ -197,9 +197,8 @@ option_debian_version = click.option(
option_upgrade_to_newer_dependencies = click.option(
"-u",
'--upgrade-to-newer-dependencies',
- default="false",
- show_default=True,
- help='When other than "false", upgrade all PIP packages to latest.',
+ is_flag=True,
+ help='When set, upgrade all PIP packages to latest.',
envvar='UPGRADE_TO_NEWER_DEPENDENCIES',
)
option_additional_extras = click.option(
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management.py b/dev/breeze/src/airflow_breeze/commands/release_management.py
index 72e2756878..33765f9afd 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management.py
@@ -320,13 +320,12 @@ def generate_constraints(
set_forced_answer(answer)
if run_in_parallel:
given_answer = user_confirm(
- f"Did you build all CI images {python_versions} with --upgrade-to-newer-dependencies "
- f"true flag set?",
+ f"Did you build all CI images {python_versions} with --upgrade-to-newer-dependencies flag set?",
timeout=None,
)
else:
given_answer = user_confirm(
- f"Did you build CI image {python} with --upgrade-to-newer-dependencies true flag set?",
+ f"Did you build CI image {python} with --upgrade-to-newer-dependencies flag set?",
timeout=None,
)
if given_answer != Answer.YES:
@@ -334,7 +333,7 @@ def generate_constraints(
get_console().print("\n[info]Use this command to build the images:[/]\n")
get_console().print(
f" breeze build-image --run-in-parallel --python-versions '{python_versions}' "
- f"--upgrade-to-newer-dependencies true\n"
+ f"--upgrade-to-newer-dependencies\n"
)
else:
shell_params = ShellParams(
@@ -343,7 +342,7 @@ def generate_constraints(
get_console().print("\n[info]Use this command to build the image:[/]\n")
get_console().print(
f" breeze build-image --python'{shell_params.python}' "
- f"--upgrade-to-newer-dependencies true\n"
+ f"--upgrade-to-newer-dependencies\n"
)
sys.exit(1)
if run_in_parallel:
diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
index 51294d55bb..c9d93abb3d 100644
--- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py
+++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
@@ -120,7 +120,7 @@ def run_shell_with_build_image_checks(
build_ci_image_check_cache = Path(
BUILD_CACHE_DIR, shell_params.airflow_branch, f".built_{shell_params.python}"
)
- ci_image_params = BuildCiParams(python=shell_params.python, upgrade_to_newer_dependencies="false")
+ ci_image_params = BuildCiParams(python=shell_params.python, upgrade_to_newer_dependencies=False)
if build_ci_image_check_cache.exists():
get_console().print(f'[info]{shell_params.the_image_type} image already built locally.[/]')
else:
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 4598a6ce97..813ad67ea2 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -18,6 +18,7 @@
import os
import re
import subprocess
+from random import randint
from typing import Dict, List, Tuple, Union
from airflow_breeze.build_image.ci.build_ci_params import BuildCiParams
@@ -286,7 +287,14 @@ def construct_arguments_for_docker_build_command(
image_params: Union[BuildCiParams, BuildProdParams], required_args: List[str], optional_args: List[str]
) -> List[str]:
"""
- Constructs docker compose command arguments list based on parameters passed
+ Constructs docker compose command arguments list based on parameters passed. Maps arguments to
+ argument values.
+
+ It maps:
+ * all the truthy/falsy values are converted to "true" / "false" respectively
+ * if upgrade_to_newer_dependencies is set to True, it is replaced by a random string to account
+ for the need of always triggering upgrade for docker build.
+
:param image_params: parameters of the image
:param required_args: build argument that are required
:param optional_args: build arguments that are optional (should not be used if missing or empty)
@@ -295,8 +303,10 @@ def construct_arguments_for_docker_build_command(
def get_env_variable_value(arg_name: str):
value = str(getattr(image_params, arg_name))
- value = "true" if value == "True" else value
- value = "false" if value == "False" else value
+ value = "true" if value.lower() in ["true", "t", "yes", "y"] else value
+ value = "false" if value.lower() in ["false", "f", "no", "n"] else value
+ if arg_name == "upgrade_to_newer_dependencies" and value == "true":
+ value = f"{randint(0, 2**32):x}"
return value
args_command = []
diff --git a/images/breeze/output-build-image.svg b/images/breeze/output-build-image.svg
index 01b392f174..f55442611c 100644
--- a/images/breeze/output-build-image.svg
+++ b/images/breeze/output-build-image.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1528" viewBox="0 0 1720.0 1528"
+<svg width="1720.0" height="1506" viewBox="0 0 1720.0 1506"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -124,8 +124,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--python</span><span class="r1"> </span><span class="r6">-p</span><span class="r1"> </span><span class="r1">Python major/minor version used in Airflow image for images. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r7">(>3.7< | 3.8 | 3.9 | 3.10) </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r4">[default: 3.7] </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
-<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--upgrade-to-newer-dependencies</span><span class="r1"> </span><span class="r6">-u</span><span class="r1"> </span><span class="r1">When other than "false", upgrade all PIP packages to latest.</span><span class="r1"> </span><span class="r7">(TEXT)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
-<div><span class="r4">│</span><span class="r1"> </span><span class="r4">[default: false] </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--upgrade-to-newer-dependencies</span><span class="r1"> </span><span class="r6">-u</span><span class="r1"> </span><span class="r1">When set, upgrade all PIP packages to latest. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--image-tag</span><span class="r1"> </span><span class="r6">-t</span><span class="r1"> </span><span class="r1">Tag added to the default naming conventions of Airflow CI/PROD images.</span><span class="r1"> </span><span class="r7">(TEXT)</span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--docker-cache</span><span class="r1"> </span><span class="r6">-c</span><span class="r1"> </span><span class="r1">Cache option for image used during the build.</span><span class="r1"> </span><span class="r7">(pulled | local | disabled)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
diff --git a/images/breeze/output-build-prod-image.svg b/images/breeze/output-build-prod-image.svg
index def3afbc88..7d693c4d73 100644
--- a/images/breeze/output-build-prod-image.svg
+++ b/images/breeze/output-build-prod-image.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1902" viewBox="0 0 1720.0 1902"
+<svg width="1720.0" height="1880" viewBox="0 0 1720.0 1880"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -125,8 +125,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r7">(>3.7< | 3.8 | 3.9 | 3.10) </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r4">[default: 3.7] </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--install-airflow-version</span><span class="r1"> </span><span class="r6">-V</span><span class="r1"> </span><span class="r1">Install version of Airflow from PyPI.</span><span class="r1"> </span><span class="r7">(TEXT)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
-<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--upgrade-to-newer-dependencies</span><span class="r1"> </span><span class="r6">-u</span><span class="r1"> </span><span class="r1">When other than "false", upgrade all PIP packages to latest.</span><span class="r1"> </span><span class="r7">(TEXT)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
-<div><span class="r4">│</span><span class="r1"> </span><span class="r4">[default: false] </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--upgrade-to-newer-dependencies</span><span class="r1"> </span><span class="r6">-u</span><span class="r1"> </span><span class="r1">When set, upgrade all PIP packages to latest. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--image-tag</span><span class="r1"> </span><span class="r6">-t</span><span class="r1"> </span><span class="r1">Tag added to the default naming conventions of Airflow CI/PROD images.</span><span class="r1"> </span><span class="r7">(TEXT)</span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--docker-cache</span><span class="r1"> </span><span class="r6">-c</span><span class="r1"> </span><span class="r1">Cache option for image used during the build.</span><span class="r1"> </span><span class="r7">(pulled | local | disabled)</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
diff --git a/scripts/ci/selective_ci_checks.sh b/scripts/ci/selective_ci_checks.sh
index 85f7a1c07e..c9f215c53c 100755
--- a/scripts/ci/selective_ci_checks.sh
+++ b/scripts/ci/selective_ci_checks.sh
@@ -44,13 +44,8 @@ fi
function check_upgrade_to_newer_dependencies_needed() {
if [[ ${GITHUB_EVENT_NAME=} == 'push' || ${GITHUB_EVENT_NAME=} == "scheduled" ]]; then
- # Trigger upgrading to latest constraints when we are in push or schedule event. We use the
- # random string so that it always triggers rebuilding layer in the docker image
- # Each build that upgrades to latest constraints will get truly latest constraints, not those
- # cached in the image because docker layer will get invalidated.
- # This upgrade_to_newer_dependencies variable can later be overridden
- # in case we find that any of the setup.* files changed (see below)
- upgrade_to_newer_dependencies="${RANDOM}"
+ # Trigger upgrading to latest constraints when we are in push or schedule event
+ upgrade_to_newer_dependencies="true"
fi
}
@@ -358,9 +353,8 @@ function check_if_setup_files_changed() {
if [[ $(count_changed_files) != "0" ]]; then
# In case the setup files changed, we automatically force upgrading to newer dependencies
- # no matter what was set before. We set it to random number to make sure that it will be
- # always invalidating the layer in Docker that triggers installing the dependencies
- upgrade_to_newer_dependencies="${RANDOM}"
+ # no matter what was set before.
+ upgrade_to_newer_dependencies="true"
fi
start_end::group_end
}
[airflow] 06/09: Fix regeneration of breeze screenshots (#23344)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit ea8d4a3ac45cea3635150137fff55307115ddca8
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Apr 29 17:43:22 2022 +0200
Fix regeneration of breeze screenshots (#23344)
(cherry picked from commit c1528f71b055db3cf27ea4597f9550171fcb2678)
---
.github/workflows/ci.yml | 4 +-
dev/breeze/README.md | 2 +-
dev/breeze/setup.cfg | 2 +-
images/breeze/output-build-docs.svg | 58 +++++++++++-----------
images/breeze/output-build-image.svg | 58 +++++++++++-----------
images/breeze/output-build-prod-image.svg | 58 +++++++++++-----------
images/breeze/output-cleanup.svg | 58 +++++++++++-----------
images/breeze/output-commands.svg | 58 +++++++++++-----------
images/breeze/output-config.svg | 58 +++++++++++-----------
images/breeze/output-docker-compose-tests.svg | 58 +++++++++++-----------
images/breeze/output-exec.svg | 56 ++++++++++-----------
images/breeze/output-find-newer-dependencies.svg | 58 +++++++++++-----------
images/breeze/output-fix-ownership.svg | 56 ++++++++++-----------
images/breeze/output-free-space.svg | 58 +++++++++++-----------
images/breeze/output-generate-constraints.svg | 58 +++++++++++-----------
images/breeze/output-prepare-airflow-package.svg | 58 +++++++++++-----------
.../output-prepare-provider-documentation.svg | 58 +++++++++++-----------
images/breeze/output-prepare-provider-packages.svg | 58 +++++++++++-----------
images/breeze/output-pull-image.svg | 58 +++++++++++-----------
images/breeze/output-pull-prod-image.svg | 58 +++++++++++-----------
images/breeze/output-resource-check.svg | 56 ++++++++++-----------
images/breeze/output-self-upgrade.svg | 56 ++++++++++-----------
images/breeze/output-setup-autocomplete.svg | 58 +++++++++++-----------
images/breeze/output-shell.svg | 58 +++++++++++-----------
images/breeze/output-start-airflow.svg | 58 +++++++++++-----------
images/breeze/output-static-checks.svg | 58 +++++++++++-----------
images/breeze/output-stop.svg | 56 ++++++++++-----------
images/breeze/output-verify-image.svg | 58 +++++++++++-----------
images/breeze/output-verify-prod-image.svg | 58 +++++++++++-----------
images/breeze/output-version.svg | 56 ++++++++++-----------
30 files changed, 780 insertions(+), 782 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3de74ef64d..e85684107a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -633,9 +633,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
run: breeze static-checks --all-files --show-diff-on-failure --color always
env:
VERBOSE: false
- # TODO(potiuk): check why the SVG images in CI suddenly started to be different
- # than locally even with new rich 12.3.0 ?????
- SKIP: "identity,update-breeze-file"
+ SKIP: "identity"
COLUMNS: 250
- name: "Fix ownership"
run: breeze fix-ownership
diff --git a/dev/breeze/README.md b/dev/breeze/README.md
index e038229c27..2df4bfac42 100644
--- a/dev/breeze/README.md
+++ b/dev/breeze/README.md
@@ -52,6 +52,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY UPDATED BY PRE-COMMIT.
---------------------------------------------------------------------------------------------------------
-Package config hash: 7f2ce934ce9d90dcc7f97c10534416a8736cb37c1bdf10c0b9abaae77fef35875863188897e13b68899caac65072697341bd11f7cc39148b0c4774ef11a88df2
+Package config hash: 6ab00f80228fe4392cdb1263a52c55416c153052010bd5baca25add84da7475d8601cc399342c72ad95df0e1f2de99e2a99e3d0b19631ff0480554360a9578b4
---------------------------------------------------------------------------------------------------------
diff --git a/dev/breeze/setup.cfg b/dev/breeze/setup.cfg
index 5ef8675c98..7469807313 100644
--- a/dev/breeze/setup.cfg
+++ b/dev/breeze/setup.cfg
@@ -63,7 +63,7 @@ install_requires =
pytest-xdist
pyyaml
requests
- rich
+ rich>=12.3.0
rich_click
[options.packages.find]
diff --git a/images/breeze/output-build-docs.svg b/images/breeze/output-build-docs.svg
index 572747d685..d01d3ecf1c 100644
--- a/images/breeze/output-build-docs.svg
+++ b/images/breeze/output-build-docs.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3399521216-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3399521216-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3399521216-terminal-body .blink {
+ animation: rich-svg-3399521216-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3399521216-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3399521216-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3399521216-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3399521216-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3399521216-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3399521216-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3399521216-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3399521216-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3399521216-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3399521216-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3399521216-terminal-wrapper">
+ <div class="rich-svg-3399521216-terminal">
+ <div class="rich-svg-3399521216-terminal-header">
+ <svg class="rich-svg-3399521216-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: build-docs</div>
+ <div class="rich-svg-3399521216-terminal-title-tab">Command: build-docs</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3399521216-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze build-docs [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-build-image.svg b/images/breeze/output-build-image.svg
index f55442611c..8ff7a50baa 100644
--- a/images/breeze/output-build-image.svg
+++ b/images/breeze/output-build-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-662778973-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-662778973-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-662778973-terminal-body .blink {
+ animation: rich-svg-662778973-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-662778973-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-662778973-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-662778973-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-662778973-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-662778973-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-662778973-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-662778973-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-662778973-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-662778973-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-662778973-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-662778973-terminal-wrapper">
+ <div class="rich-svg-662778973-terminal">
+ <div class="rich-svg-662778973-terminal-header">
+ <svg class="rich-svg-662778973-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: build-image</div>
+ <div class="rich-svg-662778973-terminal-title-tab">Command: build-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-662778973-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze build-image [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-build-prod-image.svg b/images/breeze/output-build-prod-image.svg
index 7d693c4d73..47346d92ee 100644
--- a/images/breeze/output-build-prod-image.svg
+++ b/images/breeze/output-build-prod-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-787753248-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-787753248-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-787753248-terminal-body .blink {
+ animation: rich-svg-787753248-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-787753248-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-787753248-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-787753248-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-787753248-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-787753248-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-787753248-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-787753248-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-787753248-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-787753248-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-787753248-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-787753248-terminal-wrapper">
+ <div class="rich-svg-787753248-terminal">
+ <div class="rich-svg-787753248-terminal-header">
+ <svg class="rich-svg-787753248-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: build-prod-image</div>
+ <div class="rich-svg-787753248-terminal-title-tab">Command: build-prod-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-787753248-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze build-prod-image [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-cleanup.svg b/images/breeze/output-cleanup.svg
index ced3f3d578..955561e0b6 100644
--- a/images/breeze/output-cleanup.svg
+++ b/images/breeze/output-cleanup.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3462681779-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3462681779-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3462681779-terminal-body .blink {
+ animation: rich-svg-3462681779-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3462681779-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3462681779-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3462681779-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3462681779-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3462681779-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3462681779-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3462681779-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3462681779-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3462681779-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3462681779-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3462681779-terminal-wrapper">
+ <div class="rich-svg-3462681779-terminal">
+ <div class="rich-svg-3462681779-terminal-header">
+ <svg class="rich-svg-3462681779-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: cleanup</div>
+ <div class="rich-svg-3462681779-terminal-title-tab">Command: cleanup</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3462681779-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze cleanup [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index 23ecba4348..ce8af6ddff 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1828580335-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1828580335-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1828580335-terminal-body .blink {
+ animation: rich-svg-1828580335-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1828580335-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1828580335-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1828580335-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1828580335-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1828580335-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1828580335-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1828580335-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1828580335-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-1828580335-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1828580335-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1828580335-terminal-wrapper">
+ <div class="rich-svg-1828580335-terminal">
+ <div class="rich-svg-1828580335-terminal-header">
+ <svg class="rich-svg-1828580335-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Breeze commands</div>
+ <div class="rich-svg-1828580335-terminal-title-tab">Breeze commands</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1828580335-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze [OPTIONS] COMMAND [ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-config.svg b/images/breeze/output-config.svg
index 35d0962e15..8f7df02100 100644
--- a/images/breeze/output-config.svg
+++ b/images/breeze/output-config.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-747847725-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-747847725-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-747847725-terminal-body .blink {
+ animation: rich-svg-747847725-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-747847725-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-747847725-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-747847725-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-747847725-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-747847725-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-747847725-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-747847725-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-747847725-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-747847725-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-747847725-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-747847725-terminal-wrapper">
+ <div class="rich-svg-747847725-terminal">
+ <div class="rich-svg-747847725-terminal-header">
+ <svg class="rich-svg-747847725-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: config</div>
+ <div class="rich-svg-747847725-terminal-title-tab">Command: config</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-747847725-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze config [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-docker-compose-tests.svg b/images/breeze/output-docker-compose-tests.svg
index 573b17bc55..10d2e0314b 100644
--- a/images/breeze/output-docker-compose-tests.svg
+++ b/images/breeze/output-docker-compose-tests.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2342278705-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2342278705-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2342278705-terminal-body .blink {
+ animation: rich-svg-2342278705-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2342278705-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2342278705-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2342278705-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2342278705-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2342278705-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2342278705-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2342278705-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2342278705-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2342278705-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2342278705-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2342278705-terminal-wrapper">
+ <div class="rich-svg-2342278705-terminal">
+ <div class="rich-svg-2342278705-terminal-header">
+ <svg class="rich-svg-2342278705-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: docker-compose-tests</div>
+ <div class="rich-svg-2342278705-terminal-title-tab">Command: docker-compose-tests</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2342278705-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze docker-compose-tests [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-exec.svg b/images/breeze/output-exec.svg
index 9e8900f0fb..2f49fba216 100644
--- a/images/breeze/output-exec.svg
+++ b/images/breeze/output-exec.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1543437590-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1543437590-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1543437590-terminal-body .blink {
+ animation: rich-svg-1543437590-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1543437590-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1543437590-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1543437590-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1543437590-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1543437590-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1543437590-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1543437590-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1543437590-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-1543437590-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1543437590-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1543437590-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1543437590-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1543437590-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1543437590-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1543437590-terminal-wrapper">
+ <div class="rich-svg-1543437590-terminal">
+ <div class="rich-svg-1543437590-terminal-header">
+ <svg class="rich-svg-1543437590-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: exec</div>
+ <div class="rich-svg-1543437590-terminal-title-tab">Command: exec</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1543437590-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze exec [OPTIONS] [EXEC_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-find-newer-dependencies.svg b/images/breeze/output-find-newer-dependencies.svg
index 0fbf3aa534..a1e69ef7dc 100644
--- a/images/breeze/output-find-newer-dependencies.svg
+++ b/images/breeze/output-find-newer-dependencies.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3339896715-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3339896715-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3339896715-terminal-body .blink {
+ animation: rich-svg-3339896715-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3339896715-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3339896715-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3339896715-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3339896715-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3339896715-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3339896715-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3339896715-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3339896715-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3339896715-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3339896715-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3339896715-terminal-wrapper">
+ <div class="rich-svg-3339896715-terminal">
+ <div class="rich-svg-3339896715-terminal-header">
+ <svg class="rich-svg-3339896715-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: find-newer-dependencies</div>
+ <div class="rich-svg-3339896715-terminal-title-tab">Command: find-newer-dependencies</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3339896715-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze find-newer-dependencies [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-fix-ownership.svg b/images/breeze/output-fix-ownership.svg
index 2b89bb86e5..62ee3e15fd 100644
--- a/images/breeze/output-fix-ownership.svg
+++ b/images/breeze/output-fix-ownership.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3669752792-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3669752792-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3669752792-terminal-body .blink {
+ animation: rich-svg-3669752792-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3669752792-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3669752792-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3669752792-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3669752792-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3669752792-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3669752792-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3669752792-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3669752792-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-3669752792-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3669752792-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3669752792-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3669752792-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3669752792-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3669752792-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3669752792-terminal-wrapper">
+ <div class="rich-svg-3669752792-terminal">
+ <div class="rich-svg-3669752792-terminal-header">
+ <svg class="rich-svg-3669752792-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: fix-ownership</div>
+ <div class="rich-svg-3669752792-terminal-title-tab">Command: fix-ownership</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3669752792-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze fix-ownership [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-free-space.svg b/images/breeze/output-free-space.svg
index 9250d459c7..2ce40fadce 100644
--- a/images/breeze/output-free-space.svg
+++ b/images/breeze/output-free-space.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2873849831-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2873849831-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2873849831-terminal-body .blink {
+ animation: rich-svg-2873849831-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2873849831-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2873849831-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2873849831-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2873849831-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2873849831-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2873849831-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2873849831-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2873849831-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2873849831-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2873849831-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2873849831-terminal-wrapper">
+ <div class="rich-svg-2873849831-terminal">
+ <div class="rich-svg-2873849831-terminal-header">
+ <svg class="rich-svg-2873849831-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: free-space</div>
+ <div class="rich-svg-2873849831-terminal-title-tab">Command: free-space</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2873849831-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze free-space [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-generate-constraints.svg b/images/breeze/output-generate-constraints.svg
index 298da74edc..e30b53ac33 100644
--- a/images/breeze/output-generate-constraints.svg
+++ b/images/breeze/output-generate-constraints.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1608918125-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1608918125-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1608918125-terminal-body .blink {
+ animation: rich-svg-1608918125-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1608918125-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1608918125-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1608918125-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1608918125-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1608918125-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1608918125-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1608918125-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1608918125-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-1608918125-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1608918125-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1608918125-terminal-wrapper">
+ <div class="rich-svg-1608918125-terminal">
+ <div class="rich-svg-1608918125-terminal-header">
+ <svg class="rich-svg-1608918125-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: generate-constraints</div>
+ <div class="rich-svg-1608918125-terminal-title-tab">Command: generate-constraints</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1608918125-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze generate-constraints [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-prepare-airflow-package.svg b/images/breeze/output-prepare-airflow-package.svg
index b720df7f61..d1e487553e 100644
--- a/images/breeze/output-prepare-airflow-package.svg
+++ b/images/breeze/output-prepare-airflow-package.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1135701573-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1135701573-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1135701573-terminal-body .blink {
+ animation: rich-svg-1135701573-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1135701573-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1135701573-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1135701573-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1135701573-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1135701573-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1135701573-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1135701573-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1135701573-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
-.r7 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-1135701573-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r6 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+.rich-svg-1135701573-terminal-body .r7 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1135701573-terminal-wrapper">
+ <div class="rich-svg-1135701573-terminal">
+ <div class="rich-svg-1135701573-terminal-header">
+ <svg class="rich-svg-1135701573-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: prepare-airflow-package</div>
+ <div class="rich-svg-1135701573-terminal-title-tab">Command: prepare-airflow-package</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1135701573-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze prepare-airflow-package [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-prepare-provider-documentation.svg b/images/breeze/output-prepare-provider-documentation.svg
index 3eb46c8701..ac42860fac 100644
--- a/images/breeze/output-prepare-provider-documentation.svg
+++ b/images/breeze/output-prepare-provider-documentation.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-920130443-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-920130443-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-920130443-terminal-body .blink {
+ animation: rich-svg-920130443-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-920130443-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-920130443-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-920130443-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-920130443-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-920130443-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-920130443-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-920130443-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-920130443-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-920130443-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-920130443-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-920130443-terminal-wrapper">
+ <div class="rich-svg-920130443-terminal">
+ <div class="rich-svg-920130443-terminal-header">
+ <svg class="rich-svg-920130443-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: prepare-provider-documentation</div>
+ <div class="rich-svg-920130443-terminal-title-tab">Command: prepare-provider-documentation</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-920130443-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze prepare-provider-documentation [OPTIONS] [airbyte | alibaba | amazon | apache.beam | apache.cassandra | </span></div>
<div><span class="r2"> apache.drill | apache.druid | apache.hdfs | apache.hive | apache.kylin | </span></div>
diff --git a/images/breeze/output-prepare-provider-packages.svg b/images/breeze/output-prepare-provider-packages.svg
index cd81f86397..d2c8b2219f 100644
--- a/images/breeze/output-prepare-provider-packages.svg
+++ b/images/breeze/output-prepare-provider-packages.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3921007243-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3921007243-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3921007243-terminal-body .blink {
+ animation: rich-svg-3921007243-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3921007243-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3921007243-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3921007243-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3921007243-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3921007243-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3921007243-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3921007243-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3921007243-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
-.r7 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-3921007243-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r6 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+.rich-svg-3921007243-terminal-body .r7 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3921007243-terminal-wrapper">
+ <div class="rich-svg-3921007243-terminal">
+ <div class="rich-svg-3921007243-terminal-header">
+ <svg class="rich-svg-3921007243-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: prepare-provider-packages</div>
+ <div class="rich-svg-3921007243-terminal-title-tab">Command: prepare-provider-packages</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3921007243-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze prepare-provider-packages [OPTIONS] [airbyte | alibaba | amazon | apache.beam | apache.cassandra | </span></div>
<div><span class="r2"> apache.drill | apache.druid | apache.hdfs | apache.hive | apache.kylin | </span></div>
diff --git a/images/breeze/output-pull-image.svg b/images/breeze/output-pull-image.svg
index c5ea6d91ae..b432347677 100644
--- a/images/breeze/output-pull-image.svg
+++ b/images/breeze/output-pull-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2708726962-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2708726962-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2708726962-terminal-body .blink {
+ animation: rich-svg-2708726962-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2708726962-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2708726962-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2708726962-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2708726962-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2708726962-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2708726962-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2708726962-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2708726962-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2708726962-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2708726962-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2708726962-terminal-wrapper">
+ <div class="rich-svg-2708726962-terminal">
+ <div class="rich-svg-2708726962-terminal-header">
+ <svg class="rich-svg-2708726962-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: pull-image</div>
+ <div class="rich-svg-2708726962-terminal-title-tab">Command: pull-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2708726962-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze pull-image [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-pull-prod-image.svg b/images/breeze/output-pull-prod-image.svg
index a25ea871ba..a12f75146f 100644
--- a/images/breeze/output-pull-prod-image.svg
+++ b/images/breeze/output-pull-prod-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3990808719-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3990808719-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3990808719-terminal-body .blink {
+ animation: rich-svg-3990808719-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3990808719-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3990808719-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3990808719-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3990808719-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3990808719-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3990808719-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3990808719-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3990808719-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3990808719-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3990808719-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3990808719-terminal-wrapper">
+ <div class="rich-svg-3990808719-terminal">
+ <div class="rich-svg-3990808719-terminal-header">
+ <svg class="rich-svg-3990808719-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: pull-prod-image</div>
+ <div class="rich-svg-3990808719-terminal-title-tab">Command: pull-prod-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3990808719-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze pull-prod-image [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-resource-check.svg b/images/breeze/output-resource-check.svg
index c5a2bcb473..b3d347fa10 100644
--- a/images/breeze/output-resource-check.svg
+++ b/images/breeze/output-resource-check.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3759274647-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3759274647-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3759274647-terminal-body .blink {
+ animation: rich-svg-3759274647-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3759274647-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3759274647-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3759274647-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3759274647-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3759274647-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3759274647-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3759274647-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3759274647-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-3759274647-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3759274647-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3759274647-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3759274647-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3759274647-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3759274647-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3759274647-terminal-wrapper">
+ <div class="rich-svg-3759274647-terminal">
+ <div class="rich-svg-3759274647-terminal-header">
+ <svg class="rich-svg-3759274647-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: resource-check</div>
+ <div class="rich-svg-3759274647-terminal-title-tab">Command: resource-check</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3759274647-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze resource-check [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-self-upgrade.svg b/images/breeze/output-self-upgrade.svg
index 8020900b9e..218e226e2d 100644
--- a/images/breeze/output-self-upgrade.svg
+++ b/images/breeze/output-self-upgrade.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-4041262352-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-4041262352-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-4041262352-terminal-body .blink {
+ animation: rich-svg-4041262352-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-4041262352-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-4041262352-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-4041262352-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-4041262352-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-4041262352-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-4041262352-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-4041262352-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-4041262352-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-4041262352-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-4041262352-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-4041262352-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-4041262352-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-4041262352-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-4041262352-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-4041262352-terminal-wrapper">
+ <div class="rich-svg-4041262352-terminal">
+ <div class="rich-svg-4041262352-terminal-header">
+ <svg class="rich-svg-4041262352-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: self-upgrade</div>
+ <div class="rich-svg-4041262352-terminal-title-tab">Command: self-upgrade</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-4041262352-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze self-upgrade [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-setup-autocomplete.svg b/images/breeze/output-setup-autocomplete.svg
index 86e66e661c..a307a2b9e9 100644
--- a/images/breeze/output-setup-autocomplete.svg
+++ b/images/breeze/output-setup-autocomplete.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2604643872-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2604643872-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2604643872-terminal-body .blink {
+ animation: rich-svg-2604643872-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2604643872-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2604643872-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2604643872-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2604643872-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2604643872-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2604643872-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2604643872-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2604643872-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2604643872-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2604643872-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2604643872-terminal-wrapper">
+ <div class="rich-svg-2604643872-terminal">
+ <div class="rich-svg-2604643872-terminal-header">
+ <svg class="rich-svg-2604643872-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: setup-autocomplete</div>
+ <div class="rich-svg-2604643872-terminal-title-tab">Command: setup-autocomplete</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2604643872-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze setup-autocomplete [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-shell.svg b/images/breeze/output-shell.svg
index 4ffd4c8b21..c0a7da761a 100644
--- a/images/breeze/output-shell.svg
+++ b/images/breeze/output-shell.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-379414012-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-379414012-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-379414012-terminal-body .blink {
+ animation: rich-svg-379414012-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-379414012-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-379414012-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-379414012-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-379414012-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-379414012-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-379414012-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-379414012-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-379414012-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-379414012-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-379414012-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-379414012-terminal-wrapper">
+ <div class="rich-svg-379414012-terminal">
+ <div class="rich-svg-379414012-terminal-header">
+ <svg class="rich-svg-379414012-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: shell</div>
+ <div class="rich-svg-379414012-terminal-title-tab">Command: shell</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-379414012-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze shell [OPTIONS] [EXTRA_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-start-airflow.svg b/images/breeze/output-start-airflow.svg
index 5a338cb49e..4efbcdbaa1 100644
--- a/images/breeze/output-start-airflow.svg
+++ b/images/breeze/output-start-airflow.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2393603551-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2393603551-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2393603551-terminal-body .blink {
+ animation: rich-svg-2393603551-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2393603551-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2393603551-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2393603551-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2393603551-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2393603551-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2393603551-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2393603551-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2393603551-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2393603551-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2393603551-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2393603551-terminal-wrapper">
+ <div class="rich-svg-2393603551-terminal">
+ <div class="rich-svg-2393603551-terminal-header">
+ <svg class="rich-svg-2393603551-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: start-airflow</div>
+ <div class="rich-svg-2393603551-terminal-title-tab">Command: start-airflow</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2393603551-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze start-airflow [OPTIONS] [EXTRA_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-static-checks.svg b/images/breeze/output-static-checks.svg
index bde9d4473e..b039113af9 100644
--- a/images/breeze/output-static-checks.svg
+++ b/images/breeze/output-static-checks.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1500548947-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1500548947-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1500548947-terminal-body .blink {
+ animation: rich-svg-1500548947-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1500548947-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1500548947-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1500548947-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1500548947-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1500548947-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1500548947-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1500548947-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1500548947-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-1500548947-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1500548947-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1500548947-terminal-wrapper">
+ <div class="rich-svg-1500548947-terminal">
+ <div class="rich-svg-1500548947-terminal-header">
+ <svg class="rich-svg-1500548947-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: static-checks</div>
+ <div class="rich-svg-1500548947-terminal-title-tab">Command: static-checks</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1500548947-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze static-checks [OPTIONS] [PRECOMMIT_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-stop.svg b/images/breeze/output-stop.svg
index e0ae1ca62a..09b58cc5ee 100644
--- a/images/breeze/output-stop.svg
+++ b/images/breeze/output-stop.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1813462456-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1813462456-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1813462456-terminal-body .blink {
+ animation: rich-svg-1813462456-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1813462456-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1813462456-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1813462456-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1813462456-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1813462456-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1813462456-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1813462456-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1813462456-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-1813462456-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1813462456-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1813462456-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1813462456-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1813462456-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1813462456-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1813462456-terminal-wrapper">
+ <div class="rich-svg-1813462456-terminal">
+ <div class="rich-svg-1813462456-terminal-header">
+ <svg class="rich-svg-1813462456-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: stop</div>
+ <div class="rich-svg-1813462456-terminal-title-tab">Command: stop</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1813462456-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze stop [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-verify-image.svg b/images/breeze/output-verify-image.svg
index 2f07f67ad7..96302da9db 100644
--- a/images/breeze/output-verify-image.svg
+++ b/images/breeze/output-verify-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-2410044435-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-2410044435-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-2410044435-terminal-body .blink {
+ animation: rich-svg-2410044435-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-2410044435-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-2410044435-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-2410044435-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-2410044435-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-2410044435-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-2410044435-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-2410044435-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-2410044435-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2410044435-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2410044435-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2410044435-terminal-wrapper">
+ <div class="rich-svg-2410044435-terminal">
+ <div class="rich-svg-2410044435-terminal-header">
+ <svg class="rich-svg-2410044435-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: verify-image</div>
+ <div class="rich-svg-2410044435-terminal-title-tab">Command: verify-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-2410044435-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze verify-image [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-verify-prod-image.svg b/images/breeze/output-verify-prod-image.svg
index 4560031a3b..b491d5e76e 100644
--- a/images/breeze/output-verify-prod-image.svg
+++ b/images/breeze/output-verify-prod-image.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-3971506160-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-3971506160-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-3971506160-terminal-body .blink {
+ animation: rich-svg-3971506160-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-3971506160-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-3971506160-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-3971506160-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-3971506160-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-3971506160-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-3971506160-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-3971506160-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-3971506160-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3971506160-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3971506160-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3971506160-terminal-wrapper">
+ <div class="rich-svg-3971506160-terminal">
+ <div class="rich-svg-3971506160-terminal-header">
+ <svg class="rich-svg-3971506160-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: verify-prod-image</div>
+ <div class="rich-svg-3971506160-terminal-title-tab">Command: verify-prod-image</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-3971506160-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze verify-prod-image [OPTIONS] [EXTRA_PYTEST_ARGS]... </span></div>
<div><span class="r2"> </span></div>
diff --git a/images/breeze/output-version.svg b/images/breeze/output-version.svg
index ee6657d3c6..6ee36e351a 100644
--- a/images/breeze/output-version.svg
+++ b/images/breeze/output-version.svg
@@ -2,7 +2,7 @@
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Regular"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
@@ -10,46 +10,46 @@
font-weight: 400;
}
@font-face {
- font-family: "Fira Code";
+ font-family: "Rich Fira Code";
src: local("FiraCode-Bold"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
font-style: bold;
font-weight: 700;
}
- span {
+ .rich-svg-1810271890-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
- font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- a {
+ .rich-svg-1810271890-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .blink {
- animation: blinker 1s infinite;
+ .rich-svg-1810271890-terminal-body .blink {
+ animation: rich-svg-1810271890-blinker 1s infinite;
}
- @keyframes blinker {
+ @keyframes rich-svg-1810271890-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- #wrapper {
+ .rich-svg-1810271890-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- #terminal {
+ .rich-svg-1810271890-terminal {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
background-color: #0c0c0c;
border-radius: 14px;
- outline: 1px solid #484848;
+ box-shadow: 0 0 0 1px #484848;
}
- #terminal:after {
+ .rich-svg-1810271890-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- #terminal-header {
+ .rich-svg-1810271890-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- #terminal-title-tab {
+ .rich-svg-1810271890-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,35 +85,35 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- #terminal-traffic-lights {
+ .rich-svg-1810271890-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- #terminal-body {
+ .rich-svg-1810271890-terminal-body {
line-height: 22px;
padding: 14px;
}
- .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ .rich-svg-1810271890-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-1810271890-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1810271890-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1810271890-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-1810271890-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-1810271890-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div id="wrapper">
- <div id="terminal">
- <div id='terminal-header'>
- <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-1810271890-terminal-wrapper">
+ <div class="rich-svg-1810271890-terminal">
+ <div class="rich-svg-1810271890-terminal-header">
+ <svg class="rich-svg-1810271890-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div id="terminal-title-tab">Command: version</div>
+ <div class="rich-svg-1810271890-terminal-title-tab">Command: version</div>
</div>
- <div id='terminal-body'>
+ <div class="rich-svg-1810271890-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze version [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
[airflow] 05/09: Cleaner default output when breeze starts (#23341)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 53964ccf81beec1bcde1253107deeee9accbc95b
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Apr 29 00:06:51 2022 +0200
Cleaner default output when breeze starts (#23341)
There was a bit of noise printed when Breeze started:
* information about branch/python/image/backend used
* information about actions performed (like fixing permissions)
* information that docke image build is not needed
* warnings about missing variables
This PR marks all the messages as "info" and only prints them
when --verbose flag is used and it adds default values for the
variables that generated warnings.
(cherry picked from commit dd7002d905c89776c5d92fabd0591c02f2fc19f3)
---
.../src/airflow_breeze/build_image/ci/build_ci_image.py | 12 +++++++-----
.../src/airflow_breeze/build_image/ci/build_ci_params.py | 4 ----
.../airflow_breeze/build_image/prod/build_prod_image.py | 3 +--
.../airflow_breeze/build_image/prod/build_prod_params.py | 3 ---
dev/breeze/src/airflow_breeze/shell/enter_shell.py | 3 ++-
dev/breeze/src/airflow_breeze/shell/shell_params.py | 15 ++++++++-------
.../src/airflow_breeze/utils/docker_command_utils.py | 3 ++-
dev/breeze/src/airflow_breeze/utils/md5_build_check.py | 10 ++++++----
dev/breeze/src/airflow_breeze/utils/run_utils.py | 5 +++--
9 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
index f511c7ac55..9c698a8dab 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
@@ -49,7 +49,7 @@ from airflow_breeze.utils.run_utils import (
)
-def should_we_run_the_build(build_ci_params: BuildCiParams) -> bool:
+def should_we_run_the_build(build_ci_params: BuildCiParams, verbose: bool) -> bool:
"""
Check if we should run the build based on what files have been modified since last build and answer from
the user.
@@ -59,11 +59,14 @@ def should_we_run_the_build(build_ci_params: BuildCiParams) -> bool:
* Builds Image/Skips/Quits depending on the answer
:param build_ci_params: parameters for the build
+ :param verbose: should we get verbose information
"""
# We import those locally so that click autocomplete works
from inputimeout import TimeoutOccurred
- if not md5sum_check_if_build_is_needed(md5sum_cache_dir=build_ci_params.md5sum_cache_dir):
+ if not md5sum_check_if_build_is_needed(
+ md5sum_cache_dir=build_ci_params.md5sum_cache_dir, verbose=verbose
+ ):
return False
try:
answer = user_confirm(message="Do you want to build image?", timeout=5, default_answer=Answer.NO)
@@ -123,7 +126,7 @@ def build_ci_image(
:param with_ci_group: whether to wrap the build in CI logging group
:param ci_image_params: CI image parameters
"""
- fix_group_permissions()
+ fix_group_permissions(verbose=verbose)
if verbose or dry_run:
get_console().print(
f"\n[info]Building CI image of airflow from {AIRFLOW_SOURCES_ROOT} "
@@ -133,9 +136,8 @@ def build_ci_image(
f"Build CI image for Python {ci_image_params.python} " f"with tag: {ci_image_params.image_tag}",
enabled=with_ci_group,
):
- ci_image_params.print_info()
if not ci_image_params.force_build and not ci_image_params.upgrade_to_newer_dependencies:
- if not should_we_run_the_build(build_ci_params=ci_image_params):
+ if not should_we_run_the_build(build_ci_params=ci_image_params, verbose=verbose):
return 0, f"Image build: {ci_image_params.python}"
run_command(
["docker", "rmi", "--no-prune", "--force", ci_image_params.airflow_image_name],
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
index af37c71dbe..0619fb59f7 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_params.py
@@ -23,7 +23,6 @@ from typing import List, Optional
from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
from airflow_breeze.global_constants import get_airflow_version
-from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import BUILD_CACHE_DIR
@@ -148,9 +147,6 @@ class BuildCiParams:
def md5sum_cache_dir(self) -> Path:
return Path(BUILD_CACHE_DIR, self.airflow_branch, self.python, "CI")
- def print_info(self):
- get_console().print(f"CI Image: {self.airflow_version} Python: {self.python}.")
-
REQUIRED_CI_IMAGE_ARGS = [
"python_base_image",
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
index 967a655899..0e589eca72 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
@@ -143,7 +143,7 @@ def build_production_image(
:param with_ci_group: whether to wrap the build in CI logging group
:param prod_image_params: PROD image parameters
"""
- fix_group_permissions()
+ fix_group_permissions(verbose=verbose)
if verbose or dry_run:
get_console().print(
f"\n[info]Building PROD image of airflow from {AIRFLOW_SOURCES_ROOT} "
@@ -154,7 +154,6 @@ def build_production_image(
f"with tag: {prod_image_params.image_tag}",
enabled=with_ci_group,
):
- prod_image_params.print_info()
if prod_image_params.cleanup_context:
clean_docker_context_files(verbose=verbose, dry_run=dry_run)
check_docker_context_files(prod_image_params.install_packages_from_context)
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
index 91a06e6e3f..22cf039ff7 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_params.py
@@ -238,9 +238,6 @@ class BuildProdParams:
def airflow_image_readme_url(self):
return "https://raw.githubusercontent.com/apache/airflow/main/docs/docker-stack/README.md"
- def print_info(self):
- get_console().print(f"CI Image: {self.airflow_version} Python: {self.python}.")
-
@property
def airflow_pre_cached_pip_packages(self) -> str:
airflow_pre_cached_pip = 'true'
diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
index 511d306516..b7f9da4e58 100644
--- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py
+++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
@@ -122,7 +122,8 @@ def run_shell_with_build_image_checks(
)
ci_image_params = BuildCiParams(python=shell_params.python, upgrade_to_newer_dependencies=False)
if build_ci_image_check_cache.exists():
- get_console().print(f'[info]{shell_params.the_image_type} image already built locally.[/]')
+ if verbose:
+ get_console().print(f'[info]{shell_params.the_image_type} image already built locally.[/]')
else:
get_console().print(
f'[warning]{shell_params.the_image_type} image not built locally. Forcing build.[/]'
diff --git a/dev/breeze/src/airflow_breeze/shell/shell_params.py b/dev/breeze/src/airflow_breeze/shell/shell_params.py
index 7d7f1daf53..28e9478317 100644
--- a/dev/breeze/src/airflow_breeze/shell/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/shell/shell_params.py
@@ -143,13 +143,14 @@ class ShellParams:
return sqlite_url
def print_badge_info(self):
- get_console().print(f'Use {self.the_image_type} image')
- get_console().print(f'Branch Name: {self.airflow_branch}')
- get_console().print(f'Docker Image: {self.airflow_image_name_with_tag}')
- get_console().print(f'Airflow source version:{self.airflow_version}')
- get_console().print(f'Python Version: {self.python}')
- get_console().print(f'Backend: {self.backend} {self.backend_version}')
- get_console().print(f'Airflow used at runtime: {self.use_airflow_version}')
+ if self.verbose:
+ get_console().print(f'[info]Use {self.the_image_type} image[/]')
+ get_console().print(f'[info]Branch Name: {self.airflow_branch}[/]')
+ get_console().print(f'[info]Docker Image: {self.airflow_image_name_with_tag}[/]')
+ get_console().print(f'[info]Airflow source version:{self.airflow_version}[/]')
+ get_console().print(f'[info]Python Version: {self.python}[/]')
+ get_console().print(f'[info]Backend: {self.backend} {self.backend_version}[/]')
+ get_console().print(f'[info]Airflow used at runtime: {self.use_airflow_version}[/]')
@property
def compose_files(self):
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 813ad67ea2..579e74aa18 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -440,6 +440,7 @@ def update_expected_environment_variables(env: Dict[str, str]) -> None:
:param env: environment variables to update with missing values if not set.
"""
set_value_to_default_if_not_set(env, 'ANSWER', "")
+ set_value_to_default_if_not_set(env, 'AIRFLOW_EXTRAS', "")
set_value_to_default_if_not_set(env, 'BREEZE', "true")
set_value_to_default_if_not_set(env, 'CI', "false")
set_value_to_default_if_not_set(env, 'CI_BUILD_ID', "0")
@@ -475,9 +476,9 @@ def update_expected_environment_variables(env: Dict[str, str]) -> None:
set_value_to_default_if_not_set(env, 'TEST_TYPE', "")
set_value_to_default_if_not_set(env, 'UPGRADE_TO_NEWER_DEPENDENCIES', "false")
set_value_to_default_if_not_set(env, 'USE_PACKAGES_FROM_DIST', "false")
- set_value_to_default_if_not_set(env, '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")
+ set_value_to_default_if_not_set(env, 'VERSION_SUFFIX_FOR_PYPI', "")
set_value_to_default_if_not_set(env, 'WHEEL_VERSION', "0.36.2")
diff --git a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
index d0933e3c2c..0071c0c8e3 100644
--- a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
+++ b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
@@ -86,11 +86,12 @@ def calculate_md5_checksum_for_files(
return modified_files, not_modified_files
-def md5sum_check_if_build_is_needed(md5sum_cache_dir: Path) -> bool:
+def md5sum_check_if_build_is_needed(md5sum_cache_dir: Path, verbose: bool) -> bool:
"""
Checks if build is needed based on whether important files were modified.
:param md5sum_cache_dir: directory where cached md5 sums are stored
+ :param verbose: should we print verbose information
:return: True if build is needed.
"""
build_needed = False
@@ -104,9 +105,10 @@ def md5sum_check_if_build_is_needed(md5sum_cache_dir: Path) -> bool:
get_console().print('\n[warning]Likely CI image needs rebuild[/]\n')
build_needed = True
else:
- get_console().print(
- 'Docker image build is not needed for CI build as no important files are changed!'
- )
+ if verbose:
+ get_console().print(
+ '[info]Docker image build is not needed for CI build as no important files are changed![/]'
+ )
return build_needed
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index cc2d679584..92cf8c8c76 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -211,9 +211,10 @@ def change_directory_permission(directory_to_fix: Path):
@working_directory(AIRFLOW_SOURCES_ROOT)
-def fix_group_permissions():
+def fix_group_permissions(verbose: bool):
"""Fixes permissions of all the files and directories that have group-write access."""
- get_console().print("[info]Fixing group permissions[/]")
+ if verbose:
+ get_console().print("[info]Fixing group permissions[/]")
files_to_fix_result = run_command(['git', 'ls-files', './'], capture_output=True, text=True)
if files_to_fix_result.returncode == 0:
files_to_fix = files_to_fix_result.stdout.strip().split('\n')
[airflow] 04/09: resolving conflict (#23052)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 4a12b5b0a9ae09afe33a0e79155a5807e111567d
Author: Bowrna <ma...@gmail.com>
AuthorDate: Fri Apr 29 01:01:49 2022 +0530
resolving conflict (#23052)
(cherry picked from commit 94c3203e86252ed120d624a70aed571b57083ea4)
---
BREEZE.rst | 23 +++-
.../airflow_breeze/commands/developer_commands.py | 35 +++++-
dev/breeze/src/airflow_breeze/shell/enter_shell.py | 42 ++++++-
images/breeze/output-commands.svg | 3 +-
images/breeze/output-exec.svg | 133 +++++++++++++++++++++
5 files changed, 227 insertions(+), 9 deletions(-)
diff --git a/BREEZE.rst b/BREEZE.rst
index 37b47f29cf..c9f44c90c5 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -472,7 +472,14 @@ Those are commands mostly used by contributors:
* Initialize local virtualenv with ``./scripts/tools/initialize_virtualenv.py`` command
* Run static checks with autocomplete support ``breeze static-checks`` command
* Run test specified with ``./breeze-legacy tests`` command
-* Join running interactive shell with ``./breeze-legacy exec`` command
+* Build CI docker image with ``breeze build-image`` command
+* Cleanup breeze with ``breeze cleanup`` command
+* Run static checks with autocomplete support ``breeze static-checks`` command
+* Run test specified with ``./breeze-legacy tests`` command
+
+Additional management tasks:
+
+* Join running interactive shell with ``breeze exec`` command
* Stop running interactive environment with ``breeze stop`` command
* Execute arbitrary docker-compose command with ``./breeze-legacy docker-compose`` command
@@ -580,8 +587,7 @@ capability of creating multiple virtual terminals and multiplex between them. Mo
found at `tmux GitHub wiki page <https://github.com/tmux/tmux/wiki>`_ . Tmux has several useful shortcuts
that allow you to split the terminals, open new tabs etc - it's pretty useful to learn it.
-Here is the part of Breeze video which is relevant (note that it refers to the old ``./breeze-legacy``
-command but it is very similar to current ``breeze`` command):
+Here is the part of Breeze video which is relevant:
.. raw:: html
@@ -595,12 +601,11 @@ command but it is very similar to current ``breeze`` command):
Another way is to exec into Breeze terminal from the host's terminal. Often you can
have multiple terminals in the host (Linux/MacOS/WSL2 on Windows) and you can simply use those terminals
-to enter the running container. It's as easy as launching ``./breeze-legacy exec`` while you already started the
+to enter the running container. It's as easy as launching ``breeze exec`` while you already started the
Breeze environment. You will be dropped into bash and environment variables will be read in the same
way as when you enter the environment. You can do it multiple times and open as many terminals as you need.
-Here is the part of Breeze video which is relevant (note that it refers to the old ``./breeze-legacy``
-command and it is not yet available in the current ``breeze`` command):
+Here is the part of Breeze video which is relevant:
.. raw:: html
@@ -612,6 +617,12 @@ command and it is not yet available in the current ``breeze`` command):
</div>
+Those are all available flags of ``exec`` command:
+
+.. image:: ./images/breeze/output-exec.svg
+ :width: 100%
+ :alt: Breeze exec
+
Additional tools
----------------
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index e44c360b6c..f2c8715f95 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -50,7 +50,7 @@ from airflow_breeze.global_constants import (
get_available_packages,
)
from airflow_breeze.pre_commit_ids import PRE_COMMIT_LIST
-from airflow_breeze.shell.enter_shell import enter_shell
+from airflow_breeze.shell.enter_shell import enter_shell, find_airflow_container
from airflow_breeze.shell.shell_params import ShellParams
from airflow_breeze.utils.confirm import set_forced_answer
from airflow_breeze.utils.console import get_console
@@ -66,6 +66,7 @@ DEVELOPER_COMMANDS = {
"commands": [
"shell",
"start-airflow",
+ "exec",
"stop",
"build-docs",
"static-checks",
@@ -144,6 +145,9 @@ DEVELOPER_PARAMETERS = {
],
},
],
+ "breeze exec": [
+ {"name": "Drops in the interactive shell of active airflow container"},
+ ],
"breeze stop": [
{
"name": "Stop flags",
@@ -478,3 +482,32 @@ class DocBuildParams:
for single_filter in self.package_filter:
doc_args.extend(["--package-filter", single_filter])
return doc_args
+
+
+@main.command(name='exec', help='Joins the interactive shell of running airflow container')
+@option_verbose
+@option_dry_run
+@click.argument('exec_args', nargs=-1, type=click.UNPROCESSED)
+def exec(verbose: bool, dry_run: bool, exec_args: Tuple):
+ container_running = find_airflow_container(verbose, dry_run)
+ if container_running:
+ cmd_to_run = [
+ "docker",
+ "exec",
+ "-it",
+ container_running,
+ "/opt/airflow/scripts/docker/entrypoint_exec.sh",
+ ]
+ if exec_args:
+ cmd_to_run.extend(exec_args)
+ process = run_command(
+ cmd_to_run,
+ verbose=verbose,
+ dry_run=dry_run,
+ check=False,
+ no_output_dump_on_exception=False,
+ text=True,
+ )
+ if not process:
+ sys.exit(1)
+ sys.exit(process.returncode)
diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
index c9d93abb3d..511d306516 100644
--- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py
+++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
@@ -18,7 +18,7 @@
import subprocess
import sys
from pathlib import Path
-from typing import Dict, Union
+from typing import Dict, Optional, Union
from airflow_breeze import global_constants
from airflow_breeze.build_image.ci.build_ci_image import build_ci_image
@@ -137,3 +137,43 @@ def run_shell_with_build_image_checks(
if cmd_added is not None:
cmd.extend(['-c', cmd_added])
return run_command(cmd, verbose=verbose, dry_run=dry_run, env=env_variables, text=True)
+
+
+def stop_exec_on_error(returncode: int):
+ get_console().print('\n[error]ERROR in finding the airflow docker-compose process id[/]\n')
+ sys.exit(returncode)
+
+
+def find_airflow_container(verbose, dry_run) -> Optional[str]:
+ exec_shell_params = ShellParams(verbose=verbose, dry_run=dry_run)
+ check_docker_resources(verbose, exec_shell_params.airflow_image_name, dry_run)
+ exec_shell_params.print_badge_info()
+ env_variables = construct_env_variables_docker_compose_command(exec_shell_params)
+ cmd = ['docker-compose', 'ps', '--all', '--filter', 'status=running', 'airflow']
+ docker_compose_ps_command = run_command(
+ cmd,
+ verbose=verbose,
+ dry_run=dry_run,
+ text=True,
+ capture_output=True,
+ env=env_variables,
+ # print output if run in verbose mode to better diagnose problems.
+ no_output_dump_on_exception=not verbose,
+ )
+ if dry_run:
+ return "CONTAINER_ID"
+ if docker_compose_ps_command.returncode != 0:
+ stop_exec_on_error(docker_compose_ps_command.returncode)
+ return None
+
+ output = docker_compose_ps_command.stdout
+ container_info = output.strip().split('\n')
+ if container_info:
+ container_running = container_info[-1].split(' ')[0]
+ if container_running.startswith('-'):
+ # On docker-compose v1 we get '--------' as output here
+ stop_exec_on_error(docker_compose_ps_command.returncode)
+ return container_running
+ else:
+ stop_exec_on_error(1)
+ return None
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index e5cdec13fb..23ecba4348 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1814" viewBox="0 0 1720.0 1814"
+<svg width="1720.0" height="1836" viewBox="0 0 1720.0 1836"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -146,6 +146,7 @@
<div><span class="r4">╭─ Developer tools ────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> shell </span><span class="r1"> </span><span class="r1">Enter breeze.py environment. this is the default command use when no other is selected.</span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> start-airflow </span><span class="r1"> </span><span class="r1">Enter breeze.py environment and starts all Airflow components in the tmux session. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> exec </span><span class="r1"> </span><span class="r1">Joins the interactive shell of running airflow container </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> stop </span><span class="r1"> </span><span class="r1">Stop running breeze environment. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> build-docs </span><span class="r1"> </span><span class="r1">Build documentation in the container. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5"> static-checks </span><span class="r1"> </span><span class="r1">Run static checks. </span><span class="r1"> </span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
diff --git a/images/breeze/output-exec.svg b/images/breeze/output-exec.svg
new file mode 100644
index 0000000000..9e8900f0fb
--- /dev/null
+++ b/images/breeze/output-exec.svg
@@ -0,0 +1,133 @@
+<svg width="1720.0" height="582" viewBox="0 0 1720.0 582"
+ xmlns="http://www.w3.org/2000/svg">
+ <style>
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+ span {
+ display: inline-block;
+ white-space: pre;
+ vertical-align: top;
+ font-size: 18px;
+ font-family:'Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
+ }
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+ .blink {
+ animation: blinker 1s infinite;
+ }
+ @keyframes blinker {
+ from { opacity: 1.0; }
+ 50% { opacity: 0.3; }
+ to { opacity: 1.0; }
+ }
+ #wrapper {
+ padding: 140px;
+ padding-top: 100px;
+ }
+ #terminal {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background-color: #0c0c0c;
+ border-radius: 14px;
+ outline: 1px solid #484848;
+ }
+ #terminal:after {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ content: '';
+ border-radius: 14px;
+ background: rgb(71,77,102);
+ background: linear-gradient(90deg, #804D69 0%, #4E4B89 100%);
+ transform: rotate(-4.5deg);
+ z-index: -1;
+ }
+ #terminal-header {
+ position: relative;
+ width: 100%;
+ background-color: #2e2e2e;
+ margin-bottom: 12px;
+ font-weight: bold;
+ border-radius: 14px 14px 0 0;
+ color: #f2f2f2;
+ font-size: 18px;
+ box-shadow: inset 0px -1px 0px 0px #4e4e4e,
+ inset 0px -4px 8px 0px #1a1a1a;
+ }
+ #terminal-title-tab {
+ display: inline-block;
+ margin-top: 14px;
+ margin-left: 124px;
+ font-family: sans-serif;
+ padding: 14px 28px;
+ border-radius: 6px 6px 0 0;
+ background-color: #0c0c0c;
+ box-shadow: inset 0px 1px 0px 0px #4e4e4e,
+ 0px -4px 4px 0px #1e1e1e,
+ inset 1px 0px 0px 0px #4e4e4e,
+ inset -1px 0px 0px 0px #4e4e4e;
+ }
+ #terminal-traffic-lights {
+ position: absolute;
+ top: 24px;
+ left: 20px;
+ }
+ #terminal-body {
+ line-height: 22px;
+ padding: 14px;
+ }
+ .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+ </style>
+ <foreignObject x="0" y="0" width="100%" height="100%">
+ <body xmlns="http://www.w3.org/1999/xhtml">
+ <div id="wrapper">
+ <div id="terminal">
+ <div id='terminal-header'>
+ <svg id="terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="14" cy="8" r="8" fill="#ff6159"/>
+ <circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
+ <circle cx="62" cy="8" r="8" fill="#28c941"/>
+ </svg>
+ <div id="terminal-title-tab">Command: exec</div>
+ </div>
+ <div id='terminal-body'>
+ <div><span class="r2"> </span></div>
+<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze exec [OPTIONS] [EXEC_ARGS]... </span></div>
+<div><span class="r2"> </span></div>
+<div><span class="r1"> </span><span class="r1">Joins the interactive shell of running airflow container </span><span class="r1"> </span></div>
+<div><span class="r1"> </span></div>
+<div><span class="r4">╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--verbose</span><span class="r1"> </span><span class="r6">-v</span><span class="r1"> </span><span class="r1">Print verbose information about performed steps. </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--dry-run</span><span class="r1"> </span><span class="r6">-D</span><span class="r1"> </span><span class="r1">If dry-run is set, commands are only printed, not executed. </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--help</span><span class="r1"> </span><span class="r6">-h</span><span class="r1"> </span><span class="r1">Show this message and exit. </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>
+<div><span class="r1"></span><span class="r1"> </span></div>
+ </div>
+ </div>
+ </div>
+ </body>
+ </foreignObject>
+</svg>
[airflow] 09/09: Add missing --for-production parameter for new breeze docs building (#23376)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 072d441f0b3659d1a63ca029bc72886ea3e05686
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Sat Apr 30 13:55:11 2022 +0200
Add missing --for-production parameter for new breeze docs building (#23376)
(cherry picked from commit da91d28c1846bed5d40f7c12e4b314c5f7beb812)
---
.../airflow_breeze/commands/developer_commands.py | 12 +++++
images/breeze/output-build-docs.svg | 53 +++++++++++-----------
2 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 13ed9c5937..b665ee1685 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -165,6 +165,7 @@ DEVELOPER_PARAMETERS = {
"options": [
"--docs-only",
"--spellcheck-only",
+ "--for-production",
"--package-filter",
],
},
@@ -323,6 +324,12 @@ def start_airflow(
@option_github_repository
@click.option('-d', '--docs-only', help="Only build documentation.", is_flag=True)
@click.option('-s', '--spellcheck-only', help="Only run spell checking.", is_flag=True)
+@click.option(
+ '-p',
+ '--for-production',
+ help="Builds documentation for official release i.e. all links point to stable version.",
+ is_flag=True,
+)
@click.option(
'-p',
'--package-filter',
@@ -336,6 +343,7 @@ def build_docs(
github_repository: str,
docs_only: bool,
spellcheck_only: bool,
+ for_production: bool,
package_filter: Tuple[str],
):
"""Build documentation in the container."""
@@ -345,6 +353,7 @@ def build_docs(
package_filter=package_filter,
docs_only=docs_only,
spellcheck_only=spellcheck_only,
+ for_production=for_production,
)
extra_docker_flags = get_extra_docker_flags(MOUNT_SELECTED)
env = construct_env_variables_docker_compose_command(params)
@@ -476,6 +485,7 @@ class DocBuildParams:
package_filter: Tuple[str]
docs_only: bool
spellcheck_only: bool
+ for_production: bool
@property
def args_doc_builder(self) -> List[str]:
@@ -484,6 +494,8 @@ class DocBuildParams:
doc_args.append("--docs-only")
if self.spellcheck_only:
doc_args.append("--spellcheck-only")
+ if self.for_production:
+ doc_args.append("--for-production")
if self.package_filter and len(self.package_filter) > 0:
for single_filter in self.package_filter:
doc_args.extend(["--package-filter", single_filter])
diff --git a/images/breeze/output-build-docs.svg b/images/breeze/output-build-docs.svg
index d01d3ecf1c..1e1ed98b7c 100644
--- a/images/breeze/output-build-docs.svg
+++ b/images/breeze/output-build-docs.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1550" viewBox="0 0 1720.0 1550"
+<svg width="1720.0" height="1572" viewBox="0 0 1720.0 1572"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -17,30 +17,30 @@
font-style: bold;
font-weight: 700;
}
- .rich-svg-3399521216-terminal-wrapper span {
+ .rich-svg-2744519006-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- .rich-svg-3399521216-terminal-wrapper a {
+ .rich-svg-2744519006-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .rich-svg-3399521216-terminal-body .blink {
- animation: rich-svg-3399521216-blinker 1s infinite;
+ .rich-svg-2744519006-terminal-body .blink {
+ animation: rich-svg-2744519006-blinker 1s infinite;
}
- @keyframes rich-svg-3399521216-blinker {
+ @keyframes rich-svg-2744519006-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- .rich-svg-3399521216-terminal-wrapper {
+ .rich-svg-2744519006-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- .rich-svg-3399521216-terminal {
+ .rich-svg-2744519006-terminal {
position: relative;
display: flex;
flex-direction: column;
@@ -49,7 +49,7 @@
border-radius: 14px;
box-shadow: 0 0 0 1px #484848;
}
- .rich-svg-3399521216-terminal:after {
+ .rich-svg-2744519006-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- .rich-svg-3399521216-terminal-header {
+ .rich-svg-2744519006-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- .rich-svg-3399521216-terminal-title-tab {
+ .rich-svg-2744519006-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- .rich-svg-3399521216-terminal-traffic-lights {
+ .rich-svg-2744519006-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- .rich-svg-3399521216-terminal-body {
+ .rich-svg-2744519006-terminal-body {
line-height: 22px;
padding: 14px;
}
- .rich-svg-3399521216-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-3399521216-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2744519006-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2744519006-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div class="rich-svg-3399521216-terminal-wrapper">
- <div class="rich-svg-3399521216-terminal">
- <div class="rich-svg-3399521216-terminal-header">
- <svg class="rich-svg-3399521216-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2744519006-terminal-wrapper">
+ <div class="rich-svg-2744519006-terminal">
+ <div class="rich-svg-2744519006-terminal-header">
+ <svg class="rich-svg-2744519006-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div class="rich-svg-3399521216-terminal-title-tab">Command: build-docs</div>
+ <div class="rich-svg-2744519006-terminal-title-tab">Command: build-docs</div>
</div>
- <div class="rich-svg-3399521216-terminal-body">
+ <div class="rich-svg-2744519006-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze build-docs [OPTIONS] </span></div>
<div><span class="r2"> </span></div>
@@ -123,6 +123,7 @@
<div><span class="r4">╭─ Doc flags ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--docs-only</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Only build documentation. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--spellcheck-only</span><span class="r1"> </span><span class="r6">-s</span><span class="r1"> </span><span class="r1">Only run spell checking. </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--for-production</span><span class="r1"> </span><span class="r6">-p</span><span class="r1"> </span><span class="r1">Builds documentation for official release i.e. all links point to stable version. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--package-filter</span><span class="r1"> </span><span class="r6">-p</span><span class="r1"> </span><span class="r1">List of packages to consider. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r7">(apache-airflow | apache-airflow-providers | apache-airflow-providers-airbyte | </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r7">apache-airflow-providers-alibaba | apache-airflow-providers-amazon | </span><span class="r1"> </span><span class="r4">│</span></div>
[airflow] 08/09: When exec fails in breeze we do not print stack-trace (#23342)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit c514758c0eb6e537194148d3f21e275f6cba9c97
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Sat Apr 30 11:13:34 2022 +0200
When exec fails in breeze we do not print stack-trace (#23342)
When you run exec and breeze is not running, there was a stack
trace printed rather than straightforward error message.
This fixes it - stacktrace is only printed now when verbose is
used. If not just error message is printed.
(cherry picked from commit e5ac9d8d0bb1c6b6ac7570d572acff2e86b8a29d)
---
dev/breeze/src/airflow_breeze/shell/enter_shell.py | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/shell/enter_shell.py b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
index b7f9da4e58..3f6ff5b1b2 100644
--- a/dev/breeze/src/airflow_breeze/shell/enter_shell.py
+++ b/dev/breeze/src/airflow_breeze/shell/enter_shell.py
@@ -152,18 +152,14 @@ def find_airflow_container(verbose, dry_run) -> Optional[str]:
env_variables = construct_env_variables_docker_compose_command(exec_shell_params)
cmd = ['docker-compose', 'ps', '--all', '--filter', 'status=running', 'airflow']
docker_compose_ps_command = run_command(
- cmd,
- verbose=verbose,
- dry_run=dry_run,
- text=True,
- capture_output=True,
- env=env_variables,
- # print output if run in verbose mode to better diagnose problems.
- no_output_dump_on_exception=not verbose,
+ cmd, verbose=verbose, dry_run=dry_run, text=True, capture_output=True, env=env_variables, check=False
)
if dry_run:
return "CONTAINER_ID"
if docker_compose_ps_command.returncode != 0:
+ if verbose:
+ get_console().print(docker_compose_ps_command.stdout)
+ get_console().print(docker_compose_ps_command.stderr)
stop_exec_on_error(docker_compose_ps_command.returncode)
return None
[airflow] 07/09: Fix mssql in the new Breeze (#23368)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 75301c42424db67bfeb2d199b7d024483988fe4a
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Apr 29 19:45:37 2022 +0200
Fix mssql in the new Breeze (#23368)
The new Breeze did not use conditionally debian version to run
MsSQL docker compose.
This PR fixes it
(cherry picked from commit 9e11d208dac0951d4f3a5beda0d8801f4e70cb0a)
---
.../airflow_breeze/commands/developer_commands.py | 6 +++
dev/breeze/src/airflow_breeze/commands/main.py | 2 +
.../src/airflow_breeze/shell/shell_params.py | 9 +++-
images/breeze/output-commands.svg | 53 +++++++++++-----------
images/breeze/output-shell.svg | 53 +++++++++++-----------
5 files changed, 70 insertions(+), 53 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index f2c8715f95..13ed9c5937 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -27,6 +27,7 @@ from airflow_breeze.commands.common_options import (
option_answer,
option_backend,
option_db_reset,
+ option_debian_version,
option_dry_run,
option_force_build,
option_forward_credentials,
@@ -84,6 +85,7 @@ DEVELOPER_PARAMETERS = {
"--postgres-version",
"--mysql-version",
"--mssql-version",
+ "--debian-version",
"--forward-credentials",
"--db-reset",
],
@@ -107,6 +109,7 @@ DEVELOPER_PARAMETERS = {
"--postgres-version",
"--mysql-version",
"--mssql-version",
+ "--debian-version",
"--forward-credentials",
"--db-reset",
],
@@ -192,6 +195,7 @@ DEVELOPER_PARAMETERS = {
@option_dry_run
@option_python
@option_backend
+@option_debian_version
@option_github_repository
@option_postgres_version
@option_mysql_version
@@ -214,6 +218,7 @@ def shell(
postgres_version: str,
mysql_version: str,
mssql_version: str,
+ debian_version: str,
forward_credentials: bool,
mount_sources: str,
use_airflow_version: str,
@@ -244,6 +249,7 @@ def shell(
db_reset=db_reset,
extra_args=extra_args,
answer=answer,
+ debian_version=debian_version,
)
diff --git a/dev/breeze/src/airflow_breeze/commands/main.py b/dev/breeze/src/airflow_breeze/commands/main.py
index 6434e5a63e..22baa02edd 100644
--- a/dev/breeze/src/airflow_breeze/commands/main.py
+++ b/dev/breeze/src/airflow_breeze/commands/main.py
@@ -19,6 +19,7 @@ from airflow_breeze.commands.common_options import (
option_answer,
option_backend,
option_db_reset,
+ option_debian_version,
option_dry_run,
option_force_build,
option_forward_credentials,
@@ -45,6 +46,7 @@ from airflow_breeze.utils.path_utils import create_directories
@option_postgres_version
@option_mysql_version
@option_mssql_version
+@option_debian_version
@option_forward_credentials
@option_force_build
@option_use_airflow_version
diff --git a/dev/breeze/src/airflow_breeze/shell/shell_params.py b/dev/breeze/src/airflow_breeze/shell/shell_params.py
index 28e9478317..129ef46097 100644
--- a/dev/breeze/src/airflow_breeze/shell/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/shell/shell_params.py
@@ -22,6 +22,7 @@ from typing import Optional, Tuple
from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
from airflow_breeze.global_constants import (
ALLOWED_BACKENDS,
+ ALLOWED_DEBIAN_VERSIONS,
ALLOWED_MSSQL_VERSIONS,
ALLOWED_MYSQL_VERSIONS,
ALLOWED_POSTGRES_VERSIONS,
@@ -51,6 +52,7 @@ class ShellParams:
mysql_version: str = ALLOWED_MYSQL_VERSIONS[0]
backend: str = ALLOWED_BACKENDS[0]
python: str = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
+ debian_version: str = ALLOWED_DEBIAN_VERSIONS[0]
dry_run: bool = False
load_example_dags: bool = False
load_default_connections: bool = False
@@ -156,7 +158,12 @@ class ShellParams:
def compose_files(self):
compose_ci_file = []
main_ci_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/base.yml"
- backend_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}.yml"
+ if self.backend == "mssql":
+ backend_docker_compose_file = (
+ f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}-{self.debian_version}.yml"
+ )
+ else:
+ backend_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}.yml"
backend_port_docker_compose_file = (
f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}-port.yml"
)
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index ce8af6ddff..66b560b308 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1836" viewBox="0 0 1720.0 1836"
+<svg width="1720.0" height="1858" viewBox="0 0 1720.0 1858"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -17,30 +17,30 @@
font-style: bold;
font-weight: 700;
}
- .rich-svg-1828580335-terminal-wrapper span {
+ .rich-svg-3448604350-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- .rich-svg-1828580335-terminal-wrapper a {
+ .rich-svg-3448604350-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .rich-svg-1828580335-terminal-body .blink {
- animation: rich-svg-1828580335-blinker 1s infinite;
+ .rich-svg-3448604350-terminal-body .blink {
+ animation: rich-svg-3448604350-blinker 1s infinite;
}
- @keyframes rich-svg-1828580335-blinker {
+ @keyframes rich-svg-3448604350-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- .rich-svg-1828580335-terminal-wrapper {
+ .rich-svg-3448604350-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- .rich-svg-1828580335-terminal {
+ .rich-svg-3448604350-terminal {
position: relative;
display: flex;
flex-direction: column;
@@ -49,7 +49,7 @@
border-radius: 14px;
box-shadow: 0 0 0 1px #484848;
}
- .rich-svg-1828580335-terminal:after {
+ .rich-svg-3448604350-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- .rich-svg-1828580335-terminal-header {
+ .rich-svg-3448604350-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- .rich-svg-1828580335-terminal-title-tab {
+ .rich-svg-3448604350-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- .rich-svg-1828580335-terminal-traffic-lights {
+ .rich-svg-3448604350-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- .rich-svg-1828580335-terminal-body {
+ .rich-svg-3448604350-terminal-body {
line-height: 22px;
padding: 14px;
}
- .rich-svg-1828580335-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3448604350-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div class="rich-svg-1828580335-terminal-wrapper">
- <div class="rich-svg-1828580335-terminal">
- <div class="rich-svg-1828580335-terminal-header">
- <svg class="rich-svg-1828580335-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3448604350-terminal-wrapper">
+ <div class="rich-svg-3448604350-terminal">
+ <div class="rich-svg-3448604350-terminal-header">
+ <svg class="rich-svg-3448604350-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div class="rich-svg-1828580335-terminal-title-tab">Breeze commands</div>
+ <div class="rich-svg-3448604350-terminal-title-tab">Breeze commands</div>
</div>
- <div class="rich-svg-1828580335-terminal-body">
+ <div class="rich-svg-3448604350-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze [OPTIONS] COMMAND [ARGS]... </span></div>
<div><span class="r2"> </span></div>
@@ -126,6 +126,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--postgres-version</span><span class="r1"> </span><span class="r6">-P</span><span class="r1"> </span><span class="r1">Version of Postgres used.</span><span class="r1"> </span><span class="r7">(>10< | 11 | 12 | 13)</span><span class="r1"> </span><span class="r4">[default: 10]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mysql-version</span><span class="r1"> </span><span class="r6">-M</span><span class="r1"> </span><span class="r1">Version of MySQL used.</span><span class="r1"> </span><span class="r7">(>5.7< | 8)</span><span class="r1"> </span><span class="r4">[default: 5.7]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mssql-version</span><span class="r1"> </span><span class="r6">-S</span><span class="r1"> </span><span class="r1">Version of MsSQL used.</span><span class="r1"> </span><span class="r7">(>2017-latest< | 2019-latest)</span><span class="r1"> </span><span class="r4">[default: 2017-latest]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--forward-credentials</span><span class="r1"> </span><span class="r6">-f</span><span class="r1"> </span><span class="r1">Forward local credentials to container when running. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--db-reset</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Reset DB when entering the container. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>
diff --git a/images/breeze/output-shell.svg b/images/breeze/output-shell.svg
index c0a7da761a..aee6d87e98 100644
--- a/images/breeze/output-shell.svg
+++ b/images/breeze/output-shell.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1022" viewBox="0 0 1720.0 1022"
+<svg width="1720.0" height="1044" viewBox="0 0 1720.0 1044"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -17,30 +17,30 @@
font-style: bold;
font-weight: 700;
}
- .rich-svg-379414012-terminal-wrapper span {
+ .rich-svg-2505769163-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- .rich-svg-379414012-terminal-wrapper a {
+ .rich-svg-2505769163-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .rich-svg-379414012-terminal-body .blink {
- animation: rich-svg-379414012-blinker 1s infinite;
+ .rich-svg-2505769163-terminal-body .blink {
+ animation: rich-svg-2505769163-blinker 1s infinite;
}
- @keyframes rich-svg-379414012-blinker {
+ @keyframes rich-svg-2505769163-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- .rich-svg-379414012-terminal-wrapper {
+ .rich-svg-2505769163-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- .rich-svg-379414012-terminal {
+ .rich-svg-2505769163-terminal {
position: relative;
display: flex;
flex-direction: column;
@@ -49,7 +49,7 @@
border-radius: 14px;
box-shadow: 0 0 0 1px #484848;
}
- .rich-svg-379414012-terminal:after {
+ .rich-svg-2505769163-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- .rich-svg-379414012-terminal-header {
+ .rich-svg-2505769163-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- .rich-svg-379414012-terminal-title-tab {
+ .rich-svg-2505769163-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- .rich-svg-379414012-terminal-traffic-lights {
+ .rich-svg-2505769163-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- .rich-svg-379414012-terminal-body {
+ .rich-svg-2505769163-terminal-body {
line-height: 22px;
padding: 14px;
}
- .rich-svg-379414012-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2505769163-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div class="rich-svg-379414012-terminal-wrapper">
- <div class="rich-svg-379414012-terminal">
- <div class="rich-svg-379414012-terminal-header">
- <svg class="rich-svg-379414012-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2505769163-terminal-wrapper">
+ <div class="rich-svg-2505769163-terminal">
+ <div class="rich-svg-2505769163-terminal-header">
+ <svg class="rich-svg-2505769163-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div class="rich-svg-379414012-terminal-title-tab">Command: shell</div>
+ <div class="rich-svg-2505769163-terminal-title-tab">Command: shell</div>
</div>
- <div class="rich-svg-379414012-terminal-body">
+ <div class="rich-svg-2505769163-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze shell [OPTIONS] [EXTRA_ARGS]... </span></div>
<div><span class="r2"> </span></div>
@@ -128,6 +128,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--postgres-version</span><span class="r1"> </span><span class="r6">-P</span><span class="r1"> </span><span class="r1">Version of Postgres used.</span><span class="r1"> </span><span class="r7">(>10< | 11 | 12 | 13)</span><span class="r1"> </span><span class="r4">[default: 10]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mysql-version</span><span class="r1"> </span><span class="r6">-M</span><span class="r1"> </span><span class="r1">Version of MySQL used.</span><span class="r1"> </span><span class="r7">(>5.7< | 8)</span><span class="r1"> </span><span class="r4">[default: 5.7]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mssql-version</span><span class="r1"> </span><span class="r6">-S</span><span class="r1"> </span><span class="r1">Version of MsSQL used.</span><span class="r1"> </span><span class="r7">(>2017-latest< | 2019-latest)</span><span class="r1"> </span><span class="r4">[default: 2017-latest]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--forward-credentials</span><span class="r1"> </span><span class="r6">-f</span><span class="r1"> </span><span class="r1">Forward local credentials to container when running. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--db-reset</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Reset DB when entering the container. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>
[airflow] 01/09: Fix empty image preparation (#23304)
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit c4f6886485901a61efd3f5790638ea8f33f9b635
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Apr 27 23:33:52 2022 +0200
Fix empty image preparation (#23304)
Empty image preparation failed in CI because it was impossible to
build an empty image without buildkit. This change sets DOCKER_BUILDKIT
variable for empty image build which make it always use the buildkit.
(cherry picked from commit 4f6fe727a1af609595523bec4d1e6943f5e9075f)
---
dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py | 4 ++++
dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
index b1922521d3..7c1bca1eb1 100644
--- a/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/ci/build_ci_image.py
@@ -16,6 +16,7 @@
# under the License.
import multiprocessing as mp
+import os
import sys
from typing import List, Tuple
@@ -155,6 +156,8 @@ def build_ci_image(
production_image=False,
)
if ci_image_params.empty_image:
+ env = os.environ.copy()
+ env['DOCKER_BUILDKIT'] = "1"
console.print(f"\n[blue]Building empty CI Image for Python {ci_image_params.python}\n")
cmd = construct_empty_docker_build_command(image_params=ci_image_params)
build_result = run_command(
@@ -164,6 +167,7 @@ def build_ci_image(
dry_run=dry_run,
cwd=AIRFLOW_SOURCES_ROOT,
text=True,
+ env=env,
)
else:
console.print(f"\n[blue]Building CI Image for Python {ci_image_params.python}\n")
diff --git a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
index 3323ff0f5f..2caeeb7ef5 100644
--- a/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
+++ b/dev/breeze/src/airflow_breeze/build_image/prod/build_prod_image.py
@@ -16,6 +16,7 @@
# under the License.
"""Command to build PROD image."""
import contextlib
+import os
import sys
from typing import Tuple
@@ -169,6 +170,8 @@ def build_production_image(
)
console.print(f"\n[blue]Building PROD Image for Python {prod_image_params.python}\n")
if prod_image_params.empty_image:
+ env = os.environ.copy()
+ env['DOCKER_BUILDKIT'] = "1"
console.print(f"\n[blue]Building empty PROD Image for Python {prod_image_params.python}\n")
cmd = construct_empty_docker_build_command(image_params=prod_image_params)
build_command_result = run_command(
@@ -179,6 +182,7 @@ def build_production_image(
cwd=AIRFLOW_SOURCES_ROOT,
check=False,
text=True,
+ env=env,
)
else:
cmd = construct_docker_build_command(