iCalendar parser/generator
The icalendar
_ package is a RFC 5545
_ compatible parser/generator for iCalendar
files.
:Homepage: https://icalendar.readthedocs.io
:Code: https://github.com/collective/icalendar
:Mailing list: https://github.com/collective/icalendar/issues
:Dependencies: python-dateutil
_ and pytz
.
:Compatible with: Python 2.7 and 3.4+
:License: BSD
.. image:: https://badge.fury.io/py/icalendar.svg :target: https://pypi.org/project/icalendar/ :alt: Python Package Version on PyPI
.. image:: https://img.shields.io/pypi/dm/icalendar.svg :target: https://pypi.org/project/icalendar/#files :alt: Downloads from PyPI
.. image:: https://img.shields.io/github/actions/workflow/status/collective/icalendar/tests.yml?branch=master&label=master&logo=github :target: https://github.com/collective/icalendar/actions/workflows/tests.yml?query=branch%3Amaster :alt: GitHub Actions build status for master
.. image:: https://img.shields.io/github/actions/workflow/status/collective/icalendar/tests.yml?branch=4.x&label=4.x&logo=github :target: https://github.com/collective/icalendar/actions/workflows/tests.yml?query=branch%3A4.x++ :alt: GitHub Actions build status for 4.x
.. image:: https://readthedocs.org/projects/icalendar/badge/?version=latest :target: https://icalendar.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status
.. _icalendar
: https://pypi.org/project/icalendar/
.. _RFC 5545
: https://www.ietf.org/rfc/rfc5545.txt
.. _python-dateutil
: https://github.com/dateutil/dateutil/
.. _pytz
: https://pypi.org/project/pytz/
.. _BSD
: https://github.com/collective/icalendar/issues/2
To install the package, run::
pip install icalendar
You can open an .ics
file and see all the events::
import icalendar path_to_ics_file = "src/icalendar/tests/calendars/example.ics" with open(path_to_ics_file) as f: ... calendar = icalendar.Calendar.from_ical(f.read()) for event in calendar.walk('VEVENT'): ... print(event.get("SUMMARY")) New Year's Day Orthodox Christmas International Women's Day
Using this package, you can also create calendars from scratch or edit existing ones.
icalendar
is a critical project used by many. It has been there for a long time and maintaining
long-term compatibility with projects conflicts partially with providing and using the features that
the latest Python versions bring.
Since we pour more effort into maintaining and developing icalendar <https://github.com/collective/icalendar/discussions/360>
__,
we split the project into two:
Branch 4.x <https://github.com/collective/icalendar/tree/4.x>
__ with maximum compatibility to Python versions 2.7
and 3.4+
, PyPy2
and PyPy3
.Branch master <https://github.com/collective/icalendar/>
__ with the compatibility to Python versions 3.7+
and PyPy3
.We expect the master
branch with versions 5+
receive the latest updates and features,
and the 4.x
branch the subset of security and bug fixes only.
We recommend migrating to later Python versions and also providing feedback if you depend on the 4.x
features.
icalevents <https://github.com/irgangla/icalevents>
_. It is built on top of icalendar and allows you to query iCal files and get the events happening on specific dates. It manages recurrent events as well.recurring-ical-events <https://pypi.org/project/recurring-ical-events/>
_. Library to query an ICalendar
object for events happening at a certain date or within a certain time.x-wr-timezone <https://pypi.org/project/x-wr-timezone/>
_. Library to make ICalendar
objects and files using the non-standard X-WR-TIMEZONE
compliant with the standard (RFC 5545).Reporting issues to the bugtracker.
Submitting pull requests from a forked icalendar repo.
Extending the documentation.
Sponsor a Sprint (https://plone.org/events/sprints/whatis).
Add a test which proves your fix and make it pass.
Describe your change in CHANGES.rst
Add yourself to the docs/credits.rst
If you would like to setup icalendar to
contribute changes, the Installation Section <https://icalendar.readthedocs.io/en/latest/install.html>
_
should help you further.
Minor changes:
New features:
Bug fixes:
Bug fixes:
Bug fixes:
Minor changes:
plone.app.event
tests..ics
files. #152vText.__repr__
BytesWarning.Bug fixes:
Bug fixes:
Minor changes:
Minor changes:
Bug fixes:
Minor changes:
Bug fixes:
New features:
Bug fixes:
Minor changes:
New features:
Bug fixes:
Minor changes:
Bug fixes:
/
is treated as if the slash wasn't present
Ref: #467
Fixes: #466
[jacadzaca]Minor changes:
Breaking changes:
New features:
Bug fixes:
tzinfo
generated through zoneinfo.ZoneInfo.
Ref: #334
Fixes: #333
[tobixen]__eq__
to icalendar.prop.vDDDTypes
#391 [jacadzaca]Breaking changes:
New features:
Bug fixes:
New features:
Bug fixes:
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]
Bug fixes:
Support added for Python 3.9 and 3.10 (no code changes needed).
Replace bare 'except:' with 'except Exception:' (#281)
Bug fixes:
Bug fixes:
vText
as default type, when convert recurrence definition to ical string. [kam193]Bug fixes:
Bug fixes:
Bug fixes:
Bug fixes:
Added rudimentary command line interface. [jfjlaros]
Readme, setup and travis updates. [jdufresne, PabloCastellano]
Breaking changes:
New features:
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]
New features:
Bug fixes:
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]
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]
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
.
Bug fixes:
Run tests with python 3.5 and 3.6. [geier]
Allow tests failing with pypy3 on travis.ci. [geier]
Bug fixes:
Fixes:
Successfully test with pypy and pypy3. [gforcada]
Minor documentation update. [tpltnt]
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]
New:
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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 VEVENTs), the previous situation required us to look over all properties in VEVENTs even if we just want the properties under the VCALENDAR component (VERSION, PRODID, CALSCALE, METHOD). [dmikurube]
All unit tests fixed. [mikaelfrykholm]
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]
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]
migration to https://github.com/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://readthedocs.org service so sphinx documentation is generated on each commit (for master). Documentation can be visible on: https://icalendar.readthedocs.io/en/latest/ [garbas]
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.
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.
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.
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: http://lists.osafoundation.org/pipermail/ietf-calsify/2006-August/001126.html 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.
make get_inline and set_inline support non ascii codes.
Added support for creating a python egg distribution.
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
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.
Copyright (c) 2012-2013, Plone Foundation All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.