Skip to content

Commit

Permalink
fix #526
Browse files Browse the repository at this point in the history
  • Loading branch information
jacadzaca committed Sep 1, 2023
1 parent b0ffff8 commit 4317714
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 1 deletion.
5 changes: 4 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ Changelog

Minor changes:

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

Breaking changes:

Expand Down
16 changes: 16 additions & 0 deletions src/icalendar/cal.py
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,22 @@ def __repr__(self):
subs = ', '.join(str(it) for it in self.subcomponents)
return f"{self.name or type(self).__name__}({dict(self)}{', ' + subs if subs else ''})"

def __eq__(self, other):
properties_equal = super().__eq__(other)
if not properties_equal:
return False

# The subcomponents might not be in the same order,
# neither there's a natural key we can sort the subcomponents by nor
# are the subcomponent types hashable, so we cant put them in a set to
# check for set equivalence. We have to iterate over the subcomponents
# and look for each of them in the list.
for subcomponent in self.subcomponents:
if subcomponent not in other.subcomponents:
return False

return True


#######################################
# components defined in RFC 5545
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-2023
BEGIN:VEVENT
UID:ical-jacadzaca-3
SUMMARY: Some very different event ':'
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T160000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T163000
DTSTAMP:20211004T150245Z
END:VEVENT
BEGIN:VEVENT
UID:ical-jacadzaca-4
SUMMARY: Some very different other event
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T164000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T165000
DTSTAMP:20211004T150245Z
END:VEVENT
END:VCALENDAR
18 changes: 18 additions & 0 deletions src/icalendar/tests/calendars/issue_526_calendar_with_events.ics
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-2023
BEGIN:VEVENT
UID:1
SUMMARY: Some event ':'
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T160000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T163000
DTSTAMP:20211004T150245Z
END:VEVENT
BEGIN:VEVENT
UID:2
SUMMARY: Some other event
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T164000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T165000
DTSTAMP:20211004T150245Z
END:VEVENT
END:VCALENDAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-2023
BEGIN:VEVENT
UID:2
SUMMARY: Some other event
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T164000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T165000
DTSTAMP:20211004T150245Z
END:VEVENT
BEGIN:VEVENT
UID:1
SUMMARY: Some event ':'
DTSTART;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T160000
DTEND;TZID="Western/Central Europe";VALUE=DATE-TIME:20211101T163000
DTSTAMP:20211004T150245Z
END:VEVENT
END:VCALENDAR
36 changes: 36 additions & 0 deletions src/icalendar/tests/test_unit_cal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from datetime import timedelta
import unittest

import pytest

import icalendar
import pytz
import re
Expand Down Expand Up @@ -455,3 +457,37 @@ def test_cal_strict_parsing(self):
icalendar.vUTCOffset.ignore_exceptions = True
self.assertEqual(icalendar.Calendar.from_ical(cal_str).to_ical(), cal_str)
icalendar.vUTCOffset.ignore_exceptions = False


@pytest.mark.parametrize('calendar', [
'issue_156_RDATE_with_PERIOD_TZID_khal',
'issue_156_RDATE_with_PERIOD_TZID_khal_2',
'issue_178_custom_component_contains_other',
'issue_178_custom_component_inside_other',
'issue_526_calendar_with_events',
'issue_526_calendar_with_different_events',
])
@pytest.mark.parametrize('other_calendar', [
'issue_156_RDATE_with_PERIOD_TZID_khal',
'issue_156_RDATE_with_PERIOD_TZID_khal_2',
'issue_178_custom_component_contains_other',
'issue_178_custom_component_inside_other',
'issue_526_calendar_with_events',
'issue_526_calendar_with_different_events',
])
def test_comparing_calendars(calendars, calendar, other_calendar):
are_calendars_equal = calendars[calendar] == calendars[other_calendar]
are_calendars_actually_equal = calendar == other_calendar
assert are_calendars_equal == are_calendars_actually_equal


@pytest.mark.parametrize('calendar, shuffeled_calendar', [
(
'issue_526_calendar_with_events',
'issue_526_calendar_with_shuffeled_events',
),
])
def test_calendars_with_same_subcomponents_in_different_order_are_equal(calendars, calendar, shuffeled_calendar):
assert not calendars[calendar].subcomponents == calendars[shuffeled_calendar].subcomponents
assert calendars[calendar] == calendars[shuffeled_calendar]

0 comments on commit 4317714

Please sign in to comment.