This project is a virtual calendar application designed to mimic the functionality of popular calendar apps such as Google Calendar or Apple iCalendar. The application supports multiple calendars, timezone management, recurring events, conflict handling, and exporting events in Google Calendar–compatible format.
The project follows the MVC architecture and is built using SOLID principles to ensure scalability and maintainability.
- Create and maintain several calendars, each with a unique name.
- Change calendar properties such as name and timezone.
- Switch between calendars using
use calendar.
- Each calendar is associated with a specific timezone (IANA format, e.g.,
America/New_York). - Events inherit the timezone of their calendar.
- Timezone changes automatically affect interpretation of events.
- Create single events with subject, start/end time, description, location, and privacy flag.
- Create all-day events (if no end time specified).
- Support for multi-day events.
- Support recurring events that repeat weekly for a fixed count or until a specific end date.
- Editing of events, including:
- Single instances
- All future instances
- Entire series
- Events cannot overlap within the same calendar.
- Any command that would create or edit a conflicting event is rejected.
- Copy a single event to another calendar at a specified date/time.
- Copy all events on a given day to another calendar.
- Copy all events in a date range to another calendar.
- Events copied across calendars are converted to the target calendar’s timezone.
- List all events scheduled on a specific date.
- List all events within a given date range.
- Check if the user is busy at a specific date and time.
- Export a calendar as a CSV file.
- Format is compatible with Google Calendar import.
- Users interact through text-based commands.
- Supports both interactive mode and headless (batch execution) mode.
Below is an example of creating, editing, querying, and exporting events using the command-based interface:
create event "Hello" from 2025-09-20T12:00 to 2025-09-20T13:00
create event "multi Day Event" from 2025-09-20T12:00 to 2025-09-25T13:00
edit events location "Hello" "Snell"
edit events description "multi Day Event" "big event"
create event "Recurring Event" from 2025-09-11T02:00 to 2025-09-11T02:01 repeats TW for 2 times
print events on "2025-09-20"
export cal events.csv
exit