capcat.core.source_system.enhanced_remove_command
File: Application/capcat/core/source_system/enhanced_remove_command.py
Description
Enhanced remove-source command with advanced features:
- Dry-run mode
- Automatic backups
- Usage analytics
- Batch removal from file
- Undo/restore functionality
Classes
RemovalOptions
Options for source removal.
EnhancedRemoveCommand
Enhanced removal command with analytics, backups, and dry-run support. Extends base RemoveSourceCommand with advanced features.
Methods
init
def __init__(self, base_command: RemoveSourceCommand, backup_manager: SourceBackupManager, analytics: SourceAnalytics, ui: RemovalUserInterface, logger: Optional[any] = None)
Parameters:
selfbase_command(RemoveSourceCommand)backup_manager(SourceBackupManager)analytics(SourceAnalytics)ui(RemovalUserInterface)logger(Optional[any]) optional
execute_with_options
def execute_with_options(self, options: RemovalOptions) -> None
Execute removal with enhanced options.
Args: options: RemovalOptions specifying behavior
Parameters:
selfoptions(RemovalOptions)
Returns: None
execute_undo
def execute_undo(self, backup_id: Optional[str] = None) -> None
Undo a previous removal by restoring from backup.
Args: backup_id: Specific backup to restore (None = most recent)
Parameters:
selfbackup_id(Optional[str]) optional
Returns: None
_execute_enhanced_removal
def _execute_enhanced_removal(self, options: RemovalOptions) -> None
Execute standard interactive removal with enhancements.
Parameters:
selfoptions(RemovalOptions)
Returns: None
⚠️ High complexity: 17
_execute_batch_removal
def _execute_batch_removal(self, options: RemovalOptions) -> None
Execute batch removal from file.
Parameters:
selfoptions(RemovalOptions)
Returns: None
⚠️ High complexity: 14
_create_backup
def _create_backup(self, sources_info: List[SourceRemovalInfo], output_directories: Optional[List[Path]] = None) -> BackupMetadata
Create backup before removal.
Args: sources_info: List of sources being removed output_directories: Optional list of output directories to backup
Parameters:
selfsources_info(List[SourceRemovalInfo])output_directories(Optional[List[Path]]) optional
Returns: BackupMetadata
_show_analytics_summary
def _show_analytics_summary(self, available_sources: List[tuple[str, str]]) -> None
Show analytics summary before removal.
Parameters:
selfavailable_sources(List[tuple[str, str]])
Returns: None
_show_selected_analytics
def _show_selected_analytics(self, sources_info: List[SourceRemovalInfo]) -> None
Show detailed analytics for selected sources.
Parameters:
selfsources_info(List[SourceRemovalInfo])
Returns: None
_show_dry_run_summary
def _show_dry_run_summary(self, sources_info: List[SourceRemovalInfo], output_directories: Optional[List[Path]] = None) -> None
Show what would happen in dry-run mode.
Parameters:
selfsources_info(List[SourceRemovalInfo])output_directories(Optional[List[Path]]) optional
Returns: None
_select_backup_to_restore
def _select_backup_to_restore(self, backups: List[BackupMetadata]) -> Optional[str]
Let user select which backup to restore.
Parameters:
selfbackups(List[BackupMetadata])
Returns: Optional[str]
_scan_output_directories
def _scan_output_directories(self, sources_info: List[SourceRemovalInfo]) -> List[Path]
Scan for output directories matching the sources being removed.
Searches in ../News/ for directories matching source display names or IDs.
Args: sources_info: List of sources being removed
Returns: List of Path objects for matching output directories
Parameters:
selfsources_info(List[SourceRemovalInfo])
Returns: List[Path]
_calculate_directory_size
def _calculate_directory_size(self, directories: List[Path]) -> int
Calculate total size of directories in bytes.
Args: directories: List of directory paths
Returns: Total size in bytes
Parameters:
selfdirectories(List[Path])
Returns: int
_format_size
def _format_size(self, size_bytes: int) -> str
Format byte size as human-readable string.
Args: size_bytes: Size in bytes
Returns: Formatted string (e.g., “2.3 GB”, “45.7 MB”)
Parameters:
selfsize_bytes(int)
Returns: str
_prompt_output_cleanup
def _prompt_output_cleanup(self, directories: List[Path], total_size: int, dry_run: bool, force: bool) -> bool
Prompt user whether to delete output archives.
Args: directories: List of output directories found total_size: Total size in bytes dry_run: Whether in dry-run mode force: Whether to skip prompt
Returns: True if user wants to delete archives
Parameters:
selfdirectories(List[Path])total_size(int)dry_run(bool)force(bool)
Returns: bool
_backup_output_directories
def _backup_output_directories(self, directories: List[Path], backup_path: Path) -> None
Backup output directories before deletion.
Args: directories: List of directories to backup backup_path: Path to backup directory
Parameters:
selfdirectories(List[Path])backup_path(Path)
Returns: None
_delete_output_directories
def _delete_output_directories(self, directories: List[Path]) -> tuple[int, int]
Delete output directories.
Args: directories: List of directories to delete
Returns: Tuple of (number_deleted, total_size_deleted)
Parameters:
selfdirectories(List[Path])
Returns: tuple[int, int]