Resilience: - RetryTransport with circuit breaker for 429/5xx resilience - Exponential backoff with jitter, respects Retry-After headers - Circuit breaker auto-resets after 30s of successful requests Performance: - Concurrent gmail thread fetching (fixes N+1 query pattern) - Bounded concurrency with semaphore (max 10 parallel) New calendar commands: - colors: list available event/calendar colors - conflicts: check availability across calendars - search: find events by text query - time: show current time in multiple timezones New gmail commands: - autoforward: get/enable/disable auto-forwarding - delegates: list/add/remove mail delegation - filters: list/create/delete inbox filters - forwarding: manage forwarding addresses - sendas: manage send-as aliases - vacation: get/enable/disable vacation responder - batch: bulk operations (mark-read, archive, label, delete) - watch: Pub/Sub push with webhook forwarding New services: - Sheets: read/write/append spreadsheet data - Tasks: manage tasklists and tasks Developer experience: - Shell completion (bash, zsh, fish, powershell) - version command with build info - --debug flag for verbose logging - lefthook for pre-commit hooks Documentation: - Expanded README with examples - Gmail watch/Pub/Sub guide (docs/watch.md) - Architecture spec (docs/spec.md) - Release process (docs/RELEASING.md)
29 lines
631 B
Go
29 lines
631 B
Go
package googleapi
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"google.golang.org/api/sheets/v4"
|
|
|
|
"github.com/steipete/gogcli/internal/googleauth"
|
|
)
|
|
|
|
func NewSheets(ctx context.Context, email string) (*sheets.Service, error) {
|
|
slog.Debug("creating sheets service", "email", email)
|
|
|
|
opts, err := optionsForAccount(ctx, googleauth.ServiceSheets, email)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
svc, err := sheets.NewService(ctx, opts...)
|
|
if err != nil {
|
|
slog.Error("failed to create sheets service", "email", email, "error", err)
|
|
return nil, err
|
|
}
|
|
|
|
slog.Debug("sheets service created successfully", "email", email)
|
|
return svc, nil
|
|
}
|