# HG changeset patch # User Paul Boddie # Date 1505234033 -7200 # Node ID 3835eb7e67296a4dc5dbf88bf8633e2e2ed31ff7 # Parent d6c6544c04d31efa63cbd5dc71766998b0f5a2dd Tidied and consolidated period-related code. Added commentary. diff -r d6c6544c04d3 -r 3835eb7e6729 imiptools/data.py --- a/imiptools/data.py Mon Sep 11 23:57:30 2017 +0200 +++ b/imiptools/data.py Tue Sep 12 18:33:53 2017 +0200 @@ -946,6 +946,12 @@ return address def is_mailto_uri(value): + + """ + Return whether 'value' is a mailto: URI, with the protocol potentially being + in upper case. + """ + return value.lower().startswith("mailto:") def get_uri(value): @@ -953,6 +959,9 @@ "Return a URI for the given 'value'." if not value: return None + + # Normalise to "mailto:" or return other URI form. + return is_mailto_uri(value) and ("mailto:%s" % value[7:]) or \ ":" in value and value or \ "mailto:%s" % get_address(value) diff -r d6c6544c04d3 -r 3835eb7e6729 imiptools/period.py --- a/imiptools/period.py Mon Sep 11 23:57:30 2017 +0200 +++ b/imiptools/period.py Tue Sep 12 18:33:53 2017 +0200 @@ -33,6 +33,12 @@ if x is None: return y else: return x +def start_point(obj): + return Comparable(ifnone(obj.get_start_point(), StartOfTime())) + +def end_point(obj): + return Comparable(ifnone(obj.get_end_point(), EndOfTime())) + class Comparable: "A date/datetime wrapper that allows comparisons with other types." @@ -158,23 +164,23 @@ if isinstance(other, PeriodBase): return cmp( - (Comparable(ifnone(self.get_start_point(), StartOfTime())), Comparable(ifnone(self.get_end_point(), EndOfTime()))), - (Comparable(ifnone(other.get_start_point(), StartOfTime())), Comparable(ifnone(other.get_end_point(), EndOfTime()))) + (start_point(self), end_point(self)), + (start_point(other), end_point(other)) ) else: return 1 def overlaps(self, other): - return Comparable(ifnone(self.get_end_point(), EndOfTime())) > Comparable(ifnone(other.get_start_point(), StartOfTime())) and \ - Comparable(ifnone(self.get_start_point(), StartOfTime())) < Comparable(ifnone(other.get_end_point(), EndOfTime())) + return end_point(self) > start_point(other) and \ + start_point(self) < end_point(other) def within(self, other): - return Comparable(ifnone(self.get_start_point(), StartOfTime())) >= Comparable(ifnone(other.get_start_point(), StartOfTime())) and \ - Comparable(ifnone(self.get_end_point(), EndOfTime())) <= Comparable(ifnone(other.get_end_point(), EndOfTime())) + return start_point(self) >= start_point(other) and \ + end_point(self) <= end_point(other) def common(self, other): - start = max(Comparable(ifnone(self.get_start_point(), StartOfTime())), Comparable(ifnone(other.get_start_point(), StartOfTime()))) - end = min(Comparable(ifnone(self.get_end_point(), EndOfTime())), Comparable(ifnone(other.get_end_point(), EndOfTime()))) + start = max(start_point(self), start_point(other)) + end = min(end_point(self), end_point(other)) if start <= end: return self.make_corrected(start.dt, end.dt) else: diff -r d6c6544c04d3 -r 3835eb7e6729 imipweb/data.py --- a/imipweb/data.py Mon Sep 11 23:57:30 2017 +0200 +++ b/imipweb/data.py Tue Sep 12 18:33:53 2017 +0200 @@ -129,17 +129,23 @@ dtstart, dtstart_attr = self.get_start_item() if not dtstart: - raise PeriodError(*[index is not None and ("dtstart", index) or "dtstart"]) + if index is not None: + raise PeriodError(("dtstart", index)) + else: + raise PeriodError("dtstart") dtend, dtend_attr = self.get_end_item() if not dtend: - raise PeriodError(*[index is not None and ("dtend", index) or "dtend"]) + if index is not None: + raise PeriodError(("dtend", index)) + else: + raise PeriodError("dtend") if dtstart > dtend: - raise PeriodError(*[ - index is not None and ("dtstart", index) or "dtstart", - index is not None and ("dtend", index) or "dtend" - ]) + if index is not None: + raise PeriodError(("dtstart", index), ("dtend", index)) + else: + raise PeriodError("dtstart", "dtend") return EventPeriod(dtstart, end_date_to_calendar(dtend), self.tzid, self.origin, dtstart_attr, dtend_attr,