Skip to content

feat(gcal_sync): 0.5.0 build and valid custom-data namespace - #415

Open
canvas-investigator[bot] wants to merge 1 commit into
mainfrom
gcal-sync-0-5-0-namespace-fix
Open

feat(gcal_sync): 0.5.0 build and valid custom-data namespace#415
canvas-investigator[bot] wants to merge 1 commit into
mainfrom
gcal-sync-0-5-0-namespace-fix

Conversation

@canvas-investigator

@canvas-investigator canvas-investigator Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

🧵 Allison Leitner cc @allisonleitner

What

Updates the gcal_sync plugin package to the 0.5.0 build and fixes an invalid custom-data namespace that blocks fresh installs.

Why

Installing this plugin from main onto a current-platform instance fails during custom-data provisioning:

ValueError: Invalid namespace name: gcal_sync
→ PluginInstallationError → "Failed to install plugin gcal_sync"

The platform requires custom-data namespaces to match ^[a-z][a-z0-9_]*__[a-z][a-z0-9_]*$ (a two-part prefix__name, enforced in canvas-plugins/plugin_runner/namespace.py). The manifest shipped a bare gcal_sync, which fails validation, so provisioning never creates the schema or populates namespace_read_write_access_key. This sets a valid generic namespace, gcalsync__core.

The 0.5.0 build

Brings main up to the 0.5.0 build already running in production deployments — general robustness/scale hardening, no deployment-specific logic:

  • Duplicate-hold protection: new PendingHoldCreate model + InboundEventMapping.last_applied_hash close a cross-calendar race that could mint a second hold for a shared event on webhook replay.
  • Rotating bounded outbound reconcile (reconcile.py): per-calendar locks + last_outbound_synced_at ordering so capped runs rotate across the fleet and converge.
  • Queued + drained "Re-import all" (new ReimportDrainCron, every 2 min): a whole-roster rebuild is enqueued and drained a few providers per tick so each returned effect batch stays small enough to apply reliably.
  • Dry-run preview + expanded admin UI (routes/google_admin.py, templates/google_admin.html).
  • Paginated Google client helpers (list_all_events, find_event_by_private_property).

Schema note: 0.5.0 adds the PendingHoldCreate table and the last_outbound_synced_at / last_applied_hash fields vs 0.4.5. Existing deployments install from their own copies and are unaffected by this namespace value.

Tests

Carries the 0.5.0 pytest suite (updated to match the code). The only edit on top of the production 0.5.0 build is the namespace string, which the fully-mocked unit suite does not exercise — behavior is unchanged from the build already in production. README/docs refresh deferred to a follow-up.

Generated by the Investigator

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant