Change log#

We use Semantic Versioning.

  • Breaking changes increase the major version number.

  • New features increase the minor version number.

  • Minor changes and bug fixes increase the patch version number.

7.x series#

Developers may be concerned about upgrading to a new major release. Upgrading from 6.x to 7.x should have no complications for most developers, because:

  • the core API stays compatible with 4.x

  • the breaking changes likely affect you only if you are an icalendar expert, not a normal user

We still recommend checking out the new features and giving feedback in the repository.

7.0.0a4 (unreleased)#

Minor changes#

  • Created an example() method for the Todo component. See #743.

  • Created an example() method for the Alarm component. See #743.

  • Move property classes from icalendar.prop into their own files. See #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. See #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. See #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

  • 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.

Breaking changes#

  • Drop support for Python 3.8 and 3.9. See #977.

  • Component.decoded() now returns a string instead of bytes for text properties.

New features#

  • 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 vBrokenProperty, 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. See #1060.

  • Added with_uid method to Component to filter subcomponents by UID. See #950.

Bug fixes#

  • 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. See #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). See #1073.

  • Fixed icalendar.caselessdict.CaselessDict.__eq__() to return NotImplemented when comparing with non-dict types instead of raising AttributeError. See #1016.

  • Fixed decoding of categories. See #279.

  • Link timedelta to datetime.timedelta in the Python standard library documentation. See #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. See #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. See #137.

Documentation#

  • Added how-to guide for handling parsing errors with vBrokenProperty and the component.errors attribute. See #1085.

  • Updated 11 function docstrings in icalendar.parser to follow the Google Style guide, improving API documentation clarity and consistency. See #1072.

  • Applied Google-style docstrings to icalendar.tools utility functions with Args, Returns, and Example sections. See #1072.

  • Simplify contributors and add supporters in credits. See #1035.

  • Add a section in the change log for Documentation. See #1043.

  • Added ❌ and ✅ emoji to the list of supported RFCs.

  • Fixed multiple more than one target found for cross-reference warnings, and stopped using sphinx.ext.autosectionlabel, in documentation. See #952.

  • Add funding.json manifest for funding information. See #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. See #952.

  • Document how to create and read attendee information in events. See #130.

  • 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. See #991.

  • Moved content from the README into documentation to reduce maintenance and point to the authoritative source of information. See #1006.

  • Added "Code conventions" section to the Development contributing guide. See #1004.

  • Use Google style docstrings in parser_tools. See #1017.

  • Added Upgrade guide. See #997.

  • 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

7.0.0a3 (2025-12-19)#

Minor changes#

  • Add static [project.urls] to pyproject.toml for GitHub dependency graph compatibility. See #1035.

  • Created an example() method for the Todo component. See #743.

  • Add type hints to icalendar.caselessdict file. See #938.

  • For releases, added a step to update the version switcher for documentation.

New features#

  • Added contributor list format and sorting instructions.

Bug fixes#

  • Fix double-unescaping in vText.from_ical() and vCategory.from_ical() by removing unescape_char(). See #1008.

7.0.0a2 (2025-11-29)#

Minor changes#

  • Convert changelog section labels to reStructuredText subheadings for improved Read the Docs navigation. See #982.

  • Move sections in Table of Content of Reference guide.

  • Improve icalendar.prop.vDatetime documentation. See #946.

  • CLI now writes output files using UTF-8 explicitly instead of relying on the system default. See #1005.

