Release v1.25.0
Large Drive downloads no longer buffer in RAM, stored attachments stop surviving forever across restarts, calendar event times carry an unambiguous weekday, and tools now accept camelCase argument names from clients that mirror Google's API field names.
What's Changed
- enh(gdrive/gmail/core): stream Drive downloads to a temp file in 8 MB chunks and adopt them into attachment storage with the new
save_attachment_from_path()(ashutil.move, so it stays memory-safe across filesystems) instead of buffering the whole payload. A multi-gigabyte download now costs one chunk of RAM rather than a full copy (#994). Stored files also keep the full UUID in their name, closing a case where a truncated 8-char prefix let two attachments silently overwrite each other, and HTML sends now build theirtext/plainalternative withhtml_to_text_preserving_breaks()so non-HTML clients see real paragraph breaks instead ofFirst paragraph.Second paragraph.by @taylorwilsdon in #1022 - fix(attachments): sweep the storage directory by file mtime, on
get_attachment_storage()and as part ofcleanup_expired(), so attachments written before a restart actually expire. Expiry previously lived only in the in-memory metadata dict, which meant a restart orphaned every file already on disk with nothing left to ever delete it by @justadityaraj in #1028 - fix(calendar): annotate
get_eventsstart/end boundaries with the offset-local weekday (2026-08-18T09:00:00-04:00 [weekday: Tuesday; ISO weekday: 2]) and mark all-day ends as exclusive, so a model reading the response stops deriving the wrong day from a raw RFC 3339 string. Values that don't match RFC 3339 (or Google's all-dayYYYY-MM-DD) pass through untouched by @TheMachineAiden in #1025 - fix(core): add
CamelCaseArgumentsMiddleware, which renames camelCase tool arguments (calendarId,timeMin,maxResults, ...) onto their snake_case parameters. Every tool declaresadditionalProperties: false, so callers echoing Google's field names used to fail schema validation before the request ever reached Google (#918). A key is only renamed when it isn't itself a declared parameter, its snake_case form is, and the caller didn't also pass the snake_case key, so existing callers and genuinely invalid arguments behave exactly as before by @Bortlesboat in #921
New Contributors
- @TheMachineAiden made their first contribution in #1025
Full Changelog: v1.24.1...v1.25.0