Source code for icalendar.cli
#!/usr/bin/env python3
"""utility program that allows user to preview calendar's events"""
import argparse
import sys
from datetime import datetime
from icalendar import __version__
from icalendar.cal.calendar import Calendar
def _format_name(address):
"""Retrieve the e-mail and the name from an address.
:arg an address object, e.g. mailto:test@test.test
:returns str: The name and the e-mail address.
"""
email = address.split(":")[-1]
name = email.split("@")[0]
if not email:
return ""
return f"{name} <{email}>"
def _format_attendees(attendees):
"""Format the list of attendees.
:arg any attendees: Either a list, a string or a vCalAddress object.
:returns str: Formatted list of attendees.
"""
if isinstance(attendees, str):
attendees = [attendees]
return "\n".join(s.rjust(len(s) + 5) for s in map(_format_name, attendees))
[docs]
def view(event):
"""Make a human readable summary of an iCalendar file.
:returns str: Human readable summary.
"""
summary = event.get("summary", default="")
organizer = _format_name(event.get("organizer", default=""))
attendees = _format_attendees(event.get("attendee", default=[]))
location = event.get("location", default="")
comment = event.get("comment", "")
description = event.get("description", "").split("\n")
description = "\n".join(s.rjust(len(s) + 5) for s in description)
start = event.decoded("dtstart")
if "duration" in event:
end = event.decoded("dtend", default=start + event.decoded("duration"))
else:
end = event.decoded("dtend", default=start)
duration = event.decoded("duration", default=end - start)
if isinstance(start, datetime):
start = start.astimezone()
start = start.strftime("%c")
if isinstance(end, datetime):
end = end.astimezone()
end = end.strftime("%c")
return f""" Organizer: {organizer}
Attendees:
{attendees}
Summary : {summary}
Starts : {start}
End : {end}
Duration : {duration}
Location : {location}
Comment : {comment}
Description:
{description}"""
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"calendar_files", nargs="+",
type=argparse.FileType("r", encoding="utf-8-sig"),
help="one or more .ics files (use '-' for stdin)"
)
parser.add_argument(
"--output",
"-o",
type=argparse.FileType("w"),
default=sys.stdout,
help="output file",
)
parser.add_argument(
"-v",
"--version",
action="version",
version=f"{parser.prog} version {__version__}",
)
argv = parser.parse_args()
for f in argv.calendar_files:
calendar = Calendar.from_ical(f.read())
for event in calendar.walk("vevent"):
argv.output.write(view(event) + "\n\n")
__all__ = ["main", "view"]
if __name__ == "__main__":
main()