{"id":21134722,"url":"https://github.com/allenporter/ical","last_synced_at":"2026-02-15T01:11:35.571Z","repository":{"id":45816838,"uuid":"512342387","full_name":"allenporter/ical","owner":"allenporter","description":"iCalendar rfc 2445 implementation","archived":false,"fork":false,"pushed_at":"2026-02-13T06:14:59.000Z","size":1676,"stargazers_count":42,"open_issues_count":32,"forks_count":18,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-13T10:35:02.890Z","etag":null,"topics":["calendar","ical","icalendar","ics","rfc5545"],"latest_commit_sha":null,"homepage":"https://allenporter.github.io/ical/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/allenporter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-07-10T04:16:44.000Z","updated_at":"2026-02-13T06:14:44.000Z","dependencies_parsed_at":"2023-11-19T04:23:18.725Z","dependency_job_id":"38232a12-8a4f-4c1e-a253-2ba6fb2f0460","html_url":"https://github.com/allenporter/ical","commit_stats":{"total_commits":189,"total_committers":4,"mean_commits":47.25,"dds":0.3862433862433863,"last_synced_commit":"6a12d2f79ee8a52b6d665ef1e75dbb1ded69c844"},"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/allenporter/ical","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allenporter%2Fical","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allenporter%2Fical/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allenporter%2Fical/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allenporter%2Fical/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/allenporter","download_url":"https://codeload.github.com/allenporter/ical/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allenporter%2Fical/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29463676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T01:01:38.065Z","status":"ssl_error","status_checked_at":"2026-02-15T01:01:23.809Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","ical","icalendar","ics","rfc5545"],"created_at":"2024-11-20T06:34:15.329Z","updated_at":"2026-02-15T01:11:35.555Z","avatar_url":"https://github.com/allenporter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"This is an iCalendar rfc 5545 implementation in python. The goal of this\nproject is to offer a calendar library that fills gaps in other widely used\ncalendar libraries such as:\n\n- Relevant and practical features needed for building a calendar application -- namely recurring events.\n- Simple APIs that are straight forward to use\n- High quality code base with high test coverage and regular releases.\n\nical's main focus is on simplicity. Internally, this library uses other existing\ndata parsing libraries making it easy to support as much as possible of rfc5545.\nIt is not a goal to support everything exhaustively (e.g. enterprise features),\nhowever, the simplicity of the implementation makes it easy to do so. The package\nhas high coverage, and high test coverage, and is easy to extend with new rfc5545\nproperties.\n\nThis packages uses semantic versioning, and releases often, and works\non recent python versions.\n\nSee [documentation](https://allenporter.github.io/ical/) for full quickstart and API reference.\n\n# Quickstart\n\nThe example below creates a Calendar, then adds an all day event to\nthe calendar, then iterates over all events on the calendar.\n\n```python\nfrom datetime import date\n\nfrom ical.calendar import Calendar\nfrom ical.event import Event\n\ncalendar = Calendar()\ncalendar.events.append(\n    Event(summary=\"Event summary\", start=date(2022, 7, 3), end=date(2022, 7, 4)),\n)\nfor event in calendar.timeline:\n    print(event.summary)\n```\n\n# Reading ics files\n\nThis example parses an .ics file from disk and creates a `ical.calendar.Calendar` object, then\nprints out the events in order:\n\n```python\nfrom pathlib import Path\nfrom ical.calendar_stream import IcsCalendarStream\nfrom ical.exceptions import CalendarParseError\n\nfilename = Path(\"example/calendar.ics\")\nwith filename.open() as ics_file:\n    try:\n        calendar = IcsCalendarStream.calendar_from_ics(ics_file.read())\n    except CalendarParseError as err:\n        print(f\"Failed to parse ics file '{str(filename)}': {err}\")\n    else:\n        print([event.summary for event in calendar.timeline])\n```\n\n# Writing ics files\n\nThis example writes a calendar object to an ics output file:\n\n```python\nfrom pathlib import Path\nfrom ical.calendar_stream import IcsCalendarStream\n\nfilename = Path(\"example/output.ics\")\nwith filename.open() as ics_file:\n    ics_file.write(IcsCalendarStream.calendar_to_ics(calendar))\n```\n\n# Application-level APIs\n\nThe above APIs are used for lower level interaction with calendar components,\nhowever applications require a higher level interface to manage some of the\nunderlying complexity. The `ical.store` library is used to manage state at a higher\nlevel (e.g. ensuring timezones are created properly) or handling edits to\nrecurring events.\n\n# Recurring events\n\nA calendar event may be recurring (e.g. weekly, monthly, etc). Recurring events\nare represented in a `ical.calendar.Calendar` with a single `ical.event.Event` object, however\nwhen observed through a `ical.timeline.Timeline` will be expanded based on the recurrence rule.\nSee the `rrule`, `rdate`, and `exdate` fields on the `ical.event.Event` for more details.\n\n# Related Work\n\nThere are other python rfc5545 implementations that are more mature, and having\nbeen around for many years, are still active, and served as reference\nimplementations for this project:\n\n  - Ics.py - [github](https://github.com/ics-py/ics-py) [docs](https://icspy.readthedocs.io/en/stable/) - Since 2013\n  - icalendar [github](https://github.com/collective/icalendar) [docs](https://icalendar.readthedocs.io/) - Since 2005\n\nYou may prefer these projects if you want something that changes less often or\nif you require a non-modern version of python and if you don't mind patching\nrecurring events on top yourself e.g. using `python-recurring-ical-events`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallenporter%2Fical","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fallenporter%2Fical","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallenporter%2Fical/lists"}