NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1252 most downloaded on PyPI
RFC 5545 compatible parser and generator of iCalendar files
Last release 1 months ago
19 Aug 2026
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
20 years old
90 releases · first in 2006
To view the changes, please see the Changelog . This release can be installed from PyPI .
vBinary.obj is deprecated in favor of vBinary.bytes. It is retained as a lossy string view of the value for backward compatibility, and will be removed in icalendar 8. The test_ical_value_rejects_non_base64_characters test was removed because vBinary.ical_value no longer validates or decodes Base64. @uwezkhan (Issue #1356)
Created an ~cal.journal.Journal.example method for the ~cal.journal.Journal component and an ~cal.free_busy.FreeBusy.example method for the ~cal.free_busy.FreeBusy component, added the 5545 examples that they load, and documented their usage in both class docstrings. AI assistance: Kiro CLI with the claude-opus-5 model was used to draft this change. @Souptik96 (Issue #743)
Add Alarm.new_display(), Alarm.new_audio(), and Alarm.new_email() factory methods for creating 5545#section-3.6.6 VALARM components. @klouds27 (Issue #865)
~icalendar.prop.binary.vBinary now stores the raw bytes of the value internally, so non-UTF-8 binary data round-trips losslessly. With the release of icalendar 7.1.0, and previous to this bug fix, vBinary.ical_value Base64-decoded the raw stored bytes and raised ValueError for non-Base64 input. vBinary.ical_value now returns the raw stored bytes instead of Base64-decoding them, and no longer raises ValueError for non-Base64 input. @uwezkhan (Issue #1356)
Added vBinary.bytes, exposing the raw binary value of a BINARY property. @uwezkhan (Issue #1356)
Added the ~icalendar.error.ICalParsingError exception as a public API for programmatic handling of iCalendar parsing failures. AI assistance: ChatGPT was used to help debug terminal errors encountered during development. @GAUTAMSANSWAL (Issue #1536)
Created a script to automatically generate the ~icalendar.timezone.windows_to_olson module from the Unicode Consortium's CLDR GitHub repository. Added lxml as a new development dependency. Added the target wo to the Makefile to generate the file from the root of the repository with make wo. @stevepiercy (Issue #1548)
Added vBinary.base64data, a getter/setter for the Base64 string view of a BINARY property's value, so callers no longer need to call base64.b64encode or base64.b64decode manually. @gagana2023 (Issue #1550)
Added Alarm.ACTION and AlarmTime.action access to the 5545#section-3.8.6.1 ACTION property. I used OpenAI Codex with GPT-5 to assist with this change, then reviewed and tested the result. @bm1016bm-svg (Issue #1569)
Record the exact CLDR commit used to generate the Windows-to-Olson timezone mapping and fetch the mapping from that pinned revision. I used AI to assist me with this change. @patrickswedish (Issue #1575)
Used vBinary.from_ical() in Image.data for consistent Base64 validation, removing the manual base64.b64decode call. @klouds27 (Issue #1638)
Added REQUEST_STATUS property to ~icalendar.cal.event.Event, ~icalendar.cal.todo.Todo, ~icalendar.cal.journal.Journal, and ~icalendar.cal.free_busy.FreeBusy with request_status parameter in new() constructors per 5545#section-3.8.8.3. I used AI to assist with this change. @SemTiOne (Issue #1666)
Improved ~icalendar.error.ICalParsingError by including optional value, line, and line number information in exception messages for more consistent iCalendar parsing error reporting. AI assistance: ChatGPT was used to help debug terminal errors encountered during development. @GAUTAMSANSWAL
Made ~icalendar.error.JCalParsingError inherit from ~icalendar.error.InvalidCalendar for consistency with ~icalendar.error.ICalParsingError. AI assistance: ChatGPT was used to help debug terminal errors encountered during development. @GAUTAMSANSWAL
Resolve the timezone of a "globally unique" 5545#section-3.2.19 TZID such as /freeassociation.sourceforge.net/Europe/Berlin, which is emitted by some clients, including libical and Evolution. TZP.timezone now strips the leading vendor prefix and resolves the trailing Olson identifier, so the value is parsed as timezone-aware instead of being silently treated as naive. Prepared with AI assistance. @vjsai (Issue #313)
Fixed the equivalent_timezone_ids.py script after the call to generate the timezone Python code was removed. @gjabell (Issue #1392)
Values of unrecognized properties and X- properties without a VALUE parameter were altered by escaping when parsed, serialized, or converted to and from jCal, so they did not round-trip unchanged as 7265 specifies. These values are now preserved verbatim. Additionally, the PROXIMITY property (9074) was treated as an unknown value type instead of TEXT and is now recognized correctly. AI disclosure: I used Claude Code (Anthropic's Claude Opus) to draft and refine this change and its tests; I reviewed the output and validated the change locally. @lcampanella98 (Issue #1445)
Ship funding.json in PyPI source distributions so packaging and test runs from the sdist no longer fail with FileNotFoundError. @Hishamkhashman1 (Issue #1493)
Avoid folding content lines between escape prefixes and their escaped characters. AI disclosure: I used GPT-5 Codex to help draft and refine this change and its tests; I reviewed and validated the output locally. @kingrubic (Issue #1501)
Preserve URI value parameters on a jCal round-trip. vUri.from_jcal previously passed the parameters positionally, but vUri.__new__ takes encoding as its second positional parameter. As a result, the URI value parameters were consumed as encoding and dropped. For example, ATTACH;FMTTYPE=... or CONFERENCE;FEATURE=... lost their parameters. They are now passed as the params keyword. Prepared with the assistance of an AI coding agent (Anthropic's Claude Opus 4.8). @gaoflow (Issue #1526)
Updated the Windows timezone mapping for Mountain Standard Time (Mexico) to America/Mazatlan, so dates after Mexico's 2022 timezone changes use the correct UTC-7 offset instead of UTC-6. Prepared with AI assistance. @RobHannay (Issue #1546)
IMAGE properties now use their explicitly declared VALUE type instead of always being parsed as unknown, while IMAGE without a VALUE parameter remains unknown. I used OpenAI Codex with GPT-5 to assist with this change. @floze-the-genius (Issue #1561)
Removed ATTACH from Alarm.singletons. An "email" VALARM may carry more than one ATTACH per 5545#section-3.6.6, so ATTACH belongs in multiple only; it was previously listed in both singletons and multiple. Added a regression test that singletons and multiple are disjoint for every registered component. Prepared with the assistance of an AI coding agent (Anthropic's Claude Opus 4.8). @vtino17 (Issue #1569)
Alarm.REPEAT, Alarm.repeat, Event.sequence, and Event.priority now reject non-integers (including booleans) with TypeError and negative values with ~icalendar.error.InvalidCalendar. @heyncth (Issue #1594)
Added the missing BINARY member to icalendar.enums.VALUE, per 5545#section-3.2.20. VALUE.BINARY previously raised AttributeError. Prepared with the assistance of an AI coding agent (Anthropic's Claude Opus 4.8). @vtino17 (Issue #1607)
A PERIOD value written with dates instead of datetimes, such as RDATE;VALUE=PERIOD:19970101/19970102, was accepted when a calendar was parsed and then raised an AttributeError when it was written out again, or a TypeError where only one half was a date. Such a value is now read as midnight, in the timezone of the other half where it has one. I used AI to assist me with this change. @lcampanella98 (Issue #1633)
When timezone.use_pytz was in effect, a date parsed with a TZID, such as RDATE;TZID=America/New_York;VALUE=DATE:19970101, was given the timezone's oldest known offset, its local mean time, so the value was minutes off. It is now read with the offset that applied on that date. Calendars read with zoneinfo, the default, were not affected. I used AI to assist me with this change. @lcampanella98 (Issue #1633)
Escape a lone \r as \n in icalendar.parser.string._escape_char, used by vText.to_ical. A carriage return not followed by a line feed was previously left raw in the serialized content line, so a SUMMARY or DESCRIPTION built from untrusted text could carry a control character into the iCalendar stream and split the line for lenient consumers. \r\n and \n were already escaped, and the parameter escaper already mapped \r to ^n. @alhudz (Pull Request #1462)
Reject non-ASCII digits in the ordwk part of ~icalendar.prop.recur.weekday.vWeekday (BYDAY, BYWEEKDAY, and WKST). The value validation regular expression \d matches non-ASCII digits, such as the Arabic-Indic ١٢. A value such as ١٢MO was silently accepted as relative == 12, instead of being rejected, as required by 5545#section-3.3.10 (ordwk = 1*2DIGIT). This mirrors the earlier ~icalendar.prop.recur.month.vMonth fix. Drafted with AI assistance (Claude Opus 4.8); reviewed, tested, and verified by the author. @Labib-Bin-Salam
Reject raw CR and LF in ~icalendar.prop.uri.vUri, ~icalendar.prop.cal_address.vCalAddress, ~icalendar.prop.inline.vInline, and ~icalendar.prop.xml_reference.vXmlReference. These value types are not escaped on serialization, so a lone \r in the value was written straight into the content line, slipping past the newline-only assertion in Contentline and reparsing as a separate property. This was reachable from untrusted jCal via URL, ATTENDEE, and ORGANIZER. @alhudz
jCal property names, parameter names, and RRULE part names are now validated as lowercase iCalendar tokens when parsing jCal (RFC 7265 sections 7265#section-3.4, 7265#section-3.5, and 7265#section-3.6.10). They were kept verbatim and re-emitted into the content line on serialization, so a name containing :, ;, or a lone carriage return could inject parameters or a new content line for consumers that treat a bare \r as a break. @alhudz
Added return type annotations to the new() factory methods of the icalendar.cal components, such as Event.new. @ShirayukiRin (Issue #938)
Added a return type hint to the TZP.use_default method. @Vishwa0223 (Issue #938)
Added type annotations to __init__ methods across the package. @ShirayukiRin (Issue #938)
Added a return type annotation to ~icalendar.alarms.Alarms.add_component. I used OpenAI GPT-5 Codex to identify the scoped method, draft the annotation and test, and review the validation results. @kudala-bharani (Issue #938)
Added a bool return type annotation to ~icalendar.parser.parameter.Parameters.is_utc. I used OpenAI Codex (GPT-5) to identify the method. @Ace-0 (Issue #938)
Improved docstrings in icalendar.error to follow the project's Google-style docstring format, adding Parameters and Returns sections where appropriate. I used AI to assist me with this change. @Vrinda0211 (Issue #1072)
Added a docstring to the ~icalendar.cli.main function to follow the project's Google Style guide. @Areej-cs (Issue #1072)
Documented the construction and truth-value usage of ~icalendar.prop.boolean.vBoolean. I used OpenAI Codex with GPT-5 to assist with drafting and validation. @sahilmathur254 (Issue #1118)
Fixed unqualified ~icalendar.error.InvalidCalendar and ~icalendar.error.IncompleteComponent references in ~icalendar.cal.todo.Todo docstrings so they link in the API docs. I used AI to assist me with this change. @mitre88 (Issue #1158)
Fixed the broken link to Component.to_ical in the documentation of how to handle parsing errors. AI disclosure: used Claude Sonnet 5 with the prompt "Fix broken links to Python objects in parse-errors.rst" to assist with this change. @SemTiOne (Issue #1158)
Replaced RFC copy-paste text in docstrings with Pythonic docstrings for calendar components. @ykd007 (Issue #1244)
Corrected the Journal.new documentation so its parameter list matches the public method signature. I used AI to assist with this change. @w3lld1 (Issue #1473)
Corrected the FreeBusy.new docstring, which described the method as creating an alarm instead of a FreeBusy component. Written with assistance from Claude Opus 4.5 (Anthropic). @andycheng2018 (Issue #1473)
Correct public docstrings whose prose looked like unsupported section headings. This contribution was drafted with AI assistance and reviewed by @kingrubic. (Issue #1481)
Clarified optional parameters and auto-generated UID and DTSTAMP values in the ~icalendar.cal.event.Event.new docstring. AI disclosure: Grok assisted with reviewing RFC terminology and drafting the docstring update. @checkzhao8888 (Issue #1504)
Mention icalendar-anonymizer to remove private information from iCalendar files for bug reports and Python Calendaring Ecosystem as a resource. @stevepiercy (Issue #1511)
Consolidate and alphabetize the docstring parameters of the ~icalendar.cal.alarm.Alarm factory methods ~icalendar.cal.alarm.Alarm.new_display, ~icalendar.cal.alarm.Alarm.new_audio, and ~icalendar.cal.alarm.Alarm.new_email. Prefixed required parameters with Required. @Solaris-star (Issue #1591)
Revised the security policy to use GitHub Security Advisory procedure instead of emailing the Plone security team, and clarified language. @stevepiercy (Issue #1612)
Revised how to document parameters in docstrings, specifically their order of appearance and usage of type hints. Revised guidance to write docstrings only for a class, and not their __init__ or __new__ methods. @stevepiercy (Issue #1618)
Updated the categories property documentation to include the Available and Availability components and its RFC 7953 conformance reference. (Issue #1624)
Changed date-time to datetime in the narrative parts of the RECURRENCE-ID and ACKNOWLEDGED documentation. AI-assisted. @atirna (Issue #1655)
Adapt pull request requirements to better handle AI slop. @stevepiercy
Add an RFC cross-reference and a Returns section to the Contentline.value_separator_index docstring. @alhudz
Added a bullet point for reviewing pull requests to "Examples of how to contribute." @stevepiercy
Consolidate maintainers list with an include. @stevepiercy
Documented how to join the icalendar team. @stevepiercy
Restored the removed docstrings under the ~icalendar.prop.integer.vInt attribute declarations for ~icalendar.prop.integer.vInt.max and ~icalendar.prop.integer.vInt.min. @stevepiercy
Renamed the internal timezone_datetime_property helper in icalendar.attr to _timezone_datetime_property. It was never part of the public API (not listed in __all__) and is only used at import time to build rfc_7953_dtstart_property and rfc_7953_dtend_property, so no deprecation warning was added. I used AI to assist me with this change. @AhmedYoussef98 (Issue #1011)
Added automated tests for docstring structure and quality. @KartavyaDikshit (Issue #1481)
Added zizmor static analysis workflow for GitHub Actions security auditing. @srurora (Issue #1487)
Ensure that news fragment filenames are valid in CI. @stevepiercy (Issue #1499)
Add Commit-Check GitHub Action to detect commits by automated AI agents and bots. @stevepiercy (Issue #1514)
The Windows-to-Olson mapping test now verifies each mapped timezone resolves to the expected identifier. I used OpenAI Codex with GPT-5 to assist with this change. @floze-the-genius (Issue #1562)
Bumped maximum pull request description character count to 1500. Added instructions as comments in the pull request template. @stevepiercy (Issue #1602)
Added a make zizmor target that runs zizmor static analysis on the GitHub Actions workflows in the repository, matching the version and command used in the continuous integration workflow. Added zizmor usage documentation. AI disclosure: used Claude Sonnet 5 with the prompt "Create a make zizmor target for local static analysis of GitHub Actions workflows" to assist with this change. @SemTiOne (Issue #1639)
Removed two unreachable code branches from vOrg.from_ical and vOrg.from_jcal. I used Claude Code (Anthropic's Claude Sonnet 5) to identify and remove the dead branches and to update the accompanying coverage tests; I reviewed the diff and ran the test suite locally. @vjymisal0 (Issue #1641)
Added security as a valid news fragment. @stevepiercy
Added anti-slop GitHub Action to detect commits by automated AI agents and bots. Removed useless Commit-Check GitHub Action. See related discussion. @stevepiercy
Adjusted the anti-slop GitHub Action settings of max-failures to 1 to surface any number of failures, and the min-profile-completeness setting from its default of 4 to 1 to require at least one human-added profile attribute. @stevepiercy
Don't close pull requests automatically when the anti-slop GitHub Action fails. @stevepiercy
Made "Instructions" not a section heading in the pull request template. "Instructions" was interpreted as a section heading, even though it is in a comment. @stevepiercy
Rename anti-slop action. @stevepiercy
One column per quarter.
To view the changes, please see the Changelog . This release can be installed from PyPI .
Fixed duplicate vInt.min and vInt.max descriptions in the API reference that caused the Read the Docs build to fail.
To view the changes, please see the Changelog . This release can be installed from PyPI .
Deprecated icalendar.parser.string.foldline as a private function for icalendar version 8. @IoannaGiag (Issue #1011)
Deprecated icalendar.parser.string.escape_char, icalendar.parser.string.unescape_char, icalendar.parser.string.escape_string, and icalendar.parser.string.unescape_string using the standard deprecate_for_version_8 wrapper as per issue #1405. (Issue #1405)
Created an ~icalendar.prop.recur.frequency.vFrequency.ical_value property for the ~icalendar.prop.recur.frequency.vFrequency component, mirroring the existing pattern on ~icalendar.prop.recur.weekday.vWeekday. @mvanhorn (Issue #876)
Created an ~icalendar.prop.geo.vGeo.ical_value property for the ~icalendar.prop.geo.vGeo component. @IoannaGiag (Issue #876)
Added type hints to component methods. @Priyanshu-pulak (Issue #938)
Added test coverage for icalendar.compatibility.deprecate_for_version_8. AI disclosure: I used GPT-5 Codex to help draft and refine the test and pull request text. I reviewed the output and validated the change locally. @iccccccccccccc (Issue #1407)
The Alarm.uid accessor now falls back to vendor-specific UID properties (the existing X-ALARMUID and the newly added X-EVOLUTION-ALARM-UID) when no canonical UID is present, so alarms exported by Evolution/GNOME Calendar expose a usable identifier. single_string_property now accepts an ordered list of fallback keys so further vendor aliases can be added later. AI disclosure: I used GPT-5 Codex (via the Codex CLI) to draft and refine this change and its tests; I reviewed and validated the output locally. @mvanhorn (Issue #1421)
The rdates and exdates properties are now writable: assigning a list replaces the RDATE/EXDATE values, del (or assigning an empty list or None) clears them, and assigning the value the getter returns round-trips. Prepared with the assistance of an AI coding agent (Anthropic's Claude). @gaoflow (Issue #1442)
Strictly validate ~icalendar.prop.dt.datetime.vDatetime values in ~icalendar.prop.dt.datetime.vDatetime.from_ical and reject malformed input. This also improves handling of values with a TZID prefix, per 5545#section-3.3.5, Form #3. @uwezkhan (Issue #1361)
Preserve an explicit VALUE parameter (for example RDATE;VALUE=PERIOD or TRIGGER;VALUE=DATE-TIME) when converting from jCal. Previously Component.from_jcal dropped the value type, which is encoded in the jCal type field rather than as a parameter. Prepared with the assistance of an AI coding agent (Anthropic's Claude Opus 4). @gaoflow @lcampanella98 (Issue #1426)
For a newline-free string that the operating system can't use as a file path—for example, one containing an embedded null byte or one that is too long—treat it as calendar data, instead of propagating an OSError from Component.from_ical. Such input now raises a consistent ValueError across platforms. The string-versus-path boundary is now covered by tests. @uwezkhan (Issue #1436)
Accept the (dt, None) form that rdates/exdates return for a single date when adding RDATE or EXDATE, so event.add("RDATE", (dt, None)) no longer raises TypeError and the value round-trips. Prepared with the assistance of an AI coding agent (Anthropic's Claude Opus 4). @gaoflow @texttheater (Issue #1439)
Anchored the value validation regular expressions with \Z instead of $ in ~icalendar.prop.recur.weekday.vWeekday, vDuration.from_ical, ~icalendar.prop.dt.time.vTime and ~icalendar.prop.dt.utc_offset.vUTCOffset. $ matches just before a final \n, so a value with a trailing line break was accepted; for vWeekday the newline survived in the str value and was re-emitted into RECUR output. @alhudz
For iCalendar files that have thousands of bare line breaks, reduce the content line parse time by a quadratic order of magnitude when reading a component with Component.from_ical. @alhudz
Parse a CATEGORIES value that contains an unescaped colon correctly. TEXT values do not escape :, so a category such as CATEGORIES:CONFIDENTIAL,http://example.com/tag was truncated to a single //example.com/tag because the value boundary was found with the last colon on the line instead of the first one outside the parameters. @alhudz
Parse and serialize jCal iteratively so that deeply nested components no longer raise an uncaught RecursionError. Component.from_jcal and Component.to_jcal now handle arbitrary nesting depth, matching the iterative iCal parser and serializer. @arshsmith
Preserve literal percent escapes in parameter values. The parameter parser used %2C/%3A/%3B/%5C as internal markers for backslash-escaped delimiters, so a value that already contained those sequences (e.g. ALTREP="http://x/a%2Cb") was silently decoded to http://x/a,b. The internal transport encoding now escapes % itself, leaving real percent-encoded values untouched. @alhudz
Raise ~icalendar.error.InvalidCalendar instead of leaking OverflowError when a DURATION value is too large for datetime.timedelta, for example, P999999999999999999W. Parsing a whole calendar now records such a value as an error, like any other invalid property, rather than aborting the parse. @arshsmith
Reject non-ASCII digits in ~icalendar.prop.recur.month.vMonth (BYMONTH). str.isdigit is True for digits like the Arabic-Indic ١٢, which was silently accepted and normalized to month 12, while characters such as ² cleared the same guard and then leaked a raw int() error. vMonth.from_ical now rejects both. @alhudz
Reject non-finite FLOAT values in vFloat.from_ical() and vGeo.from_ical(). Inputs such as nan, inf or an overflowing magnitude like 1e999 were silently accepted, producing NaN/Infinity tokens in Component.to_json output that are not valid JSON. @alhudz
Strictly validate ~icalendar.prop.dt.date.vDate and ~icalendar.prop.dt.time.vTime values in their from_ical methods and reject malformed input, matching the strictness added to ~icalendar.prop.dt.datetime.vDatetime. Trailing data and int() quirks (underscores, whitespace, signs) are no longer silently accepted, per 5545#section-3.3.4 and 5545#section-3.3.12. This change was prepared with AI assistance (Anthropic Claude, Opus model, via Claude Code) used to research the relevant RFC grammar and draft the validation and tests, all reviewed and verified locally. @alhudz
Switch docs/how-to/usage.rst from the deprecated .. code:: pycon directive to .. code-block:: pycon for consistency with the rest of the documentation. @mvanhorn (Issue #626)
Added type hint for encoding parameter in ~icalendar.parser_tools.data_encode. @cybs-joe (Issue #938)
Converted docstring of ~icalendar.cal.component.Component.add to Google style. @mvanhorn (Issue #1072)
Fixed broken links and removed :py prefix in icalendar.cal.calendar.Calendar documentation. @lcampanella98 (Issue #1158)
Fixed broken link and removed :py prefix in the ~icalendar.parser.property.unescape_backslash docstring. @vincere-mori (Issue #1158)
Fixed broken documentation links in icalendar.alarms and icalendar.cal.alarm. @lcampanella98 (Issue #1158)
Fix unqualified cross-references in Event.start and Event.start docstrings. @Esneider1107 (Issue #1158)
Fixed broken links in icalendar.cal.free_busy documentation by using fully qualified icalendar.cal.component.Component attribute targets. @tsai135 (Issue #1158)
Qualify ambiguous cross-references and remove remaining :py prefixed roles. @wahajahmed010 (Issue #1158)
Fixed broken documentation links in icalendar.cal.availability. @lcampanella98 (Issue #1158)
Replaced the RFC quotation in the docstring for vBoolean with a Pythonic description, including parsing behavior, a conformance reference, and a working example. @tsai135 (Issue #1244)
Improved the documentation for attr.url_property by converting raw RFC text into a comprehensive Python docstring with usage examples and explicit RFC cross-references. Assisting tool: Gemini 1.5. @samrodri911 (Issue #1244)
Improved the ~icalendar.cal.component.Component.LAST_MODIFIED docstring to a clearer Pythonic docstring. Assisting tool: Claude Haiku 4.5 @valemm13 (Issue #1244)
Tidied the auto-generated property docstrings by removing the redundant accepted values sentence and formatting return and error details as Sphinx sections. @mvanhorn (Issue #1259)
Fix Read the Docs administrative instructions in maintenance documentation by removing the obsolete step to check the default branch and adding a step to manually trigger the "latest" version. @stevepiercy (Issue #1397)
Clarified that Calendar.new automatically sets not only required, but recommended properties too. @scop (Issue #1459)
Add how to report security issues. @stevepiercy (Issue #1463)
Added NixOS installation instructions to the documentation. @MichaelFehdrau0205
Added instructions to change-log in Contribute documentation for how to avoid a filename conflict when adding a change log entry. @stevepiercy
Collect only documentation files for doctest. @stevepiercy
Documented Calendar.from_ical as a direct ~icalendar.cal.calendar.Calendar API member so Sphinx can link to it from the custom components guide. Prepared with AI assistance. @xjn2005
Added tests for FreeBusy.duration coverage. @kyriakikrimitza (Issue #698)
Refactored test_error_tolerant_parsing.py to use .ics fixture files. @lcampanella98 (Issue #1081)
Added .pre-commit-config.yaml configuration and documentation to automatically record AI prompts in commit messages with ai-prompt-auto-commit. @AniruthKarthik (Issue #1320)
Support keeping a linked issue open in the pull request template when the pull request fixes only a part of the original issue. @stevepiercy (Issue #1394)
Trigger the creation of a comment with links to Read the Docs of the changed files to review in a pull request preview build. @stevepiercy (Issue #1396)
Add gh-profiler workflow to help triage AI-generated contributions. @SashankBhamidi (Issue #1484)
Added validation test for FreeBusy.duration. @kyriakikrimitza
Remove redundant and deprecated pull request preview feature on Read the Docs. We now use the RTD GitHub app, making this file redundant to pull request preview builds. Additionally the call to the old GitHub Action was deprecated on 2025-07-01, per its README.md. @stevepiercy
Added type hints to all methods in the module ~icalendar.error. @Priyanshu-pulak (Issue #938)
To view the changes, please see the Changelog . This release can be installed from PyPI .
Comparing components with Component.__eq__ is no longer exponential in the subcomponent nesting depth, removing a denial-of-service vector where a deeply nested component could take minutes to compare. See GHSA-cv84-9p8j-fj68. @tidusec
To view the changes, please see the Changelog . This release can be installed from PyPI .
Replaced the recursive Component.__repr__ implementation with an iterative stack-based walk so that deeply nested calendars no longer raise RecursionError when formatted via repr(), str(), or f-strings. The output format is unchanged for normally-shaped calendars. @gistrec (Issue #1370)
Update maintenance documentation. Fix the version switcher on "stable" on Read the Docs. @stevepiercy (Issue #1352)
To view the changes, please see the Changelog . This release can be installed from PyPI .
Created an ~icalendar.prop.dt.period.vPeriod.ical_value property for the ~icalendar.prop.dt.period.vPeriod component. @ZairKSM (Issue #876)
Created a ~icalendar.prop.recur.weekday.vWeekday.ical_value property for the ~icalendar.prop.recur.weekday.vWeekday component, mirroring the existing pattern on ~icalendar.prop.boolean.vBoolean. @mvanhorn (Issue #1360)
Strictly validate BINARY property values in vBinary.from_ical() and reject malformed Base64 input instead of silently accepting invalid characters. @uwezkhan (Issue #1349)
Replace the RFC quotations in the docstrings for Alarm.REPEAT and Alarm.DURATION with Pythonic descriptions, including parameter notes, conformance references, and worked examples. @tmchow (Issue #1244)
Edited contributor documentation for how to add a change log entry, and maintenance documentation for how to process news fragments. @stevepiercy (Issue #1256)
Updated release process documentation. @niccokunzmann @stevepiercy @SashankBhamidi (Issue #1293)
Added towncrier to development dependencies. @stevepiercy (Issue #1256)
Switched from manual change log management to towncrier to automate the process. @stevepiercy (Issue #1256)
Bump PyPy from 3.10 to 3.11 for testing. @stevepiercy (Issue #1383)
To view the changes, please see the Changelog . This release can be installed from PyPI .
Deprecate icalendar.parser.escape_string and icalendar.parser.unescape_string for icalendar version 8. Use _escape_string and _unescape_string internally. 1011
Added behavioral tests for ~icalendar.cal.lazy.LazyCalendar covering serialization round-trips, .todos, .journals, forward timezone references, and with_uid() substring false-positives. 1050
Added edge case tests for ~icalendar.prop.conference.Conference parameter normalization covering string passthrough, empty list filtering, and None omission. 925
Make icalendar an explicit editable install for clarity. 1268
Do not run some tests until a pull request is approved. 1246
Mark skipped CI tasks as skipped instead of running them. 1286
Created an ~icalendar.prop.boolean.vBoolean.ical_value property for the ~icalendar.prop.boolean.vBoolean component. 876
Created an ~icalendar.prop.float.vFloat.ical_value property for the ~icalendar.prop.float.vFloat component. 876
Created an ~icalendar.prop.integer.vInt.ical_value property for the ~icalendar.prop.integer.vInt component. 876
Created an ~icalendar.prop.binary.vBinary.ical_value property for the ~icalendar.prop.binary.vBinary component. 876
Put the link check as the last documentation CI task, allowing the documentation build and Vale to run first and fail faster. 1295
Extended ~icalendar.timezone.tzp.TZP.localize to support localizing both datetime.datetime and datetime.time objects, returning timezone-aware datetime.time objects for the latter. 1142
Add type hints to tests directory functions. 938
Update to Contributor Covenant 3.0 Code of Conduct, hosted at https://pycal.org/code-of-conduct/.
Added ~icalendar.cal.lazy.LazyCalendar for lazy parsing of subcomponents. 158, 1050
Updated icalendar.prop.dt.time.vTime.from_ical to support parsing time values with TZID parameters, returning timezone-aware datetime.time objects. 1142
Added subcomponents parameter to Component.new, Event.new, Todo.new, and Availability.new. 1065
Switch to uv for development. 1102
Allow lenient parsing of content lines with optional whitespace around property and parameter delimiters (for example, REFRESH - INTERVAL; VALUE = DURATION:PT48H) when parsing calendars with strict=False. 351
X-properties with a VALUE parameter are now parsed using the correct type instead of falling back to ~icalendar.prop.unknown.vUnknown. 1238
Test that the DURATION property catches datetime.timedelta objects without vProperty wrappers. 884
Fixed ~icalendar.attr.get_end_property to avoid allowing the creating of VEVENT components with negative durations. Only VTODO components are allowed to have negative durations. 999
GitHub Actions: conditional tests now show as "skipped" instead of "pending". 1264
Fixed Component.__eq__ method not being commutative when comparing subcomponents. 1224
Verified that the VALUE parameter of jCal components is used for the type of the component property. 1237
Fix ~icalendar.parser.string.escape_char handling of bytes input by converting with icalendar.parser_tools.to_unicode before escaping. 1226
Fixed RecursionError in walk(), property_items(), and to_ical() by using iterative implementations for component traversal and property extraction. 1348
Convert docstring of ~icalendar.param.string_parameter to Google style. 1072, 1316
Run sphinx-build with -W to turn warnings into errors. 1306
Added sphinx-llms-txt extension to generate llms.txt and llms-full.txt files for AI/LLM documentation consumption. 1302
Fixed CI Vale check reporting and resolved Vale errors. 1277
Include Makefile in documentation workflow path filters so documentation CI runs when Makefile logic changes, and keep Vale failures visible in CI output. 1277
Document how to install icalendar on Alpine Linux. 1290
Add documentation for usage of the Sphinx extension sphinx-icalendar. 1268
Add Repology badge and distribution installation instructions to install documentation. 1119
Updated references to ~icalendar.prop.uri.vUri and ~icalendar.enums.RELTYPE classes in attr.py. 1158
Convert docstrings in attr.py and cal/calendar.py to Google Style format. 1072
Explained import shortcuts in ../explanation/api-design documentation. 1161
Added tutorial for creating a calendar with events with attendees. 1262
Added recognition of NLnet Foundation for its funding and Open Collective for donations to the documentation footer. 1214
Documented vText properties according to 5545#section-3.3.11. 742
Convert docstrings in icalendar.caselessdict to Google Style format with Parameters, Returns, Raises, and Example sections as appropriate. 1072
Fix broken docstring for ~icalendar.cal.component.Component.add_component link in ~icalendar.cal.availability.Availability.available. 1158
Revise AI policy, per NLnet advice. See discussion under pycal.org issue #24.
Add documentation for how to use uv for development. 1102
Reorganize Design documentation. 1292
Improve docstring for categories_property, which renders to HTML in Calendar.categories, Event.categories, Journal.categories, and Todo.categories. 1244
Fixed Python object cross-references in icalendar.cal.component.Component._infer_value_type. 1158, 1344
To view the changes, please see the Changelog . This release can be installed from PyPI .
Show colorful required code changes in the CI output to help contributors solve the formatting issues. 1216
Use ruff 0.15.0 for code formatting in tox.ini. 1215
Added Event.RECURRENCE_ID, Todo.RECURRENCE_ID, and Journal.RECURRENCE_ID properties, including support in their new() constructors. 1231
Fixed ~icalendar.timezone.tzid.tzids_from_tzinfo not recognizing dateutil.tz.win.tzwin objects on Windows. UTC datetimes using dateutil.tz.gettz("UTC") now correctly serialize with the Z suffix instead of TZID=Coordinated Universal Time. 1056
Fixed Calendar.get_missing_tzids raising KeyError when a VTIMEZONE exists for a timezone not referenced by any event TZID, for example, when added by the x-wr-timezone conversion. 1124
Fixed Calendar.get_missing_tzids and Calendar.add_missing_timezones generating a spurious VTIMEZONE for UTC. 5545#section-3.2.19 requires UTC datetimes to use the Z suffix; no VTIMEZONE component is needed or permitted. 1124
Fixed Parameters.update_tzid_from incorrectly setting TZID=UTC on UTC datetimes. 5545#section-3.2.19 requires UTC datetimes to use the Z suffix without a TZID parameter. 1124
Renamed the public functions escape_char and unescape_char to implicit private methods _escape_char and _unescape_char Fixed regression from 1008 by restoring ~icalendar.parser.string.escape_char and ~icalendar.parser.string.unescape_char as public functions. The public functions ~icalendar.parser.string.escape_char and ~icalendar.parser.string.unescape_char are now deprecated with warnings for external users. 1241
Add icalendar as a local workspace dependency to the docs dependency group in pyproject.toml to fix dependency resolution issues with uv lock during documentation builds. 1253 1254
Use sphinx-icalendar to add syntax highlighting to iCalendar text
To view the changes, please see the Changelog . This release can be installed from PyPI .
Show required code changes in the CI output to help contributors solve the formatting issues. 1216
Use ruff 0.15.0 for code formatting in tox.ini. 1215
Enabled Calendar.from_ical to read calendars from files. 756
Added Calendar.journals property to retrieve all journal components. 1230
Removed methods of str, int, and other classes and methods in the Python standard library from the documentation.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Setting ~cal.calendar.Calendar.calendar_name now also writes X-WR-CALNAME, and setting ~cal.calendar.Calendar.description now also writes X-WR-CALDESC, for improved client compatibility. 918
Make typing_extensions a dependency. 1202
Fixed the version switcher on Read the Docs, and documented the process for a major release. 1194
Added usage examples for reading calendars from files and URL. 756
Add type hints and convert docstrings to Google Style in cli.py. 938
To view the changes, please see the Changelog. This release can be installed from PyPI.
Created an ~cal.todo.Todo.example method for the ~cal.todo.Todo component. 743
Created an ~cal.alarm.Alarm.example method for the ~cal.alarm.Alarm component. 743
Move property classes from icalendar.prop into their own files with sub-packages icalendar.prop.recur and icalendar.prop.dt. 987
Move classes and functions in icalendar.parser into their own files. 987
Clarified custom component (X-* and IANA-registered) parsing behavior through enhanced documentation and comprehensive how-to guide. Custom components are automatically handled by the library with no special configuration required. 432
Reorganized custom component tests into a dedicated test_custom_components.py file with expanded test coverage for Component.from_ical, Calendar.from_ical, and ~icalendar.cal.component_factory.ComponentFactory usage. 433
The typing-extensions dependency on Python < 3.13 is now optional, part of the test extra.
The icalendar.tools.is_pytz_dt return value is now hinted as TypeGuard[datetime], not TypeIs[datetime], since returning False should not allow narrowing it as non-datetime.
Regroup dependencies in, and remove obsolete ones, from pyproject.toml. 906
Add type hints to internal helper functions. 938
Add type hints to prop value classes (vBoolean, vFloat, vUri, vBinary, vInline). 938
Add type hints to remaining prop value classes (vText, vCalAddress, vCategory, vGeo, vN, vOrg, vAdr, vBroken, vUid, Conference, Image). 938
Added type hints and overloads to Calendar.from_ical and Component.from_ical to support multiple=True/False return types. 1129
CI: Print a link to Vale documentation when the spell checker fails.
Remove bootstrap.py and buildout.cfg files as they are old build configurations. 1171
Enforce ruff formatting and linting across the entire codebase, with CI check to prevent regressions. 672, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, and 1181
Fix type annotations, typos, and validation logic in prop module: corrected return type hints in parse_jcal_value methods, fixed to_ical() return type in vDDDTypes, updated ClassVar type hint in TypesFactory, removed dead code, fixed "abbrevation" typo in vWeekday, and corrected validation logic in vMonth. 1185
Rename ~icalendar.prop.vBrokenProperty to ~icalendar.prop.vBroken to match naming convention. ~icalendar.prop.vBroken now stores the actual exception object in parse_error instead of a string, and raises ~icalendar.error.BrokenCalendarProperty when accessing attributes like .dt that the expected type would have. 1087
Drop support for Python 3.8 and 3.9. 977
DURATION_REGEX moved from icalendar.prop to icalendar.prop.dt.duration. 987
WEEKDAY_RULE moved from icalendar.prop to icalendar.prop.recur.weekday. 987
Removed tzid_from_dt and tzid_from_tzinfo from icalendar.prop as they exist in icalendar.timezone. 987
Component.decoded now returns a string instead of bytes for text properties.
Remove constants FOLD, NAME, NEWLINE, QUNSAFE_CHAR, QUOTABLE, UFOLD, and UNSAFE_CHAR from icalendar.parser's export. 987
Added recursive parameter to Component.copy to control copying of subcomponents and properties. 899
Event components now have error-tolerant property parsing. Properties with parsing errors fall back to ~icalendar.prop.vBroken, preserving the raw value and allowing access to other valid properties. Errors are recorded in component.errors. Partially addresses 158
Added ~icalendar.prop.AdrFields and ~icalendar.prop.NFields named tuples for structured access to vCard ADR and N property fields. The fields attribute and from_ical() return value of ~icalendar.prop.vAdr and ~icalendar.prop.vN now return these typed named tuples, enabling access like adr.fields.street and n.fields.family. Since named tuples are tuple subclasses, existing code using tuple indexing or unpacking remains compatible. Added name and units properties to ~icalendar.prop.vOrg for convenient access to the organization name and organizational units. Added ical_value property to all three classes. 1060
Added with_uid method to Component to filter subcomponents by UID. 950
Enforce linting of code with Ruff in CI. 672
Fixed Calendar.new to automatically generate a UID when not provided, matching the documented behavior. Previously, the documentation stated that uid would be set to a new uuid.uuid4 if None, but the implementation did not generate it. 1066
Fixed import failure in Pyodide/WebAssembly environments by using lazy initialization for timezone data in the zoneinfo provider. The library can now be imported in environments without timezone data (for example, Cloudflare Workers, PyScript, and JupyterLite). 1073
Fixed CaselessDict.__eq__ to return NotImplemented when comparing with non-dict types instead of raising AttributeError. 1016
Fixed decoding of categories. 279
Link timedelta to datetime.timedelta in the Python standard library documentation. 951
Fix round-trip parsing of ~icalendar.prop.vCategory (CATEGORIES property) when category values contain commas. Categories like 'Meeting, John' now correctly survive round trips between Component.to_ical and Component.from_ical instead of being split into multiple categories. Added ~icalendar.parser.property.split_on_unescaped_comma helper function. 127
Fixed semicolon escaping in vCard structured properties (ADR, N, ORG). Semicolons are now correctly treated as field separators per 6350, not escaped as in iCalendar TEXT values. Added ~icalendar.parser.property.split_on_unescaped_comma helper function and ~icalendar.prop.adr.vAdr, ~icalendar.prop.n.vN, ~icalendar.prop.org.vOrg property types. 137
Fix Image.from_property_value to raise TypeError instead of AttributeError when value.params isn't valid (most notably, isn't dict-like). 909
Improved docstrings and formatting for the ~icalendar.alarms.AlarmTime class. 1072
Added how-to guide for handling parsing errors with ~icalendar.prop.vBroken and the component.errors attribute. 1085
Updated 11 function docstrings in icalendar.parser to follow the Google Style guide, improving API documentation clarity and consistency. 1072
Applied Google-style docstrings to icalendar.tools utility functions with Args, Returns, and Example sections. 1072
Simplify contributors and add supporters in credits. 1035
Add a section in the change log for Documentation. 1043
Fixed multiple more than one target found for cross-reference warnings, and stopped using sphinx.ext.autosectionlabel, in documentation. 952
Add funding.json manifest for funding information. 1047
Resolved Cannot resolve forward reference in type annotations warning in documentation. Added SPHINX_APIDOC_OPTIONS to make apidoc command, excluding __all__ items from being duplicated in the documentation, and rebuilt the API documentation source files. 952
Document how to create and read attendee information in events. 130
Add usage examples. 443
Improve documentation contribution guide by adding chapters for small edits, builds and checks, and a style guide. Added details for Vale usage, Diátaxis framework, narrative and API documentation, and fixing all spelling errors. 991
Document dictionary and property accessors. 124
Moved content from the README into documentation to reduce maintenance and point to the authoritative source of information. 1006
Added "Code conventions" section to the Development contributing guide. 1004
Use Google style docstrings in ~icalendar.parser_tools 1017
Document compatibility of icalendar with RFCs. 1147
Added Upgrade guide. 997
Fixed links in jCal usage documentation.
Enable sphinx-issues extension. 1091
Replaced "Arguments" and "Args" with "Parameters". 1076
Added documentation of how to set up a development environment with git. 906
Documented how to install and use pre-commit. 996
Added a new rule to our docstring style guide to escape docstrings, and added a new section for type hints in the code conventions section. 1080
Documented __init__ methods. 1079
Moved "Edit this page" link to above the page table of contents. 1106
Added Good First Issue link and fixed Up For Grabs link in Contribute guide. 1095
Updated CONTRIBUTING.rst to explicitly state not to use Args sections in docstrings. 1076
Document vInt.__new__ method parameters in class docstring with 5545 examples. 1118
Improved make vale command to provide guidance on failure or success. 1137
Add sphinx_copybutton configuration to exclude line numbers, prompts, and console output when copying code blocks.
Change Sphinx configuration to convert -- to en dash -, --- to em dash —, and ... to ellipsis …, but doesn't transform quote marks as they should be preserved. This restores cleaner and consistent rendering of docstrings in the API Reference. See smartquotes_action.
Fix incorrect return type annotation in Component.from_ical. 1141
Fixed broken links in docs/how-to/usage.rst documentation. Part of 1158
Enhanced the first-time contributors section, in hopes that fewer contributors ask permission before starting work. 1165
Changed Sphinx configuration to inherit from CaselessDict, displaying all of its class members in the in-page navigation. Fixed broken cross-component links in Availability.new(). 994
Configured Sphinx to append the docstring from the __init__ method into its class docstring. 1156
Created an example() method for the Todo component. #743
Created an example() method for the Alarm component. #743
Move property classes from icalendar.prop into their own files with sub-packages icalendar.prop.recur and icalendar.prop.dt . #987
Move classes and functions in icalendar.parser into their own files. #987
Clarified custom component (X-* and IANA-registered) parsing behavior through enhanced documentation and comprehensive how-to guide. Custom components are automatically handled by the library with no special configuration required. #432
Reorganized custom component tests into a dedicated test_custom_components.py file with expanded test coverage for Component.from_ical , Calendar.from_ical , and ComponentFactory usage. #433
The typing-extensions dependency on Python < 3.13 is now optional, part of the test extra.
The icalendar.tools.is_pytz_dt() return value is now hinted as TypeGuard[datetime] , not TypeIs[datetime] , since returning False should not allow narrowing it as non-datetime.
Regroup dependencies in, and remove obsolete ones, from pyproject.toml . #906
Add type hints to internal helper functions. #938
Add type hints to prop value classes (vBoolean, vFloat, vUri, vBinary, vInline). #938
Add type hints to remaining prop value classes (vText, vCalAddress, vCategory, vGeo, vN, vOrg, vAdr, vBroken, vUid, Conference, Image). #938
Added type hints and overloads to Calendar.from_ical and Component.from_ical to support multiple=True/False return types. #1129
CI: Print a link to Vale documentation when the spell checker fails.
Remove bootstrap.py and buildout.cfg files as they are old build configurations. #1171
Enforce ruff formatting and linting across the entire codebase, with CI check to prevent regressions. #672 , #1171 , #1172 , #1173 , #1174 , #1175 , #1176 , #1177 , #1178 , #1179 , #1180 , and #1181
Fix type annotations, typos, and validation logic in prop module: corrected return type hints in parse_jcal_value methods, fixed to_ical() return type in vDDDTypes, updated ClassVar type hint in TypesFactory, removed dead code, fixed "abbrevation" typo in vWeekday, and corrected validation logic in vMonth. #1185
Rename vBrokenProperty to vBroken to match naming convention. vBroken now stores the actual exception object in parse_error instead of a string, and raises BrokenCalendarProperty when accessing attributes like .dt that the expected type would have. #1087
Drop support for Python 3.8 and 3.9. #977
DURATION_REGEX moved from icalendar.prop to icalendar.prop.dt.duration . #987
WEEKDAY_RULE moved from icalendar.prop to icalendar.prop.recur.weekday . #987
Removed tzid_from_dt and tzid_from_tzinfo from icalendar.prop as they exist in icalendar.timezone . #987
Component.decoded() now returns a string instead of bytes for text properties.
Remove constants FOLD , NAME , NEWLINE , QUNSAFE_CHAR , QUOTABLE , UFOLD , and UNSAFE_CHAR from icalendar.parser 's export. #987
Added recursive parameter to Component.copy() to control copying of subcomponents and properties. #899
Event components now have error-tolerant property parsing. Properties with parsing errors fall back to vBroken , preserving the raw value and allowing access to other valid properties. Errors are recorded in component.errors . Partially addresses #158
Added AdrFields and NFields named tuples for structured access to vCard ADR and N property fields. The fields attribute and from_ical() return value of vAdr and vN now return these typed named tuples, enabling access like adr.fields.street and n.fields.family . Since named tuples are tuple subclasses, existing code using tuple indexing or unpacking remains compatible. Added name and units properties to vOrg for convenient access to the organization name and organizational units. Added ical_value property to all three classes. #1060
Added with_uid method to Component to filter subcomponents by UID. #950
Enforce linting of code with Ruff in CI. #672
Fixed Calendar.new to automatically generate a UID when not provided, matching the documented behavior. Previously, the documentation stated that uid would be set to a new uuid.uuid4() if None , but the implementation did not generate it. #1066
Fixed import failure in Pyodide/WebAssembly environments by using lazy initialization for timezone data in the zoneinfo provider. The library can now be imported in environments without timezone data (e.g., Cloudflare Workers, PyScript, JupyterLite). #1073
Fixed icalendar.caselessdict.CaselessDict.eq() to return NotImplemented when comparing with non-dict types instead of raising AttributeError . #1016
Fixed decoding of categories. #279
Link timedelta to datetime.timedelta in the Python standard library documentation. #951
Fix round-trip parsing of vCategory (CATEGORIES property) when category values contain commas. Categories like 'Meeting, John' now correctly survive round trips between Component.to_ical and Component.from_ical instead of being split into multiple categories. Added split_on_unescaped_comma() helper function. #127
Fixed semicolon escaping in vCard structured properties (ADR, N, ORG). Semicolons are now correctly treated as field separators per RFC 6350 , not escaped as in iCalendar TEXT values. Added split_on_unescaped_semicolon() helper function and vAdr , vN , vOrg property types. #137
Fix Image.from_property_value to raise TypeError instead of AttributeError when value.params isn't valid (most notably, isn't dict-like). #909
Improved docstrings and formatting for the AlarmTime class. #1072
Added how-to guide for handling parsing errors with vBroken and the component.errors attribute. #1085
Updated 11 function docstrings in icalendar.parser to follow the Google Style guide, improving API documentation clarity and consistency. #1072
Applied Google-style docstrings to icalendar.tools utility functions with Args, Returns, and Example sections. #1072
Simplify contributors and add supporters in credits. #1035
Add a section in the change log for Documentation. #1043
Fixed multiple more than one target found for cross-reference warnings, and stopped using sphinx.ext.autosectionlabel , in documentation. #952
Add funding.json manifest for funding information. #1047
Resolved Cannot resolve forward reference in type annotations warning in documentation. Added SPHINX_APIDOC_OPTIONS to make apidoc command, excluding all items from being duplicated in the documentation, and rebuilt the API documentation source files. #952
Document how to create and read attendee information in events. #130
Add usage examples. #443
Improve documentation contribution guide by adding chapters for small edits, builds and checks, and a style guide. Added details for Vale usage, Diátaxis framework, narrative and API documentation, and fixing all spelling errors. #991
Document dictionary and property accessors. #124
Moved content from the README into documentation to reduce maintenance and point to the authoritative source of information. #1006
Added "Code conventions" section to the Development contributing guide. #1004
Use Google style docstrings in parser_tools #1017
Document compatibility of icalendar with RFCs. #1147
Added Upgrade guide. #997
Fixed links in jCal usage documentation.
Enable sphinx-issues extension. #1091
Replaced "Arguments" and "Args" with "Parameters". #1076
Added documentation of how to set up a development environment with git. #906
Documented how to install and use pre-commit. #996
Added a new rule to our docstring style guide to escape docstrings, and added a new section for type hints in the code conventions section. #1080
Documented init methods. #1079
Moved "Edit this page" link to above the page table of contents. #1106
Added Good First Issue link and fixed Up For Grabs link in Contribute guide. #1095
Updated CONTRIBUTING.rst to explicitly state not to use Args sections in docstrings. #1076
Document vInt.new method parameters in class docstring with RFC 5545 examples. #1118
Improved make vale command to provide guidance on failure or success. #1137
Add sphinx_copybutton configuration to exclude line numbers, prompts, and console output when copying code blocks.
Change Sphinx configuration to convert -- to en dash - , --- to em dash — , and ... to ellipsis … , but doesn't transform quote marks as they should be preserved. This restores cleaner and consistent rendering of docstrings in the API Reference . See smartquotes_action .
Fix incorrect return type annotation in Component.from_ical . #1141
Fixed broken links in docs/how-to/usage.rst documentation. Part of #1158
Enhanced the first-time contributors section, in hopes that fewer contributors ask permission before starting work. #1165
Changed Sphinx configuration to inherit from CaselessDict , displaying all of its class members in the in-page navigation. Fixed broken cross-component links in Availability.new() . #994
Configured Sphinx to append the docstring from the init method into its class docstring. #1156
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add static [project.urls] to pyproject.toml for GitHub dependency graph compatibility. 1035
Created an ~cal.todo.Todo.example method for the ~cal.todo.Todo component. 743
Add type hints to icalendar.caselessdict file. 938
For releases, added a step to update the version switcher for documentation.
Added contributor list format and sorting instructions.
Fix double-unescaping in vText.from_ical and vCategory.from_ical by removing unescape_char(). 1008
To view the changes, please see the Changelog. This release can be installed from PyPI.
Convert changelog section labels to reStructuredText subheadings for improved Read the Docs navigation. 982
Move sections in Table of Content of Reference guide.
Improve icalendar.prop.vDatetime documentation. 946
CLI now writes output files using UTF-8 explicitly instead of relying on the system default. 1005
Add compatibility to 9253:
Add new property types ~icalendar.prop.uid.vUid and ~icalendar.prop.xml_reference.vXmlReference
Add properties to all components: Component.concepts, Component.links, Component.refids, Component.related_to
Add new values to ~icalendar.enums.RELTYPE
Add LABEL, GAP, and VALUE parameters to property values affected by 9253
Allow setting default values in Parameters
Allow None as an argument to Parameters
Add ical_value to several property values. 876
Add PyData Theme version switcher to documentation. 825
Test compatibility with Python 3.14. 973
Added documentation of Vale usage for icalender documentation style guide. 815
Added funding link to pyproject.toml. 800
Added documentation of docstring format. 747
Add TypeAlias icalendar.VPROPERTY as a type for all properties.
Allow access to icalendar.TypesFactory via icalendar.TypesFactory.instance
Classes in icalendar.prop can all be initialized with parameters now.
Allow passing icalendar.vDDDTypes as arguments to icalendar.vDDDLists
Add support for datetime.timezone identification.
Add tzid.is_utc to check if a timezone is UTC.
Add support for JCal parsing and serialization. 978
Add icalendar.JCalParsingError exception for jCal parsing.
Add icalendar.Parameters.tzid and icalendar.Parameters.is_utc for timezone handling.
Add icalendar.vUnknown which is the default now for unknown properties and the same as icalendar.vText
Add ComponentFactory.get_component_class that also creates a new component class when it does not exist.
Add ComponentFactory.add_component_class to have a unified interface to add component classes.
Add Component.to_json, Component.to_jcal, and Component.from_jcal methods so all components can be serialized and parsed.
Classes in icalendar.prop receive the following updates:
Add to_jcal and from_jcal for serialization.
Add default_value class attribute for the default VALUE parameter.
Add VALUE parameter property.
Add examples() class method that returns examples for testing.
Added documentation of how to fuzz icalendar. 905
Added first-time contributors section to Contributing. 934
Revised check of which files trigger a documentation build on Read the Docs. 848
Created a separate path to contribute to documentation. 929
Added a code of conduct. 907
Added redirects of moved files and 404 not found page to catch any other obsolete URLs. 959
Added artificial intelligence (AI) policy. 933
Correct name of AVAILABLE component.
Fix ical serialization of icalendar.vTime
Make sure a component's conferences property adds VALUE=URI if the conference is created as a URI.
Fix CLI deprecated argparse.FileType usage and remove PendingDeprecationWarning. 1005.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Split up cal.py into different files as sub-package.
Format more source code with ruff.
Exclude type checking block from test coverage.
Add private icalendar.compatibility module to merge functionality for older Python versions into one place.
Add type annotation to from_ical().
Fix enum documentation.
DTSTAMP, LAST_MODIFIED, and CREATED can now be set to None to delete the value.
Enhanced Calendar.new() to support organization and language parameters for automatic PRODID generation.
Added duration setter to Event class for more intuitive event creation.
Added validate() method to Calendar class for explicit validation of required properties and components.
Add improved setters for start, duration, and end properties with explicit locking mechanisms to provide more flexible property manipulation while maintaining RFC 5545 compliance. The implementation includes comprehensive test coverage to ensure proper behavior and backward compatibility.
Add new() method to vCalAddress class for consistent API usage. The method supports all RFC 5545 parameters including CN, CUTYPE, DELEGATED-FROM, DELEGATED-TO, DIR, LANGUAGE, PARTSTAT, ROLE, RSVP, and SENT-BY, with automatic mailto: prefix handling. See 870.
Refactor set_duration methods in Event and Todo classes to eliminate code duplication by extracting common logic into shared set_duration_with_locking() function in icalendar.attr. See 886.
Consolidate duplicate logic patterns between Event and Todo classes by extracting shared functions in icalendar.attr for property setters, validation logic, and property access. This eliminates approximately 150 lines of duplicate code while maintaining 100% backward compatibility and RFC 5545 compliance. See 891.
Accept and ignore non-standard empty RDATE fields when parsing ICS files.
Improve contributing documentation by adding a change log requirement, adding a pull request template, adding clear CI enforcement warnings, and updating README.rst. See 890.
Make coverage submission optional for CI.
Bump actions/setup-python version from 5 to 6 for CI.
Add comment explaining tzdata dependency purpose to prevent confusion. See 900.
Fix duplicate blank issue template by adding config.yml to disable GitHub's default blank option. See 777.
Add PEP 561 py.typed marker to enable type checking support. The package now distributes inline type annotations for mypy and other type checkers. See 395.
Bump github/codeql-action from 3 to 4 in CI fuzzing workflow.
Add docstring for vDatetime. See 742.
Update LICENSE file heading formatting.
Document icalendar.version module.
Use CONTRIBUTING.md in favour of .rst file.
Add type hints to icalendar.tools module.
Fix more examples link failed in README.md by renewing its link. See 958.
Fix Contributing, Changelog, License links failed in README.md by renewing its link. See 959.
Fix more examples link in README.md. See 958.
Add CODEOWNERS file for automatic pull request review assignment. See 945.
Correctly throw a TypeError for wrong types during property creation where a ValueError was thrown before.
Move types_factory into Component.types_factory
Move components_factory into Component.get_component_class
Move icalendar.cal.IncompleteComponent error into icalendar.error.
Remove icalendar.UIDGenerator. Use Python's built-in uuid library instead.
Add new() to icalendar.Calendar to set required attributes. See 569.
Add new() to Alarm, Event, Todo, FreeBusy, Component, and Journal components. See 843.
Add value to Parameters to access the VALUE parameter.
Add Availability and Available components from 7953. See 654 and 864.
Add stamp, last_modified, created, CREATED, busy_type, class, comments, contacts, location, organizer, priority, and url properties to components that use them.
Add availabilities attribtue to Calendar.
Add status, transparency, and attendees properties. See 841.
Add uid property that is '' by default and set automatically with new(). See 315.
Make icalendar compatible with RFC 7986.
Add url, source, refresh_interval, conferences, and images properties to components.
Add td property to vDDDTypes to make it compatible with timedelta value types.
Add documentation for how to install icalendar on Fedora. See 704.
Add documentation linkchecker to make and CI configuration. See 854.
Add support for Vale as spell and style checker.
For make livehtml watch all files in src/icalendar, but ignore .typed and contents of the tests and fuzzing directories. See 931.
Restructure documentation, following Diátaxis framework. See 820 which included the following tasks.
Start building API Reference documentation.
Add Vale with Microsoft Writing Guide style checker.
Add Makefile to automate all documentation builds with a single command for each.
Write documentation of how to build documentation.
Move "History" into "Credits".
Add a Glossary of terms.
Add version module to API reference.
Exclude private Python methods and test modules from the API reference.
Fix display of credits to use reStructuredText.
Fix the documentation version display.
Show older versions of documentation on Read the Docs.
Fix the PyPI icon.
Add a Security Policy.
Consolidate Contributing files into the how-to Contributing guide.
Move the change log into the Reference guide.
Remove all rights reserved from the License file and remove from documentation, leaving it in the repository root.
Move Maintenance into the Contribute guide.
Move icalendar contributors into the Contribute guide.
Merge about the project into Credits.
Split api.rst into separate modules.
Move "icalendar utility" into a how-to guide for command line interface.
Move "icalendar package" into a how-to usage guide and API reference guide.
Split installation into how-to guides for usage and contributing.
Redesigned home page to reflect the new structure and point readers to the proper location.
Fix various Sphinx build warnings and errors.
Use text for lexer of ical files.
Update README.rst to align with new documentation structure.
Add documentation builds to continuous integration.
Review pull requests that involve source docstrings, continuous integration, or documentation, and provide suggestions and corrections.
Add spell checking to documentation. See 853.
Add link check to docs test. See 854.
Document installation of icalendar on Fedora. See 704.
Miscellaneous documentation follow-up fixes. See 919.
Fix Todo.end to return start for date-only DTSTART (not start + 1 day). Events keep existing behavior. See 898.
Fix AssertionError when converting VTIMEZONE components with only DAYLIGHT subcomponent (no STANDARD) to pytz timezones. The code now handles cases where a timezone definition contains only DST transitions by calculating the DST offset from TZOFFSETFROM and TZOFFSETTO. Test case contributed by @niccokunzmann in 379. See 321.
Normalize Conference parameter lists (FEATURE/LABEL/LANGUAGE) to comma-separated values. See 908.
Fix read from stdin issue - See 821.
Fix invalid calendar: Parsing a date with TZID results in a datetime to not loose the timezone. See 187.
Fix timezone placement in add_missing_timezones(): VTIMEZONE components now appear before VEVENT and other components that reference them. See 844.
Fixed Todo.duration and Event.duration to return DURATION property when set, even without DTSTART. See 867.
Fix VALUE parameter handling: datetime.date objects now correctly set VALUE=DATE parameter when added to properties like EXDATE, RDATE, and DTSTART. The VALUE parameter is also properly used when parsing iCalendar data. See 349.
Fix URL-encoded characters being incorrectly unescaped during content line parsing. The parser now properly handles backslash escaping and double-quoted sections without corrupting URL-encoded values like %3A (colon) in DESCRIPTION fields. Added unescape_backslash() function to separate 5545 backslash escaping from URL encoding. Optimized implementation using regex for single-pass processing. Added type hints to Contentline.parts() method and comprehensive unit tests. See 355.
make livehtml now reloads with code changes. See 931.
Added tests for tools, vFloat, vBinary, vGeo, and vTodo to improve unit test coverage. 698
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add PyData Theme version switcher to documentation. See 825.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Remove forced quoting from parameters with space and single quote. See 836.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Deprecate icalendar.UIDGenerator. See 816.
Add the uid property to Alarm, Event, Calendar, Todo, and Journal components. See 740.
Fix component equality where timezones differ for the datetimes but the times are actually equal. See 828.
Test that we can add an RRULE as a string. See 301.
Test that we support dateutil timezones as outlined in 336.
Build documentation on Read the Docs with the version identifier. See 826.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Use ruff to format the source code.
Update project metadata to use License-Expression.
Use tzp.localize(dt, None) to remove the timezone from a datetime.
Remove the HTML documentation when building with tox to force rebuild.
Switch to PyData Sphinx Theme for documentation. See 803.
Add getters rrules, rdates, and exdates for unified and simple access to these properties. See `Discussion 662`_.
Add attributes to the calendar for properties NAME, DESCRIPTION, and COLOR. See 655.
Add a color attribute to Event, Todo, and Journal components. See 655.
Add sequence attribute to Event, Todo, and Journal components. See 802.
Add categories attribute to Calendar, Event, Todo, and Journal components. See 655.
Add compatibility to 6868. See 652.
Add freebusy property to the Calendar to get this type of subcomponents easier.
Add parameters from 5545 to properties ALTREP, CN, CUTYPE, DELEGATED_FROM, DELEGATED_TO, DIR, FBTYPE, LANGUAGE, MEMBER, PARTSTAT, RANGE, RELATED, ROLE, RSVP, SENT_BY, TZID, and RELTYPE. See 798.
New properties from 7986 can occur multiple times in VCALENDAR. See 808.
Fix STANDARD and DAYLIGHT components that have a date as DTSTART. See 218
Move import at the end of icalendar.parser into a function to mitigate import errors, see 781.
ALTREP, DELEGATED-FROM, DELEGATED-TO, DIR, MEMBER, and SENT-BY require double quotes. These are now always added.
Classify CATEGORIES as multiple in VEVENT. See 808.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Fix to permit TZID forward references to VTIMEZONEs
Stabelize timezone id lookup, see 780.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add funding link to Tidelift.
Link to related package.
Shorten first example in documentation.
Add name and email properties to vCalAddress.
Add type hint for property params in icalendar.prop.
Set default value for params as params={} in mulitple constructors in icalendar.prop to improve usability.
Improve object initialization performance in icalendar.prop.
Add type hint for params in multiple constructors in icalendar.prop.
Restrict timezones tested, see 763
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add a weekday attribute to icalendar.prop.vWeekday components. See 749.
Document icalendar.prop.vRecur property. See 758.
Print failure of doctest to aid debugging.
Improve documentation of icalendar.prop.vGeo
Fix tests, improve code readability, fix typing. See 766 and 765.
The relative attribute of vWeekday components has the correct sign now. See 749.
Add Security Policy
Python types in documentation now link to their documentation pages using intersphinx.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add end, start, duration, DTSTART, DUE, and DURATION attributes to Todo components. See `Discussion 662`_.
Add DTSTART, TZOFFSETTO and TZOFFSETFROM properties to TimezoneStandard and TimezoneDaylight. See `Discussion 662`_.
Format test code with Ruff. See 672.
Document the Debian package. See 701.
Document vDatetime.from_ical
Allow passing a datetime.date to TZP.localize_utc and TZP.localize methods.
Document component classes with description from 5545.
Merge "File Structure" and "Overview" sections in the docs. See 626.
Update code blocks in usage.rst with the correct lexer.
Tidy up the docstring for icalendar.prop.vPeriod.
Improve typing and fix typing issues
Add VALARM properties for 9074. See 657
Test compatibility with Python 3.13
Add Timezone.from_tzinfo() and Timezone.from_tzid() to create a Timezone component from a datetime.tzinfo timezone. See 722.
Add icalendar.prop.tzid_from_tzinfo.
Add icalendar.alarms module to calculate alarm times. See 716.
Add Event.alarms and Todo.alarms to access alarm calculation.
Add Component.DTSTAMP and Component.LAST_MODIFIED properties for datetime in UTC.
Add Component.is_thunderbird() to check if the component uses custom properties by Thunderbird.
Add X_MOZ_SNOOZE_TIME and X_MOZ_LASTACK properties to Event and Todo.
Add Alarm.ACKNOWLEDGED, Alarm.TRIGGER, Alarm.REPEAT, and Alarm.DURATION properties as well as Alarm.triggers to calculate alarm triggers.
Add __doc__ string documentation for vDate, vBoolean, vCalAddress, vDuration, vFloat, vGeo, vInt, vPeriod, vTime, vUTCOffset and vUri. See 742.
Add DTSTART, TZOFFSETTO, and TZOFFSETFROM to TimezoneStandard and TimezoneDaylight
Use example methods of components without arguments.
Add events, timezones, and todos property to Calendar for nicer access.
To calculate which timezones are in use and add them to the Calendar when needed these methods are added: get_used_tzids, get_missing_tzids, and add_missing_timezones().
Identify the TZID of more timezones from dateutil.
Identify totally unknown timezones using a UTC offset lookup tree generated in icalendar.timezone.equivalent_timezone_ids and stored in icalendar.timezone.equivalent_timezone_ids.
Add icalendar.timezone.tzid to identify a timezone's TZID.
Add icalendar.timezone to the documentation.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Added end, start, duration, DTSTART, DUE, and DURATION attributes to Event components. See Discussion 662.
Added end, start, duration, and DTSTART attributes to Journal components. See Discussion 662.
Fix a few __all__ variables.
Added missing docs folder to distribution packages. See 712.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add __all__ variable to each modules in icalendar package
Improve test coverage.
Adapt test_with_doctest.py to correctly run on Windows.
Measure branch coverage when running tests.
Export Component base class for typing
Use pyproject.toml file instead of setup.py
Fix link to stable release of tox in documentation.
Fix a bad bytes replace in unescape_char.
Handle ValueError in vBinary.from_ical.
Ignore the BOM character in incorrectly encoded ics files.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Test that all code works with both pytz and zoneinfo.
Add message to GitHub release, pointing to the changelog
Make coverage report submission optional for pull requests
Parallelize coverage
Rename master branch to main, see Issue
Update docs/usage.rst to use zoneinfo instead of pytz.
Added missing public classes and functions to API documentation.
Improved namespace management in the icalendar directory.
Add Python version badge and badge for test coverage
Remove 4.x badge
Update list of tox environments
Use Coveralls' GitHub Action
Check distribution in CI
Use zoneinfo for icalendar objects created from strings, see 609.
This is an tested extension of the functionality, not a restriction: If you create icalendar objects with pytz timezones in your code, icalendar will continue to work in the same way. Your code is not affected.
zoneinfo will be used for those objects that icalendar creates itself. This happens for example when parsing an .ics file, strings or bytes with from_ical().
If you rely on icalendar providing timezones from pytz, you can add one line to your code to get the behavior of versions below 6:
import icalendar
icalendar.use_pytz()
Replaced pkg_resources.get_distribution with importlib.metadata in docs/conf.py to allow building docs on Python 3.12.
Remove is_broken property. Use errors instead to check if a component had suppressed parsing errors. See 424.
Remove untested and broken LocalTimezone and FixedOffset tzinfo sub-classes, see 67
Remove Python 3.7 as compatible. icalendar is compatible with Python versions 3.8 - 3.12, and PyPy3.
Remove pytz as a dependency of icalendar. If you require pytz, add it to your dependency list or install it additionally with:
pip install icalendar==6.* pytz
Check code quality with Ruff, optional report
Test compatibility with Python 3.12
Add function icalendar.use_pytz().
Allows selecting components with walk(select=func) where func takes a component and returns True or False.
Add compatibility to 7529, adding vMonth and vSkip
Add sphinx-autobuild for livehtml Makefile target.
Add pull request preview on Read the Docs, building only on changes to documentation-related files.
Add link to pull request preview builds in the pull request description only when there are changes to documentation-related files.
Add documentation of live HTML preview of documentation and clean up of install.rst.
Add sphinx-copybutton to allow copying code blocks with a single click of a button.
Change documentation to represent compatibility with Python 3.8 - 3.12, and PyPy3.
Rename RFC 2445 to RFC 5545, see Issue 278
Add PyData Theme version switcher to documentation. See 825.
Add PyData Theme version switcher to documentation. See 825.
Guide to delete the build folder before running tests
Guide to delete the build folder before running tests
Add funding information
Make documentation build with Python 3.12
Update windows to olson conversion for Greenland Standard Time
Extend examples in Usage with alarm and recurrence
Document how to serve the built documentation to view with the browser
Improve test coverage
Create GitHub releases for each tag.
Parse calendars with X-COMMENT properties at the end the file by ignoring these properites
Analyse code coverage of test files
Analyse code coverage of test files
Added corpus to fuzzing directory
Added exclusion of fuzzing corpus in MANIFEST.in
Augmented fuzzer to optionally convert multiple calendars from a source string
Add script to convert OSS FUZZ test cases to Python/pytest test cases
Added additional exception handling of defined errors to fuzzer, to allow fuzzer to explore deeper
Added more instrumentation to fuzz-harness
Rename "contributor" to "collaborator" in documentation
Correct the outdated "icalendar view myfile.ics" command in documentation. #588
Update GitHub Actions steps versions
Keep GitHub Actions up to date with GitHub's Dependabot
Fixed index error in cal.py when attempting to pop from an empty stack
Fixed type error in prop.py when attempting to join strings into a byte-string
Caught Wrong Date Format in ical_fuzzer to resolve fuzzing coverage blocker
The cli utility now displays start and end datetimes in the user's local timezone. Ref: #561 [vimpostor]
The cli utility now displays start and end datetimes in the user's local timezone. Ref: #561 [vimpostor]
Added fuzzing harnesses, for integration to OSSFuzz.
icalendar releases are deployed to Github releases Fixes: #563 [jacadzaca]
CATEGORIES field now accepts a string as argument Ref: #322 [jacadzaca]
Multivalue FREEBUSY property is now parsed properly Ref: #27 [jacadzaca]
Compare equality and inequality of calendars more completely Ref: #570
Use non legacy timezone name. Ref: #567
Add some compare functions. Ref: #568
Change OSS Fuzz build script to point to harnesses in fuzzing directory Ref: #574
Component._encode stops ignoring parameters argument on native values, now merges them Fixes: #557 [zocker1999net]
Component._encode stops ignoring parameters argument on native values, now merges them Fixes: #557 [zocker1999net]
PERIOD values now set the timezone of their start and end. #556
PERIOD values now set the timezone of their start and end. #556
Update build configuration to build readthedocs. #538
Update build configuration to build readthedocs. #538
No longer run the plone.app.event tests.
Add documentation on how to parse .ics files. #152
Move pip caching into Python setup action.
Check that issue #165 can be closed.
Updated about.rst for issue #527
Avoid vText.__repr__ BytesWarning.
Calendar components are now properly compared Ref: #550 Fixes: #526 [jacadzaca]
to_ical() now accepts RRULE BYDAY values>=10 #518
to_ical() now accepts RRULE BYDAY values>=10 #518
Minor changes ~~~~~~~~~~~~~ - Adjusted duration regex
Adjusted duration regex
Added support for BYWEEKDAY in vRecur ref: #268
Added support for BYWEEKDAY in vRecur ref: #268
Fix problem with ORGANIZER in FREE/BUSY #348
Improved documentation Ref: #503, #504
Improved documentation Ref: #503, #504
vBoolean can now be used as an parameter Ref: #501 Fixes: #500 [jacadzaca]
vDDDTypes is hashable #487 #492 [niccokunzmann]
vDDDTypes is hashable #487 #492 [niccokunzmann]
vDDDTypes' equality also checks the dt attribute #497 #492 [niccokunzmann]
Refactored cal.py, tools.py and completed remaining minimal refactoring in parser.py. Ref: #481 [pronoym99]
Refactored cal.py, tools.py and completed remaining minimal refactoring in parser.py. Ref: #481 [pronoym99]
Calendar.from_ical no longer throws long errors Ref: #473 Fixes: #472 [jacadzaca]
Make datetime value shorter by removing the value parameter where possible. Fixes: #318 [jacadzaca], [niccokunzmann]
source code in documentation is tested using doctest #445 [niccokunzmann]
broken properties are not added to the parent component Ref: #471 Fixes: #464 [jacadzaca]
fixed setuptools deprecation warnings [mgorny]
fixed setuptools deprecation warnings [mgorny]
a well-known timezone timezone prefixed with a / is treated as if the slash wasn't present Ref: #467 Fixes: #466 [jacadzaca]
Breaking changes ~~~~~~~~~~~~~~~~
removed deprecated test checks [tuergeist]
Fix: cli does not support DURATION #354 [mamico]
Add changelog and contributing to readthedocs documentation #428 [peleccom]
fixed small typos #323 [rohnsha0]
unittest to parametrized pytest refactoring [jacadzaca]
Require Python 3.7 as minimum Python version. [maurits] [niccokunzmann]
icalendar now takes a ics file directly as an input
icalendar's CLI utility program's output is different
Drop Support for Python 3.6. Versions 3.7 - 3.11 are supported and tested.
icalendar utility outputs a 'Duration' row
icalendar can take multiple ics files as an input
Changed tools.UIDGenerator instance methods to static methods Ref: #345 [spralja]
proper handling of datetime objects with tzinfo generated through zoneinfo.ZoneInfo. Ref: #334 Fixes: #333 [tobixen]
Timestamps in UTC does not need tzid Ref: #338 Fixes: #335 [tobixen]
add __eq__ to icalendar.prop.vDDDTypes #391 [jacadzaca]
Refactor deprecated unittest aliases for Python 3.11 compatibility #330 [tirkarthi]
Breaking changes ~~~~~~~~~~~~~~~~
Drop support for Python 3.4, 3.5 and PyPy2. [maurits]
Document development setup Ref: #358 [niccokunzmann]
Test with GitHub Actions. [maurits]
Add PyData Theme version switcher to documentation. See 825.
Add PyData Theme version switcher to documentation. See 825.
Nothing published for this version
No longer test on Python 3.4, 3.5 and PyPy2, because we cannot get it to work. Technically it should still work, it is just no longer tested. Do not e
No longer test on Python 3.4, 3.5 and PyPy2, because we cannot get it to work. Technically it should still work, it is just no longer tested. Do not expect much development on branch 4.x anymore. The main branch will be for the remaining Python versions that we support. [maurits]
Test with GitHub Actions. [maurits]
Fix vCategories for correct en/de coding. [thet]
Fix vCategories for correct en/de coding. [thet]
vDuration property value: Fix changing duration sign after multiple to_ical calls. Ref: #320 Fixes: #319 [barlik]
Support added for Python 3.9 and 3.10 (no code changes needed).
Support added for Python 3.9 and 3.10 (no code changes needed).
Replace bare 'except:' with 'except Exception:' (#281)
fixed rrule handling, re-enabled test_create_america_new_york()
fixed rrule handling, re-enabled test_create_america_new_york()
Use vText as default type, when convert recurrence definition to ical string. [kam193]
Use vText as default type, when convert recurrence definition to ical string. [kam193]
Fixed a docs issue related to building on Read the Docs [davidfischer]
Fixed a docs issue related to building on Read the Docs [davidfischer]
Reduce Hypothesis iterations to speed up testing, allowing PRs to pass [UniversalSuperBox]
Reduce Hypothesis iterations to speed up testing, allowing PRs to pass [UniversalSuperBox]
Categories are comma separated not 1 per line #265. [cleder]
Categories are comma separated not 1 per line #265. [cleder]
mark test with mixed timezoneaware and naive datetimes as an expected failure. [cleder]
Update all pypi.python.org URLs to pypi.org [jon.dufresne]
Update all pypi.python.org URLs to pypi.org [jon.dufresne]
Added rudimentary command line interface. [jfjlaros]
Added rudimentary command line interface. [jfjlaros]
Readme, setup and travis updates. [jdufresne, PabloCastellano]
Breaking changes ~~~~~~~~~~~~~~~~
Drop support for Python 2.6 and 3.3.
Accept Windows timezone identifiers as valid. #242 [geier]
Accept Windows timezone identifiers as valid. #242 [geier]
Fix ResourceWarnings in setup.py when Python warnings are enabled. #244 [jdufresne]
Fix invalid escape sequences in string and bytes literals. #245 [jdufresne]
Include license file in the generated wheel package. #243 [jdufresne]
Fix non-ASCII TZID and TZNAME parameter handling. #238 [clivest]
Docs: update install instructions. #240 [Ekran]
added vUTCOffset.ignore_exceptions to allow surpressing of failed TZOFFSET parsing (for now this ignores the check for offsets > 24h) [geier]
added vUTCOffset.ignore_exceptions to allow surpressing of failed TZOFFSET parsing (for now this ignores the check for offsets > 24h) [geier]
Fix VTIMEZONE\ s including RDATEs #234. [geier]
Fix VTIMEZONEs including RDATEs #234. [geier]
added an assertion that VTIMEZONE sub-components' DTSTART must be of type DATETIME [geier]
added an assertion that VTIMEZONE sub-components' DTSTART must be of type DATETIME [geier]
Fix handling of VTIMEZONEs with subcomponents with the same DTSTARTs and OFFSETs but which are of different types [geier]
Don't break on parameter values which contain equal signs, e.g. base64 encoded binary data [geier]
Don't break on parameter values which contain equal signs, e.g. base64 encoded binary data [geier]
Fix handling of VTIMEZONEs with subcomponents with the same DTSTARTs. [geier]
Removed setuptools as a dependency as it was only required by setup.py and not by the package.
Removed setuptools as a dependency as it was only required by setup.py and not by the package.
Don't split content lines on the unicode LINE SEPARATOR character \u2028 but only on CRLF or LF.
Your coding agent can read these notes before it upgrades. Set up the MCP server →