New features#

  • Add compatibility to RFC 9253:

    • Add new property types vUid and vXmlReference.

    • Add properties to all components: Component.concepts, Component.links, Component.refids, Component.related_to.

    • Add new values to RELTYPE.

    • Add LABEL, GAP, and VALUE parameters to property values affected by RFC 9253.

  • Allow setting default values in Parameters.

  • Allow None as an argument to Parameters.

  • Add ical_value to several property values. See #876.

  • Add PyData Theme version switcher to documentation. See #825.

  • Test compatibility with Python 3.14. See #973.

  • Added documentation of Vale usage for icalender documentation style guide. See #815.

  • Added funding link to pyproject.toml. See #800.

  • Added documentation of docstring format. See #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 icalendar.is_utc() to check if a timezone is UTC.

  • Add support for JCal parsing and serialization. See #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 icalendar.ComponentFactory.get_component_class() that also creates a new component class when it does not exist.

    • Add icalendar.ComponentFactory.add_component_class() to have a unified interface to add component classes.

    • Add icalendar.Component.to_json(), icalendar.Component.to_jcal(), and icalendar.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() classmethod that returns examples for testing.

  • Added documentation of how to fuzz icalendar. See #905.

  • Added first-time contributors section to Contributing. See #934.

  • Revised check of which files trigger a documentation build on Read the Docs. See #848.

  • Created a separate path to contribute to documentation. See #929.

  • Added a code of conduct. See #907.

  • Added redirects of moved files and 404 not found page to catch any other obsolete URLs. See #959.

  • Added artificial intelligence (AI) policy. See #933.

Bug fixes#

  • 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. See #1005.

6.3.2 (2025-11-03)#

Minor changes#

  • Add PyData Theme version switcher to documentation. See #825.

5.0.14 (2025-11-03)#

Minor changes#

  • Add PyData Theme version switcher to documentation. See #825.

4.1.2 (2025-11-03)#

Minor changes#

  • Add PyData Theme version switcher to documentation. See #825.

7.0.0a1 (28-10-2025)#

Minor changes#

  • 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.

Breaking changes#

  • 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.

New features#

  • 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 RFC 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.

Bug fixes#

  • 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 RFC 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.

6.3.1 (2025-05-20)#

Bug fixes#

  • Remove forced quoting from parameters with space and single quote. See #836.

6.3.0 (2025-05-15)#

Minor changes#

  • Deprecate icalendar.UIDGenerator. See #816.

New features#

  • Add the uid property to Alarm, Event, Calendar, Todo, and Journal components. See #740.

Bug fixes#

  • 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.

6.2.0 (2025-05-07)#

Minor changes#

  • 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.

New features#

  • 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 RFC 6868. See #652.

  • Add freebusy property to the Calendar to get this type of subcomponents easier.

  • Add parameters from RFC 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 RFC 7986 can occur multiple times in VCALENDAR. See #808.

Bug fixes#

  • 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.

6.1.3 (2025-03-19)#

Bug fixes#

  • Fix to permit TZID forward references to VTIMEZONEs

  • Stabelize timezone id lookup, see #780.

6.1.2 (2025-03-19)#

Minor changes#

  • 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.

Bug fixes#

  • Restrict timezones tested, see #763

6.1.1 (2025-01-18)#

Minor changes#

Breaking changes#

  • The relative attribute of vWeekday components has the correct sign now. See #749.

New features#

  • Add Security Policy

  • Python types in documentation now link to their documentation pages using intersphinx.

6.1.0 (2024-11-22)#

Minor changes#

  • 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 RFC 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

New features#

  • Add VALARM properties for RFC 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.

Bug fixes#

  • Add icalendar.timezone to the documentation.

6.0.1 (2024-10-13)#

New features#

  • 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.

Bug fixes#

  • Fix a few __all__ variables.

  • Added missing docs folder to distribution packages. See #712.

6.0.0 (2024-09-28)#

Minor changes#

  • 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

New features#

  • Use pyproject.toml file instead of setup.py

Bug fixes#

  • 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.

6.0.0a0 (2024-07-03)#

Minor changes#

  • 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

Breaking changes#

  • 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
    

New features#

  • 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 RFC 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.

Bug fixes#

  • Change documentation to represent compatibility with Python 3.8 - 3.12, and PyPy3.

  • Rename RFC 2445 to RFC 5545, see Issue 278

5.0.13 (2024-06-20)#

Minor changes#

  • 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

New features#

  • Create GitHub releases for each tag.

