#!/usr/bin/env python3 """ Change Log Manager Manages a change.log file with external and internal changes """ import os from datetime import datetime from enum import Enum class ChangeType(Enum): EXTERNAL = "EXTERNAL" INTERNAL = "INTERNAL" class ChangeLogManager: def __init__(self, log_file="change.log"): self.log_file = log_file self._ensure_log_exists() def _ensure_log_exists(self): """Create the log file if it doesn't exist""" if not os.path.exists(self.log_file): with open(self.log_file, 'w') as f: f.write("# Change Log\n") f.write(f"# Created: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n") def add_change(self, change_type, description): """ Add a change entry to the log Args: change_type (ChangeType): Type of change (EXTERNAL or INTERNAL) description (str): Description of the change """ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') entry = f"[{timestamp}] [{change_type.value}] {description}\n" with open(self.log_file, 'a') as f: f.write(entry) print(f"āœ“ Change added: {change_type.value} - {description}") def view_log(self, filter_type=None): """ View the change log with optional filtering Args: filter_type (ChangeType, optional): Filter by change type """ if not os.path.exists(self.log_file): print("No change log found.") return with open(self.log_file, 'r') as f: lines = f.readlines() print("\n" + "="*70) print("CHANGE LOG") print("="*70 + "\n") for line in lines: if filter_type and f"[{filter_type.value}]" not in line: continue print(line, end='') print("\n" + "="*70 + "\n") def get_statistics(self): """Display statistics about the change log""" if not os.path.exists(self.log_file): print("No change log found.") return with open(self.log_file, 'r') as f: lines = f.readlines() external_count = sum(1 for line in lines if "[EXTERNAL]" in line) internal_count = sum(1 for line in lines if "[INTERNAL]" in line) total = external_count + internal_count print("\n" + "="*40) print("CHANGE LOG STATISTICS") print("="*40) print(f"Total changes: {total}") print(f"External changes: {external_count}") print(f"Internal changes: {internal_count}") print("="*40 + "\n") def main(): manager = ChangeLogManager() while True: print("\nšŸ“ Change Log Manager") print("1. Add External Change") print("2. Add Internal Change") print("3. View All Changes") print("4. View External Changes Only") print("5. View Internal Changes Only") print("6. Show Statistics") print("7. Exit") choice = input("\nSelect an option (1-7): ").strip() if choice == '1': description = input("Enter external change description: ").strip() if description: manager.add_change(ChangeType.EXTERNAL, description) else: print("Description cannot be empty.") elif choice == '2': description = input("Enter internal change description: ").strip() if description: manager.add_change(ChangeType.INTERNAL, description) else: print("Description cannot be empty.") elif choice == '3': manager.view_log() elif choice == '4': manager.view_log(filter_type=ChangeType.EXTERNAL) elif choice == '5': manager.view_log(filter_type=ChangeType.INTERNAL) elif choice == '6': manager.get_statistics() elif choice == '7': print("Goodbye!") break else: print("Invalid option. Please select 1-7.") if __name__ == "__main__": main()