diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-19 20:46:23 -0400 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-19 20:46:23 -0400 |
| commit | bcf2bda397d91d7ce0d5ca63db81925e727b6aa7 (patch) | |
| tree | 9fe2330c4927f81cab8e43f37a9f825da5867e90 /modules/dev-fkeys.el | |
| parent | dff492a02c0b7c5bea6037fd77361c98d460c981 (diff) | |
| download | dotemacs-bcf2bda397d91d7ce0d5ca63db81925e727b6aa7.tar.gz dotemacs-bcf2bda397d91d7ce0d5ca63db81925e727b6aa7.zip | |
feat(calendar-sync): add Python helper for Google Calendar API sync
Google's .ics export drops per-occurrence response statuses on recurring events. When OOO auto-declines a meeting, the master event keeps PARTSTAT=ACCEPTED and declined instances inherit it. The .ics path can't filter the declines out. The API path expands recurrences server-side via singleEvents=True, and each occurrence carries its own attendees[].self.responseStatus.
scripts/calendar_sync_api.py fetches events and renders them as org entries. OAuth is one-time per account. The refresh token lives at ~/.config/calendar-sync/token-<account>.json under 0600. Output matches the existing .ics shape: heading sanitization, LOCATION/ORGANIZER/STATUS/URL property drawer, HTML-stripped descriptions, org timestamps with weekday abbreviations.
I wrote 30 stdlib-unittest tests against fixture JSON, covering rendering, filtering, timestamp formatting, and HTML cleanup. I left auth and HTTP uncovered — they're thin wrappers around the Google client libraries, best checked by running the script once after OAuth setup.
docs/calendar-sync-api-setup.org walks through the Google Cloud OAuth client setup and the per-account auth bootstrap. .gitignore picks up Python bytecode now that the project has a Python helper.
The Elisp dispatch (:fetcher 'api routing in calendar-sync.el) lands in a follow-up commit.
Diffstat (limited to 'modules/dev-fkeys.el')
0 files changed, 0 insertions, 0 deletions
