* feat(gmail): add timezone support for date output Add --timezone and --local flags to gmail search and watch serve commands to control how dates are displayed. By default uses local timezone. Users can specify any IANA timezone (e.g., America/New_York, UTC). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test(gmail): fix execute test for timezone changes Update TestExecute_GmailSearch_JSON to use explicit --timezone UTC flag and expect the correctly converted time (22:04 UTC from 15:04 -0700). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(gmail): add -z short flag for --timezone Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test(gmail): add unit tests for resolveOutputLocation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs(gmail): clarify timezone flag help text Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test(gmail): add timezone conversion tests for formatGmailDateInLocation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(config): add default_timezone setting Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(gmail): support GOG_TIMEZONE env var and config for timezone Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(config): add gog config command for timezone and settings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(calendar): respect GOG_TIMEZONE and config for timezone Update calendar time command to follow the same timezone priority as gmail: 1. --timezone flag (explicit) 2. GOG_TIMEZONE env var 3. Config file default_timezone 4. Fall back to Google Calendar's timezone (calendar-specific fallback) Add getConfiguredTimezone helper that returns nil when no explicit timezone is configured, allowing calendar commands to use their own fallback behavior. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test(gmail): add tests for GOG_TIMEZONE env var and getConfiguredTimezone Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(config): warn on invalid timezone instead of error When default_timezone in config is invalid, print a warning to stderr and fall back to local timezone instead of returning a hard error. Invalid flag/env var still returns errors (user mistake in current session), but invalid config should not break the CLI (stale config). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor(gmail): remove unused formatGmailDate, add nolint directive - Remove unused formatGmailDate wrapper function (all callers use formatGmailDateInLocation directly with explicit location) - Add nolint:nilnil directive to getConfiguredTimezone with explanation that nil return signals caller to use its own fallback Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(timezone): honor --timezone local * refactor(cli): unify config/timezone helpers * test(cmd): isolate config env in timezone tests * refactor(config): centralize config key metadata * fix(config): drop unused key spec lookup * fix(config): standardize config key errors --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Peter Steinberger <steipete@gmail.com>
27 lines
523 B
Go
27 lines
523 B
Go
package cmd
|
|
|
|
import (
|
|
"net/mail"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func formatGmailDateInLocation(raw string, loc *time.Location) string {
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" {
|
|
return ""
|
|
}
|
|
if loc == nil {
|
|
loc = time.Local
|
|
}
|
|
if t, err := mailParseDate(raw); err == nil {
|
|
return t.In(loc).Format("2006-01-02 15:04")
|
|
}
|
|
return raw
|
|
}
|
|
|
|
func mailParseDate(s string) (time.Time, error) {
|
|
// net/mail has the most compatible Date parser, but we keep this isolated for easier tests/mocks later.
|
|
return mail.ParseDate(s)
|
|
}
|