Bug fixes#

  • Parse calendars with X-COMMENT properties at the end the file by ignoring these properites

5.0.12 (2024-03-19)#

Minor changes#

  • 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

Bug fixes#

  • 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

5.0.11 (2023-11-03)#

Minor changes#

  • The cli utility now displays start and end datetimes in the user's local timezone. Ref: #561 [vimpostor]

New features#

  • Added fuzzing harnesses, for integration to OSSFuzz.

  • icalendar releases are deployed to Github releases Fixes: #563 [jacadzaca]

Bug fixes#

  • 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

5.0.10 (2023-09-26)#

Bug fixes#

  • Component._encode stops ignoring parameters argument on native values, now merges them Fixes: #557 [zocker1999net]

5.0.9 (2023-09-24)#

Bug fixes#

  • PERIOD values now set the timezone of their start and end. #556

5.0.8 (2023-09-18)#

Minor changes#

  • 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.

Bug fixes#

  • Calendar components are now properly compared Ref: #550 Fixes: #526 [jacadzaca]

5.0.7 (2023-05-29)#

Bug fixes#

  • to_ical() now accepts RRULE BYDAY values>=10 #518

5.0.6 (2023-05-26)#

Minor changes#

  • Adjusted duration regex

5.0.5 (2023-04-13)#

Minor changes#

  • Added support for BYWEEKDAY in vRecur ref: #268

Bug fixes#

  • Fix problem with ORGANIZER in FREE/BUSY #348

5.0.4 (2022-12-29)#

Minor changes#

  • Improved documentation Ref: #503, #504

Bug fixes#

  • vBoolean can now be used as an parameter Ref: #501 Fixes: #500 [jacadzaca]

5.0.3 (2022-11-23)#

New features#

  • vDDDTypes is hashable #487 #492 [niccokunzmann]

Bug fixes#

  • vDDDTypes' equality also checks the dt attribute #497 #492 [niccokunzmann]

5.0.2 (2022-11-03)#

Minor changes#

  • 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]

New features#

  • source code in documentation is tested using doctest #445 [niccokunzmann]

Bug fixes#

  • broken properties are not added to the parent component Ref: #471 Fixes: #464 [jacadzaca]

5.0.1 (2022-10-22)#

Minor changes#

  • fixed setuptools deprecation warnings [mgorny]

Bug fixes#

  • a well-known timezone timezone prefixed with a / is treated as if the slash wasn't present Ref: #467 Fixes: #466 [jacadzaca]

5.0.0 (2022-10-17)#

Minor 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]

Breaking changes#

  • 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.

New features#

  • icalendar utility outputs a 'Duration' row

  • icalendar can take multiple ics files as an input

Bug fixes#

  • 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]

5.0.0a1 (2022-07-11)#

Breaking changes#

  • Drop support for Python 3.4, 3.5 and PyPy2. [maurits]

New features#

  • Document development setup Ref: #358 [niccokunzmann]

Bug fixes#

  • Test with GitHub Actions. [maurits]

4.1.0 (2022-07-11)#

New features#

  • 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]

Bug fixes#

  • Test with GitHub Actions. [maurits]

4.0.9 (2021-10-16)#

Bug fixes#

  • 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]

4.0.8 (2021-10-07)#

