Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/icloudpd/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
from icloudpd.server import serve_app
from icloudpd.status import Status, StatusExchange
from icloudpd.string_helpers import parse_timestamp_or_timedelta, truncate_middle
from icloudpd.summary import SummaryTracker
from icloudpd.xmp_sidecar import generate_xmp_file
from pyicloud_ipd.base import PyiCloudService
from pyicloud_ipd.exceptions import PyiCloudAPIResponseException
Expand Down Expand Up @@ -1248,6 +1249,8 @@ def core(
) -> int:
"""Download all iCloud photos to a local directory"""

summary_tracker = SummaryTracker(logger)

raise_error_on_2sa = (
smtp_username is not None
or notification_email is not None
Expand Down Expand Up @@ -1291,6 +1294,8 @@ def core(
logger.info("Authentication completed successfully")
return 0

summary_tracker.start_timer()

if list_libraries:
library_names = (
icloud.photos.private_libraries.keys() | icloud.photos.shared_libraries.keys()
Expand Down Expand Up @@ -1505,4 +1510,6 @@ def should_break(counter: Counter) -> bool:
else:
break # pragma: no cover

summary_tracker.stop_timer()
summary_tracker.print_summary()
return 0
29 changes: 29 additions & 0 deletions src/icloudpd/summary.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Tracks and prints a summary of actions performed"""

import logging
import time
from datetime import timedelta


class SummaryTracker:
"""Tracks and prints a summary of actions performed"""

def __init__(self, logger: logging.Logger) -> None:
self.start_time = 0.0
self.end_time = 0.0
self.logger = logger

def start_timer(self) -> None:
"""Start the timer"""
self.start_time = time.time()

def stop_timer(self) -> None:
"""Stop the timer"""
self.end_time = time.time()

def print_summary(self) -> None:
"""Print the summary"""
elapsed = self.end_time - self.start_time
self.logger.info("\nExecution Summary")
self.logger.info("=================")
self.logger.info("Overall time: %s", timedelta(seconds=round(elapsed)))
23 changes: 23 additions & 0 deletions tests/test_summary.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Tests for the SummaryTracker class"""

from unittest.mock import patch, Mock
from icloudpd.summary import SummaryTracker
from icloudpd.logger import setup_logger


def test_prints_summary():
"""Test that the summary tracker prints the overall time"""
with patch("time.time", side_effect=[1000.0, 1005.0]):
logger = setup_logger()
summary_tracker = SummaryTracker(logger)
summary_tracker.start_timer()
summary_tracker.stop_timer()

mock_logger_info = Mock()
with patch.object(logger, "info", mock_logger_info):
summary_tracker.print_summary()

assert mock_logger_info.call_args_list[0][0][0] == "\nExecution Summary"
assert mock_logger_info.call_args_list[1][0][0] == "================="
assert "Overall time:" in mock_logger_info.call_args_list[2][0][0]
assert mock_logger_info.call_args_list[2][0][1].seconds == 5