ungana

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | README

commit 280d98e6ef6336b3d709f799ea170e9c4344e691
parent f19d97fcf29574f56f785174225f42c66481eef7
Author: Carlosokumu <carlosokumu254@gmail.com>
Date:   Fri, 15 Aug 2025 16:39:47 +0300

add logging, implement ical updates

Diffstat:
Mcalendarapp/cmd/args_parser.py | 71++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
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