Bug fixes#

  • Support added for Python 3.9 and 3.10 (no code changes needed).

  • Replace bare 'except:' with 'except Exception:' (#281)

4.0.7 (2020-09-07)#

Bug fixes#

  • fixed rrule handling, re-enabled test_create_america_new_york()

4.0.6 (2020-05-06)#

Bug fixes#

  • Use vText as default type, when convert recurrence definition to ical string. [kam193]

4.0.5 (2020-03-21)#

Bug fixes#

  • Fixed a docs issue related to building on Read the Docs [davidfischer]

4.0.4 (2019-11-25)#

Bug fixes#

  • Reduce Hypothesis iterations to speed up testing, allowing PRs to pass [UniversalSuperBox]

4.0.3 (2018-10-10)#

Bug fixes#

  • Categories are comma separated not 1 per line #265. [cleder]

  • mark test with mixed timezoneaware and naive datetimes as an expected failure. [cleder]

4.0.2 (2018-06-20)#

Bug fixes#

  • Update all pypi.python.org URLs to pypi.org [jon.dufresne]

4.0.1 (2018-02-11)#

  • Added rudimentary command line interface. [jfjlaros]

  • Readme, setup and travis updates. [jdufresne, PabloCastellano]

4.0.0 (2017-11-08)#

Breaking changes#

  • Drop support for Python 2.6 and 3.3.

3.12 (2017-11-07)#

New features#

  • Accept Windows timezone identifiers as valid. #242 [geier]

Bug fixes#

  • 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]

3.11.7 (2017-08-27)#

New features#

  • added vUTCOffset.ignore_exceptions to allow surpressing of failed TZOFFSET parsing (for now this ignores the check for offsets > 24h) [geier]

3.11.6 (2017-08-04)#

Bug fixes#

  • Fix VTIMEZONEs including RDATEs #234. [geier]

3.11.5 (2017-07-03)#

Bug fixes#

  • 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]

3.11.4 (2017-05-10)#

Bug fixes#

  • 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]

3.11.3 (2017-02-15)#

Bug fixes#

  • 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.

3.11.2 (2017-01-12)#

Bug fixes#

  • Run tests with python 3.5 and 3.6. [geier]

  • Allow tests failing with pypy3 on travis.ci. [geier]

3.11.1 (2016-12-19)#

Bug fixes#

  • Encode error message before adding it to the stack of collected error messages.

3.11 (2016-11-18)#

Fixes:

  • Successfully test with pypy and pypy3. [gforcada]

  • Minor documentation update. [tpltnt]

3.10 (2016-05-26)#

New:

  • Updated components description to better comply with RFC 5545. Refs #183. [stlaz]

  • Added PERIOD value type to date types. Also fixes incompatibilities described in #184. Refs #189. [stlaz]

Fixes:

  • Fix testsuite for use with dateutil>=2.5. Refs #195. [untitaker]

  • Reintroduce cal.Component.is_broken that was removed with 3.9.2. Refs #185. [geier]

3.9.2 (2016-02-05)#

New:

  • Defined test_suite in setup.py. Now tests can be run via python setup.py test. [geier]

Fixes:

  • Fixed cal.Component.from_ical() representing an unknown component as one of the known. [stlaz]

  • Fixed possible IndexError exception during parsing of an ical string. [stlaz]

  • When doing a boolean test on icalendar.cal.Component, always return True. Before it was returning False due to CaselessDict, if it didn't contain any items. [stlaz]

  • Fixed date-time being recognized as date or time during parsing. Added better error handling to parsing from ical strings. [stlaz]

  • Added __version__ attribute to init.py. [TomTry]

  • Documentation fixes. [TomTry]

  • Pep 8, UTF 8 headers, dict/list calls to literals. [thet]

3.9.1 (2015-09-08)#

  • Fix vPeriod.__repr__. [spacekpe]

  • Improve foldline() performance. This improves the foldline performance, especially for large strings like base64-encoded inline attachements. In some cases (1MB string) from 7 Minutes to less than 20ms for ASCII data and 500ms for non-ASCII data. Ref: #163. [emfree]

3.9.0 (2015-03-24)#

  • Creating timezone objects from VTIMEZONE components. [geier]

  • Make python-dateutil a dependency. [geier]

  • Made RRULE tolerant of trailing semicolons. [sleeper]

  • Documentation fixes. [t-8ch, thet]

3.8.4 (2014-11-01)#

  • Add missing BYWEEKNO to recurrence rules. [russkel]

3.8.3 (2014-08-26)#

  • PERCENT property in VTODO renamed to PERCENT-COMPLETE, according to RFC5545. [thomascube]

