Skip to content

Commit 2220ba5

Browse files
authored
refactor: optimize logging for performance (#191)
2 parents 0793aad + 784956e commit 2220ba5

File tree

15 files changed

+455
-209
lines changed

15 files changed

+455
-209
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## v1.1.3-alpha
45
## v1.1.2-alpha
56
## v1.1.0-alpha
67
### BREAKING CHANGES

my_unicorn/auth.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,27 @@
1414

1515
logger = get_logger(__name__)
1616

17-
# Set SecretService as the preferred keyring backend
18-
try:
19-
keyring.set_keyring(SecretService.Keyring())
20-
logger.debug("SecretService backend set as the preferred keyring backend")
21-
except Exception as e:
22-
logger.warning("Failed to set SecretService as the preferred keyring backend: %s", e)
17+
# Track keyring initialization to avoid redundant setup
18+
_keyring_initialized: bool = False
19+
20+
21+
def setup_keyring() -> None:
22+
"""Set SecretService as the preferred keyring backend and log the result."""
23+
global _keyring_initialized
24+
25+
if _keyring_initialized:
26+
return
27+
28+
try:
29+
keyring.set_keyring(SecretService.Keyring())
30+
logger.debug("SecretService backend set as the preferred keyring backend")
31+
_keyring_initialized = True
32+
except Exception as e:
33+
logger.warning("Failed to set SecretService as the preferred keyring backend: %s", e)
34+
35+
36+
# Initialize the keyring backend
37+
setup_keyring()
2338

2439

2540
class GitHubAuthManager:
@@ -93,7 +108,7 @@ def get_rate_limit_status(self) -> dict[str, int | None]:
93108
),
94109
}
95110

96-
#TODO: implement this method to install logics
111+
# TODO: implement this method to install logics
97112
def should_wait_for_rate_limit(self) -> bool:
98113
"""Check if we should wait due to rate limiting."""
99114
if self._remaining_requests is None:

my_unicorn/backup.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ def load(self) -> dict[str, Any]:
5050
with open(self.metadata_file, encoding="utf-8") as f:
5151
return json.load(f)
5252
except (json.JSONDecodeError, OSError) as e:
53-
logger.warning(f"Corrupted metadata file {self.metadata_file}: {e}")
53+
logger.warning("Corrupted metadata file %s: %s", self.metadata_file, e)
5454
# Create backup of corrupted file
5555
corrupted_backup = self.metadata_file.with_suffix(".json.corrupted")
5656
if self.metadata_file.exists():
5757
shutil.copy2(self.metadata_file, corrupted_backup)
58-
logger.info(f"Backed up corrupted metadata to {corrupted_backup}")
58+
logger.info("Backed up corrupted metadata to %s", corrupted_backup)
5959
return {"versions": {}}
6060

6161
def save(self, metadata: dict[str, Any]) -> None:
@@ -83,7 +83,7 @@ def save(self, metadata: dict[str, Any]) -> None:
8383

8484
# Atomic move
8585
temp_path.replace(self.metadata_file)
86-
logger.debug(f"Saved metadata to {self.metadata_file}")
86+
logger.debug("Saved metadata to %s", self.metadata_file)
8787

8888
def add_version(self, version: str, filename: str, file_path: Path) -> None:
8989
"""Add a version entry to metadata with checksum.
@@ -108,7 +108,7 @@ def add_version(self, version: str, filename: str, file_path: Path) -> None:
108108
}
109109

110110
self.save(metadata)
111-
logger.debug(f"Added version {version} to metadata")
111+
logger.debug("Added version %s to metadata", version)
112112

113113
def get_latest_version(self) -> str | None:
114114
"""Get the latest version from metadata.
@@ -178,7 +178,7 @@ def remove_version(self, version: str) -> bool:
178178
if version in metadata["versions"]:
179179
del metadata["versions"][version]
180180
self.save(metadata)
181-
logger.debug(f"Removed version {version} from metadata")
181+
logger.debug("Removed version %s from metadata", version)
182182
return True
183183
return False
184184

@@ -199,15 +199,18 @@ def verify_backup_integrity(self, version: str, file_path: Path) -> bool:
199199

200200
stored_hash = version_info.get("sha256")
201201
if not stored_hash:
202-
logger.warning(f"No checksum stored for version {version}")
202+
logger.warning("No checksum stored for version %s", version)
203203
return False
204204

205205
actual_hash = self._calculate_sha256(file_path)
206206
is_valid = actual_hash == stored_hash
207207

