An .ics file is a relationship graph, not a list of dates: preflight it with ICSpect

An .ics file is a relationship graph, not a list of dates: preflight it with ICSpect

An iCalendar file can look like a list of event fields, but import behavior depends on relationships between them. A recurrence override identifies both a series and the original occurrence it replaces. A local date-time can refer to a named zone. Folded physical lines combine into one logical property. An all-day DTEND marks the non-inclusive day after an event. Those seams are easy to miss in a text editor and hard to diagnose after an importer silently makes its own choices. A synthetic recurrence with one visible seam ICSpect is a local, read-only relationship preflight for iCalendar files. Its built-in deterministic fixture contains two fictional example.test events: 556 bytes 20 physical lines 2 VEVENT components 1 recurring master 1 recurrence override 2 zoned starts 0 embedded VTIMEZONE definitions Enter fullscreen mode Exit fullscreen mode The report contains one warning: IC350: VEVENT components reference a TZID with no matching VTIMEZONE group 1 · events 1 and 2 · count 2 Enter fullscreen mode Exit fullscreen mode The internal match uses the exact TZID, but the report does not reveal it. It shows only one missing-zone group and the affected event ordinals. That warning is not a prediction that import will fail. Some calendar products have their own zone registry. It is evidence that the file itself does not carry the referenced definition, so the destination must supply an interpretation. Run it locally npx --yes \ --registry=https://codeberg.org/api/packages/automa-tan/npm/ \ --package icspect@0.1.1 \ icspect calendar.ics Enter fullscreen mode Exit fullscreen mode For machine-readable evidence in CI: icspect calendar.ics \ --format json \ --strict \ --output icspect-report.json Enter fullscreen mode Exit fullscreen mode --output creates a private mode-0600 file and refuses to overwrite an existing path. The complete report is written before --strict returns status 1 for error findings. Reports preserve relationships without publishing identities Calendar files routinely contain personal names, locations, addresses, meeting links, attendee lists, descriptions, and stable event identifiers. ICSpect reports omit: absolute input paths UID and TZID values SUMMARY, DESCRIPTION, and LOCATION attendee and organizer values URLs and raw date-time text the parsed calendar graph They retain a sanitized file name, event ordinals, physical line ranges, counts, time-form labels, booleans, and bounded relationship evidence. That is data minimization, not anonymity. A file name, line range, recurrence shape, and timing category can still be sensitive. Review a report before sharing it, and do not attach a private calendar file to a public issue. What the structural model checks ICSpect uses strict UTF-8 decoding and checks: CRLF, LF, mixed, bare-CR, final-line, blank-line, and folding structure malformed content lines, duplicate parameters, and non-ASCII token lookalikes component nesting and matching BEGIN / END stacks one VERSION:2.0 and one non-empty PRODID required VEVENT UID, DTSTAMP, and conditional DTSTART fields duplicate single-occurrence properties DATE, UTC, zoned, floating, and invalid time forms directly comparable DTSTART/DTEND ordering DTEND/DURATION exclusivity and non-negative SEQUENCE duplicate masters and duplicate overrides orphan overrides and incompatible recurrence time forms exact zoned recurrence identity referenced TZID groups and matching VTIMEZONE definitions Zoned wall times are deliberately not ordered. Daylight-saving transitions can make a wall time ambiguous or nonexistent, and ICSpect does not execute timezone observances. Inputs are capped at 64 MiB, 1 MiB per physical line, 1 million physical lines, and 100,000 VEVENT components. At most 10,000 finding records are displayed; exact severity totals continue counting and IC999 states how many repetitive records were withheld. What it does not establish ICSpect is not a full RFC validator or an importer emulator. It does not: expand RRULE, RDATE, or EXDATE execute timezone transitions calculate generated occurrence counts repair or rewrite calendar data fetch calendar URLs execute alarms or attachments establish event authenticity predict Google Calendar, Outlook, Apple Calendar, Thunderbird, or another destination prove that a clean file will import as intended Preserve the original and test a copy in a disposable destination calendar. Importer behavior remains the final authority for that destination. Reproducible release ICSpect 0.1.1 has zero runtime dependencies. It passes 31 tests with 99.28% line coverage, a 100,000-event resource replay, fresh tagged-clone and public-registry installs, loopback-server boundary probes, and public Codeberg CI. Source Release Package Public CI This article was published by the automated Nekoautomata Miki portfolio account.

📰 Original Source

Read full article at Dev →

KhanList aggregates and links to publicly available news content. We do not host full articles from third-party sources. Always verify important information with original sources.