3.8.2 (2014-07-22)#

  • Exclude editor backup files from egg distributions. Fixes #144. [thet]

3.8.1 (2014-07-17)#

  • The representation of CaselessDicts in 3.8 changed the name attribute of Components and therefore broke the external API. This has been fixed. [untitaker]

3.8 (2014-07-17)#

  • Allow dots in property names (Needed for vCard compatibility). Refs #143. [untitaker]

  • Change class representation for CaselessDict objects to always include the class name or the class' name attribute, if available. Also show subcomponents for Component objects. [thet]

  • Don't use data_encode for CaselessDict class representation but use dict's __repr__ method. [t-8ch]

  • Handle parameters with multiple values, which is needed for vCard 3.0. Refs #142. [t-8ch]

3.7 (2014-06-02)#

  • For components with ignore_exceptions set to True, mark unparseable lines as broken instead rising a ValueError. VEVENT components have ignore_exceptions set to True by default. Ref #131. Fixes #104. [jkiang13]

  • Make python-dateutil a soft-dependency. [boltnev]

  • Add optional sorted parameter to Component.to_ical. Setting it to false allows the user to preserve the original property and parameter order. Ref #136. Fixes #133. [untitaker]

  • Fix tests for latest pytz. Don't set tzinfo directly on datetime objects, but use pytz's localize function. Ref #138. [untitaker, thet]

  • Remove incorrect use of __all__. We don't encourage using from package import * imports. Fixes #129. [eric-wieser]

3.6.2 (2014-04-05)#

  • Pep8 and cleanup. [lasudry]

3.6.1 (2014-01-13)#

  • Open text files referenced by setup.py as utf-8, no matter what the locale settings are set to. Fixes #122. [sochotnicky]

  • Add tox.ini to source tarball, which simplifies testing for in distributions. [sochotnicky]

3.6 (2014-01-06)#

  • Python3 (3.3+) + Python 2 (2.6+) support [geier]

  • Made sure to_ical() always returns bytes [geier]

  • Support adding lists to a component property, which value already was a list and remove the Component.set method, which was only used by the add method. [thet]

  • Remove ability to add property parameters via a value's params attribute when adding via cal.add (that was only possible for custom value objects and makes up a strange API), but support a parameter attribute on cal.add's method signature to pass a dictionary with property parameter key/value pairs. Fixes #116. [thet]

  • Backport some of Regebro's changes from his regebro-refactor branch. [thet]

  • Raise explicit error on another malformed content line case. [hajdbo]

  • Correctly parse datetime component property values with timezone information when parsed from ical strings. [untitaker]

3.5 (2013-07-03)#

  • Let to_unicode be more graceful for non-unicode strings, as like CMFPlone's safe_unicode does it. [thet]

3.4 (2013-04-24)#

  • Switch to unicode internally. This should fix all en/decoding errors. [thet]

  • Support for non-ascii parameter values. Fixes #88. [warvariuc]

  • Added functions to transform chars in string with '\' + any of r',;:' chars into '%{:02X}' form to avoid splitting on chars escaped with '\'. [warvariuc]

  • Allow seconds in vUTCOffset properties. Fixes #55. [thet]

  • Let Component.decode better handle vRecur and vDDDLists properties. Fixes #70. [thet]

  • Don't let Component.add re-encode already encoded values. This simplifies the API, since there is no need explicitly pass encode=False. Fixes #82. [thet]

  • Rename tzinfo_from_dt to tzid_from_dt, which is what it does. [thet]

  • More support for dateutil parsed tzinfo objects. Fixes #89. [leo-naeka]

  • Remove python-dateutil version fix at all. Current python-dateutil has Py3 and Py2 compatibility. [thet]

  • Declare the required python-dateutil dependency in setup.py. Fixes #90. [kleink]

  • Raise test coverage. [thet]

  • Remove interfaces module, as it is unused. [thet]

  • Remove test_doctests.py, test suite already created properly in test_icalendar.py. [rnix]

  • Transformed doctests into unittests, Test fixes and cleanup. [warvariuc]