208208
if not is_valid:
209209
logger.error(
210-
f"Integrity check failed for {file_path}: expected {stored_hash}, got {actual_hash}"
210+
"Integrity check failed for %s: expected %s, got %s",
211+
file_path,
212+
stored_hash,
213+
actual_hash,
211214
)
212215

213216
return is_valid
@@ -300,7 +303,7 @@ def create_backup(
300303
metadata = BackupMetadata(app_backup_dir)
301304
metadata.add_version(version, backup_filename, backup_path)
302305

303-
logger.info(f"💾 Backup created: {backup_path} (v{version})")
306+
logger.info("💾 Backup created: %s (v%s)", backup_path, version)
304307

305308
# Cleanup old backups after successful backup
306309
self._cleanup_old_backups_for_app(app_name, app_backup_dir)
@@ -311,7 +314,7 @@ def create_backup(
311314
# Cleanup temp file on error
312315
if temp_path.exists():
313316
temp_path.unlink()
314-
logger.error(f"Failed to create backup for {app_name}: {e}")
317+
logger.error("Failed to create backup for %s: %s", app_name, e)
315318
raise
316319

317320
def restore_latest_backup(self, app_name: str, destination_dir: Path) -> Path | None:
@@ -338,15 +341,15 @@ def restore_latest_backup(self, app_name: str, destination_dir: Path) -> Path |
338341
app_backup_dir = backup_base_dir / app_name
339342

340343
if not app_backup_dir.exists():
341-
logger.warning(f"No backup directory found for {app_name}")
344+
logger.warning("No backup directory found for %s", app_name)
342345
return None
343346

344347
# Get latest version from metadata
345348
metadata = BackupMetadata(app_backup_dir)
346349
latest_version = metadata.get_latest_version()
347350

348351
if not latest_version:
349-
logger.warning(f"No backup versions found for {app_name}")
352+
logger.warning("No backup versions found for %s", app_name)
350353
return None
351354

352355
return self._restore_specific_version(app_name, latest_version, destination_dir)
@@ -388,39 +391,39 @@ def _restore_specific_version(
388391
app_backup_dir = backup_base_dir / app_name
389392

390393
if not app_backup_dir.exists():
391-
logger.error(f"No backup directory found for {app_name}")
394+
logger.error("No backup directory found for %s", app_name)
392395
return None
393396

394397
# Get version info from metadata
395398
metadata = BackupMetadata(app_backup_dir)
396399
version_info = metadata.get_version_info(version)
397400

398401
if not version_info:
399-
logger.error(f"Version {version} not found for {app_name}")
402+
logger.error("Version %s not found for %s", version, app_name)
400403
return None
401404

402405
backup_filename = version_info["filename"]
403406
backup_path = app_backup_dir / backup_filename
404407

405408
if not backup_path.exists():
406-
logger.error(f"Backup file not found: {backup_path}")
409+
logger.error("Backup file not found: %s", backup_path)
407410
return None
408411

409412
# Verify backup integrity
410413
if not metadata.verify_backup_integrity(version, backup_path):
411-
logger.error(f"Backup integrity check failed for {app_name} v{version}")
414+
logger.error("Backup integrity check failed for %s v%s", app_name, version)
412415
return None
413416

414417
# Get app config to determine proper filename and current version
415418
app_config = self.config_manager.load_app_config(app_name)
416419
if not app_config:
417-
logger.error(f"App configuration not found for {app_name}")
420+
logger.error("App configuration not found for %s", app_name)
418421
return None
419422

420423
# Validate app config structure
421424
if "appimage" not in app_config:
422425
logger.error(
423-
f"Invalid app configuration for {app_name}: missing 'appimage' section"
426+
"Invalid app configuration for %s: missing 'appimage' section", app_name
424427
)
425428
return None
426429

@@ -437,20 +440,20 @@ def _restore_specific_version(
437440
# If current AppImage exists, backup it first with its current version
438441
current_version = appimage_config.get("version", "unknown")
439442
if destination_path.exists() and current_version != version:
440-
logger.info(f"Backing up current version {current_version} before restore...")
443+
logger.info("Backing up current version %s before restore...", current_version)
441444
try:
442445
current_backup_path = self.create_backup(
443446
destination_path, app_name, current_version
444447
)
445448
if current_backup_path:
446-
logger.info(f"Current version backed up to: {current_backup_path}")
449+
logger.info("Current version backed up to: %s", current_backup_path)
447450
else:
448451
logger.warning(
449452
"Failed to backup current version, continuing with restore..."
450453
)
451454
except Exception as e:
452455
logger.warning(
453-
f"Failed to backup current version: {e}, continuing with restore..."
456+
"Failed to backup current version: %s, continuing with restore...", e
454457
)
455458

456459
# Restore file atomically
@@ -481,20 +484,20 @@ def _restore_specific_version(
481484
# Save updated config
482485
try:
483486
self.config_manager.save_app_config(app_name, app_config)
484-
logger.debug(f"Updated app config for {app_name} with version {version}")
487+
logger.debug("Updated app config for %s with version %s", app_name, version)
485488
except Exception as e:
486-
logger.error(f"Failed to update app config for {app_name}: {e}")
489+
logger.error("Failed to update app config for %s: %s", app_name, e)
487490
# Continue anyway, as the file restore was successful
488491

489-
logger.info(f"🔄 Restored {app_name} v{version} to {destination_path}")
492+
logger.info("🔄 Restored %s v%s to %s", app_name, version, destination_path)
490493
logger.info("📝 Updated app configuration with restored version")
491494
return destination_path
492495

493496
except Exception as e:
494497
# Cleanup temp file on error
495498
if temp_path.exists():
496499
temp_path.unlink()
497-
logger.error(f"Failed to restore {app_name} v{version}: {e}")
500+
logger.error("Failed to restore %s v%s: %s", app_name, version, e)
498501
raise
499502

500503
def get_backup_info(self, app_name: str) -> list[dict[str, Any]]:
@@ -586,7 +589,7 @@ def _cleanup_old_backups_for_app(self, app_name: str, app_backup_dir: Path) -> N
586589
backup_path = app_backup_dir / version_info["filename"]
587590
if backup_path.exists():
588591
backup_path.unlink()
589-
logger.info(f"Removed backup: {backup_path}")
592+
logger.info("Removed backup: %s", backup_path)
590593
metadata.remove_version(version)
591594

592595
# Remove metadata file and directory if empty
@@ -610,9 +613,9 @@ def _cleanup_old_backups_for_app(self, app_name: str, app_backup_dir: Path) -> N
610613
try:
611614
backup_path.unlink()
612615
metadata.remove_version(version)
613-
logger.info(f"Removed old backup: {backup_path} (v{version})")
616+
logger.info("Removed old backup: %s (v%s)", backup_path, version)
614617
except Exception as e:
615-
logger.error(f"Failed to remove backup {backup_path}: {e}")
618+
logger.error("Failed to remove backup %s: %s", backup_path, e)
616619

617620
def migrate_old_backups(self) -> int:
618621
"""Migrate old flat backup structure to new folder-based structure.
@@ -633,7 +636,7 @@ def migrate_old_backups(self) -> int:
633636
logger.debug("No old backups found to migrate")
634637
return 0
635638

636-
logger.info(f"🔄 Migrating {len(old_backups)} old backups to new format...")
639+
logger.info("🔄 Migrating %d old backups to new format...", len(old_backups))
637640

638641
migrated_count = 0
639642

@@ -696,17 +699,17 @@ def migrate_old_backups(self) -> int:
696699
metadata.add_version(version, new_filename, new_path)
697700

698701
migrated_count += 1
699-
logger.debug(f"Migrated {old_backup} -> {new_path}")
702+
logger.debug("Migrated %s -> %s", old_backup, new_path)
700703
else:
701704
# File already exists, remove old backup
702705
old_backup.unlink()
703-
logger.debug(f"Removed duplicate old backup: {old_backup}")
706+
logger.debug("Removed duplicate old backup: %s", old_backup)
704707

705708
except Exception as e:
706-
logger.error(f"Failed to migrate {old_backup}: {e}")
709+
logger.error("Failed to migrate %s: %s", old_backup, e)
707710

708711
if migrated_count > 0:
709-
logger.info(f"✅ Successfully migrated {migrated_count} backups to new format")
712+
logger.info("✅ Successfully migrated %d backups to new format", migrated_count)
710713

711714
return migrated_count
712715

my_unicorn/cli/runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ async def run(self) -> None:
9292
print("\n⏹️ Operation cancelled by user")
9393
sys.exit(1)
9494
except Exception as e:
95-
logger.error(f"Unexpected error: {e}")
95+
logger.error("Unexpected error: %s", e)
9696
print(f"❌ Unexpected error: {e}")
9797
sys.exit(1)
9898

0 commit comments

Comments
 (0)