def update_images(image_list: List[str]): from rich.markup import escape from rich.progress import MofNCompleteColumn, Progress from localstack.utils.container_utils.container_client import ContainerException from localstack.utils.docker_utils import DOCKER_CLIENT updated_count = 0 failed_count = 0 progress = Progress(*Progress.get_default_columns(), MofNCompleteColumn(), transient=True, console=console) with progress: for image in progress.track(image_list, description="Processing image..."): try: updated = False hash_before_pull = DOCKER_CLIENT.inspect_image( image_name=image, pull=False)["Id"] DOCKER_CLIENT.pull_image(image) if (hash_before_pull != DOCKER_CLIENT.inspect_image( image_name=image, pull=False)["Id"]): updated = True updated_count += 1 console.print( f":heavy_check_mark: Image {escape(image)} {'updated' if updated else 'up-to-date'}.", style="bold" if updated else None, highlight=False, ) except ContainerException as e: console.print( f":heavy_multiplication_x: Image {escape(image)} pull failed: {e.message}", style="bold red", highlight=False, ) failed_count += 1 console.rule() console.print( f"Images updated: {updated_count}, Images failed: {failed_count}, total images processed: {len(image_list)}." )
def test_using_default_columns() -> None: # can only check types, as the instances do not '==' each other expected_default_types = [ TextColumn, BarColumn, TaskProgressColumn, TimeRemainingColumn, ] progress = Progress() assert [type(c) for c in progress.columns] == expected_default_types progress = Progress( SpinnerColumn(), *Progress.get_default_columns(), "Elapsed:", TimeElapsedColumn(), ) assert [type(c) for c in progress.columns] == [ SpinnerColumn, *expected_default_types, str, TimeElapsedColumn, ]