3.3 (2013-02-08)#

  • Drop support for Python < 2.6. [thet]

  • Allow vGeo to be instantiated with list and not only tuples of geo coordinates. Fixes #83. [thet]

  • Don't force to pass a list to vDDDLists and allow setting individual RDATE and EXDATE values without having to wrap them in a list. [thet]

  • Fix encoding function to allow setting RDATE and EXDATE values and not to have bypass encoding with an icalendar property. [thet]

  • Allow setting of timezone for vDDDLists and support timezone properties for RDATE and EXDATE component properties. [thet]

  • Move setting of TZID properties to vDDDTypes, where it belongs to. [thet]

  • Use @staticmethod decorator instead of wrapper function. [warvariuc, thet]

  • Extend quoting of parameter values to all of those characters: ",;: ’'". This fixes an outlook incompatibility with some characters. Fixes: #79, Fixes: #81. [warvariuc]

  • Define VTIMETZONE subcomponents STANDARD and DAYLIGHT for RFC5545 compliance. [thet]

3.2 (2012-11-27)#

  • Documentation file layout restructuring. [thet]

  • Fix time support. vTime events can be instantiated with a datetime.time object, and do not inherit from datetime.time itself. [rdunklau]

  • Correctly handle tzinfo objects parsed with dateutil. Fixes #77. [warvariuc, thet]

  • Text values are escaped correclty. Fixes #74. [warvariuc]

  • Returned old folding algorithm, as the current implementation fails in some cases. Fixes #72, Fixes #73. [warvariuc]

  • Supports to_ical() on date/time properties for dates prior to 1900. [cdevienne]

3.1 (2012-09-05)#

  • Make sure parameters to certain properties propagate to the ical output. [kanarip]

  • Re-include doctests. [rnix]

  • Ensure correct datatype at instance creation time in prop.vCalAddress and prop.vText. [rnix]

  • Apply TZID parameter to datetimes parsed from RECURRENCE-ID [dbstovall]

  • Localize datetimes for timezones to avoid DST transition errors. [dbstovall]

  • Allow UTC-OFFSET property value data types in seconds, which follows RFC5545 specification. [nikolaeff]

  • Remove utctz and normalized_timezone methods to simplify the codebase. The methods were too tiny to be useful and just used at one place. [thet]

  • When using Component.add() to add icalendar properties, force a value conversion to UTC for CREATED, DTSTART and LAST-MODIFIED. The RFC expects UTC for those properties. [thet]

  • Removed last occurrences of old API (from_string). [Rembane]

  • Add 'recursive' argument to property_items() to switch recursive listing. For example when parsing a text/calendar text including multiple components (e.g. a VCALENDAR with 5 VEVENT``s), the previous situation required us to look over all properties in ``VEVENT``s even if we just want the properties under the ``VCALENDAR component (VERSION, PRODID, CALSCALE, METHOD). [dmikurube]

  • All unit tests fixed. [mikaelfrykholm]

3.0.1b2 (2012-03-01)#

  • For all TZID parameters in DATE-TIME properties, use timezone identifiers (e.g. Europe/Vienna) instead of timezone names (e.g. CET), as required by RFC5545. Timezone names are used together with timezone identifiers in the Timezone components. [thet]

  • Timezone parsing, issues and test fixes. [mikaelfrykholm, garbas, tgecho]

  • Since we use pytz for timezones, also use UTC tzinfo object from the pytz library instead of own implementation. [thet]

3.0.1b1 (2012-02-24)#

  • Update Release information. [thet]

3.0#

  • Add API for proper Timezone support. Allow creating ical DATE-TIME strings with timezone information from Python datetimes with pytz based timezone information and vice versa. [thet]

  • Unify API to only use to_ical and from_ical and remove string casting as a requirement for Python 3 compatibility: New: to_ical. Old: ical, string, as_string and string casting via __str__ and str. New: from_ical. Old: from_string. [thet]

