Skip to content

Read calendars through the IETF JMAP URN, with the vendor one as fallback; release 0.4.3 - #86

Merged
karatektus merged 5 commits into
mainfrom
claude/409-ietf-calendars
Oct 27, 2026
Merged

karatektus merged 5 commits into
mainfrom
claude/409-ietf-calendars

Conversation

@karatektus

Copy link
Copy Markdown
Owner

Counterpart to karatektus/pl_mail#409 (step 1, the Android half). That issue stays open on the server side; this is labelled chore, as it is there.

What changes

  • Calendars are read and written through urn:ietf:params:jmap:calendars whenever the session advertises it, and the calendar model is spelled in the draft's names (calendarIds, one recurrenceRule, baseEventId).
  • A server that advertises only urn:plmail:params:jmap:calendars (every plMail before the IETF URN) is still read. CalendarDialect.PLMAIL translates plMail's earlier shape at the edge, so retiring the vendor URN later is deleting that enum entry and Capability.PLMAIL_CALENDARS.
  • Whether an event recurs is read from the server's plmail.org:isRecurring (or isRecurring under the vendor URN), not from the rule: a rule the server could not convert expands to one occurrence.
  • Under the IETF URN a get is chunked by core's maxObjectsInGet, which is what the server allows there.
  • ContactAutocomplete's comment no longer says the server has no Contact/get.
  • Release 0.4.3: VERSION_NAME and the Play release notes.

Needs no newer server: an older one gets the vendor URN. The IETF URN and plmail.org:isRecurring come with karatektus/pl_mail#411, merged into the server's milestone/v0.4.1.

How it was checked

./gradlew :core:jmap:test (74 calendar tests, including the new CalendarDialectTest) and spotlessCheck, locally. :core:data was not run locally, for lack of an Android SDK; its fake server now speaks either URN and refuses the wrong one, with two new tests against a vendor-only server. CI on this pull request runs the whole build. Not run on a device.

Checklist

  • Describes what it changes, against pl_mail#409
  • Tests for the change
  • Formatted and green (CI on this pull request)
  • No new copy
  • Docs updated (fixture README)
  • Server change linked, and works against an older server

Generated by Claude Code

…back

The server now answers its calendar methods under urn:ietf:params:jmap:calendars
in the draft's shape, and plMail's vendor URN is to go once the apps read the
IETF one (pl_mail#409). The app now declares the IETF URN whenever the session
advertises it, and its calendar model is spelled in the draft's names:
calendarIds, one recurrenceRule, baseEventId.

A server released before the IETF URN advertises only the vendor one, so that
is still read: CalendarDialect.PLMAIL translates plMail's earlier shape
(calendarId, recurrenceRules, seriesId) into the draft's at the edge, and back
on a write. Retiring the vendor URN is deleting that enum entry and
Capability.PLMAIL_CALENDARS.

The draft has no isRecurring, so under the IETF URN recurring is read from the
rule, and a create's from the rule that was sent. Under it a get is held to
core's maxObjectsInGet, which is what the server allows there.

Also corrects ContactAutocomplete's comment saying the server has no
Contact/get: it serves RFC 9610 contacts now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXqu9YFt9pfgWBaXXy2zZa
…TF URN

The server now publishes isRecurring under the IETF calendars URN as the
vendor property plmail.org:isRecurring, on CalendarEvent/get and on a
create's answer. The model reads that name, the vendor dialect reads plMail's
plain isRecurring into it, and it is asked for wherever the rule is. So an
imported event whose rule the server could not convert reads as not recurring
again under either URN; only a server that publishes neither still leaves the
rule as the answer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXqu9YFt9pfgWBaXXy2zZa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXqu9YFt9pfgWBaXXy2zZa
@karatektus karatektus added the chore Maintenance: refactoring, tooling, tests, no user-visible change label Oct 27, 2026 — with Claude
@github-actions github-actions Bot added area: mail Concerns mail area: calendar Concerns calendar area: jmap Concerns jmap area: build Concerns build labels Oct 27, 2026
…nd the IETF one's on its own

Three repository tests asserted a hundred events a page and the server's
+2 years horizon, which only the vendor calendars URN publishes; under the IETF
URN a get takes core's maxObjectsInGet and no horizon is published. They now
run against a vendor-only server, and a fourth pins one page of 120 under the
IETF URN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXqu9YFt9pfgWBaXXy2zZa
@karatektus
karatektus merged commit bbd4fa2 into main Oct 27, 2026
4 checks passed
@karatektus
karatektus deleted the claude/409-ietf-calendars branch October 27, 2026 20:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build Concerns build area: calendar Concerns calendar area: jmap Concerns jmap area: mail Concerns mail chore Maintenance: refactoring, tooling, tests, no user-visible change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants