commit 280d98e6ef6336b3d709f799ea170e9c4344e691
parent f19d97fcf29574f56f785174225f42c66481eef7
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Fri, 15 Aug 2025 16:39:47 +0300
add logging, implement ical updates
Diffstat:
1 file changed, 62 insertions(+), 9 deletions(-)
diff --git a/calendarapp/cmd/args_parser.py b/calendarapp/cmd/args_parser.py
@@ -2,16 +2,27 @@ import argparse
from pathlib import Path
from datetime import datetime
import re
+import logging
from calendarapp.ical.ical_manager import ICalManager
+from calendarapp.logging.logging_manager import LoggingManager
class ArgsParser:
+
def __init__(self):
self.parser = argparse.ArgumentParser(
description="Create a customized iCalendar (.ics) event"
)
self.ical_manager = ICalManager()
- self._add_arguments()
+
+ self._add_logging_arguments()
+
+ temp_args, _ = self.parser.parse_known_args()
+
+ self.logging = LoggingManager(verbose=temp_args.verbose, quiet=temp_args.quiet)
+ self.logger = self.logging.get_logger("ArgsParser")
+
+ self._add_field_arguments()
def _read_file_or_exit(self, file_path: str) -> str:
try:
@@ -44,7 +55,7 @@ class ArgsParser:
)
return duration_str
- def _add_arguments(self):
+ def _add_field_arguments(self):
subparsers = self.parser.add_subparsers(dest='command', required=True)
def add_event_field_args(parser, required_flags=False):
@@ -81,6 +92,13 @@ class ArgsParser:
add_event_field_args(edit_event_parser, required_flags=False)
+ def _add_logging_arguments(self):
+ self.parser.add_argument("-v", "--verbose", action="store_true",
+ help="Enable verbose debug output")
+ self.parser.add_argument("-q", "--quiet", action="store_true",
+ help="Suppress all non-error output")
+
+
def parse_args(self):
"""Parses CLI args and resolves file-based inputs."""
args = self.parser.parse_args()
@@ -112,13 +130,14 @@ class ArgsParser:
'tzid': args.tzid
}
event = self.ical_manager.create_event(event_data)
- self.ical_manager.save_to_file(event, 'event.ics')
+ self.ical_manager.save_ical_file(event, 'event.ics')
if args.command == 'edit':
if not args.ical:
self.parser.error("missing required ical file path to edit")
-
+
+ ical_file_path = args.ical
try:
- cal = self.ical_manager.load_ical_file(args.ical)
+ cal = self.ical_manager.load_ical_file(ical_file_path)
except (FileNotFoundError, ValueError) as e:
self.parser.error("corrupted or missing ical file")
@@ -132,17 +151,45 @@ class ArgsParser:
for idx, e in enumerate(events, start=1):
summary = e.get("SUMMARY", "No title")
start = e.get("DTSTART")
- print(f"{idx}. {summary} — {start.dt if start else 'No date'}")
+ if isinstance(start, list):
+ start = start[0]
+
+ start_str = start.dt if hasattr(start, "dt") else "No date"
+ print(f"{idx}. {summary} — {start_str}")
try:
choice = int(input("\nEnter the number of the event you want to edit: "))
if not (1 <= choice <= len(events)):
raise ValueError
except ValueError:
- print("Invalid selection.")
+ self.parser.error("invalid selection")
+ return
+ except KeyboardInterrupt:
+ self.parser.error("Operation cancelled by user")
return
event = events[choice - 1]
+ # editable_fields = ["SUMMARY", "DESCRIPTION", "LOCATION", "ORGANIZER"]
+ editable_fields = list(event.keys())
+
+ # Optionally filter out fields you don’t want to edit
+ #skip_fields = {"UID", "DTSTAMP", "DTSTART", "DTEND", "DURATION", "RRULE"}
+ skip_fields = {"UID"}
+ editable_fields = [f for f in editable_fields if f not in skip_fields]
+
+ updates = {}
+
+ for field in editable_fields:
+ current_value = event.get(field, "")
+ new_value = input(f"{field} [{current_value}]: ").strip()
+ if new_value:
+ updates[field] = new_value
+
+ if updates:
+ self.ical_manager.update_event(cal, updates, ical_file_path)
+ logging.info("Calendar updated successfully")
+ else:
+ logging.info("No changes made to calendar file")
else:
updates = {}
@@ -162,8 +209,14 @@ class ArgsParser:
if args.description is not None:
updates["DESCRIPTION"] = args.description
- ##TODO: use ical_manager to update the associated ical event file
-
+ if args.organizer is not None:
+ updates["ORGANIZER"] = args.organizer
+ try:
+ self.ical_manager.update_event(cal, updates, ical_file_path)
+ logging.info("Event updated successfully!")
+ except Exception as e:
+ logging.error(f"Event not found: {e}")
+ self.parser.error("An error occurred while updating ical file")
return args
\ No newline at end of file