2.2 (2011-08-24)#

  • migration to collective/icalendar using svn2git preserving tags, branches and authors. [garbas]

  • using tox for testing on python 2.4, 2.5, 2.6, 2.6. [garbas]

  • fixed tests so they pass also under python 2.7. [garbas]

  • running tests on https://jenkins.plone.org/job/icalendar (only 2.6 for now) with some other metrics (pylint, clonedigger, coverage). [garbas]

  • review and merge changes from https://github.com/cozi/icalendar fork. [garbas]

  • created sphinx documentation and started documenting development and goals. [garbas]

  • hook out github repository to https://about.readthedocs.com service so sphinx documentation is generated on each commit (for main). Documentation can be visible on: https://icalendar.readthedocs.io/en/latest/ [garbas]

2.1 (2009-12-14)#

  • Fix deprecation warnings about object.__init__ taking no parameters.

  • Set the VALUE parameter correctly for date values.

  • Long binary data would be base64 encoded with newlines, which made the iCalendar files incorrect. (This still needs testing).

  • Correctly handle content lines which include newlines.

2.0.1 (2008-07-11)#

  • Made the tests run under Python 2.5+

  • Renamed the UTC class to Utc, so it would not clash with the UTC object, since that rendered the UTC object unpicklable.

2.0 (2008-07-11)#

  • EXDATE and RDATE now returns a vDDDLists object, which contains a list of vDDDTypes objects. This is do that EXDATE and RDATE can contain lists of dates, as per RFC.

    *Note!*: This change is incompatible with earlier behavior, so if you handle EXDATE and RDATE you will need to update your code.

  • When createing a vDuration of -5 hours (which in itself is nonsensical), the ical output of that was -P1DT19H, which is correct, but ugly. Now it's '-PT5H', which is prettier.

1.2 (2006-11-25)#

  • Fixed a string index out of range error in the new folding code.

1.1 (2006-11-23)#

  • Fixed a bug in caselessdicts popitem. (thanks to Michael Smith <msmith@fluendo.com>)

  • The RFC 2445 was a bit unclear on how to handle line folding when it happened to be in the middle of a UTF-8 character. This has been clarified in the following discussion: [Ietf-calsify] draft-ietf-calsify-rfc2445bis-01.txt / UTF-8. And this is now implemented in iCalendar. It will not fold in the middle of a UTF-8 character, but may fold in the middle of a UTF-8 composing character sequence.

1.0 (2006-08-03)#

  • make get_inline and set_inline support non ascii codes.

  • Added support for creating a python egg distribution.

0.11 (2005-11-08)#

  • Changed component .from_string to use types_factory instead of hardcoding entries to 'inline'

  • Changed UTC tzinfo to a singleton so the same one is used everywhere

  • Made the parser more strict by using regular expressions for key name, param name and quoted/unquoted safe char as per the RFC

  • Added some tests from the schooltool icalendar parser for better coverage

  • Be more forgiving on the regex for folding lines

  • Allow for multiple top-level components on .from_string

  • Fix vWeekdays, wasn't accepting relative param (eg: -3SA vs -SA)

  • vDDDTypes didn't accept negative period (eg: -P30M)

  • 'N' is also acceptable as newline on content lines, per RFC

0.10 (2005-04-28)#

  • moved code to codespeak.net subversion.

  • reorganized package structure so that source code is under 'src' directory. Non-package files remain in distribution root.

  • redid doc/.py files as doc/.txt, using more modern doctest. Before they were .py files with big docstrings.

  • added test.py testrunner, and tests/test_icalendar.py that picks up all doctests in source code and doc directory, and runs them, when typing:

    python2.3 test.py
    
  • renamed iCalendar to lower case package name, lowercased, de-pluralized and shorted module names, which are mostly implementation detail.

  • changed tests so they generate .ics files in a temp directory, not in the structure itself.