import sys
import StringIO
import urllib
+import urlparse
from xml.dom import minidom
import datetime
+class NonExistent(object):
+ pass
+
+
class Optional(object):
"""
Taglines:
'Blacksheep'
"""
- class NonExistent(object):
- pass
-
def __init__(self, value = NonExistent):
self._value = value
self._value = value
def clear(self):
- self._value = self.NonExistent
+ self._value = NonExistent
def is_good(self):
- return self._value is not self.NonExistent
+ return self._value is not NonExistent
def get_nothrow(self, default = None):
return self._value if self.is_good() else default
id(self), self.get_nothrow("Nothing")
)
+ def __not__(self):
+ return not self.is_good()
+
+ def __eq__(self, rhs):
+ return self._value == rhs._value
+
+ def __ne__(self, rhs):
+ return self._value != rhs._value
+
+ def __lt__(self, rhs):
+ return self._value < rhs._value
+
+ def __le__(self, rhs):
+ return self._value <= rhs._value
+
+ def __gt__(self, rhs):
+ return self._value > rhs._value
+
+ def __ge__(self, rhs):
+ return self._value >= rhs._value
+
def open_anything(source, alternative=None):
"""URI, filename, or string --> stream
return xmldoc
+def abbreviate(text, expectedLen):
+ singleLine = " ".join(text.split("\n"))
+ lineLen = len(singleLine)
+ if lineLen <= expectedLen:
+ return singleLine
+
+ abbrev = "..."
+
+ leftLen = expectedLen // 2 - 1
+ rightLen = max(expectedLen - leftLen - len(abbrev) + 1, 1)
+
+ abbrevText = singleLine[0:leftLen] + abbrev + singleLine[-rightLen:-1]
+ assert len(abbrevText) <= expectedLen, "Too long: '%s'" % abbrevText
+ return abbrevText
+
+
+def abbreviate_url(url, domainLength, pathLength):
+ urlParts = urlparse.urlparse(url)
+
+ netloc = urlParts.netloc
+ path = urlParts.path
+
+ pathLength += max(domainLength - len(netloc), 0)
+ domainLength += max(pathLength - len(path), 0)
+
+ netloc = abbreviate(netloc, domainLength)
+ path = abbreviate(path, pathLength)
+ return netloc + path
+
+
+def is_same_year(targetDate, todaysDate = datetime.datetime.today()):
+ return targetDate.year == todaysDate.year
+
+
+def is_same_month(targetDate, todaysDate = datetime.datetime.today()):
+ return targetDate.month == todaysDate.month
+
+
+def is_same_day(targetDate, todaysDate = datetime.datetime.today()):
+ return targetDate.day == todaysDate.day
+
+
def to_fuzzy_date(targetDate, todaysDate = datetime.datetime.today()):
"""
Conert a date/time/datetime object to a fuzzy date
+
+ >>> todaysDate = datetime.date(2009, 4, 16)
+ >>> to_fuzzy_date(datetime.date(1, 4, 6), todaysDate)
+ 'Forever ago'
+ >>> to_fuzzy_date(datetime.date(2008, 4, 13), todaysDate)
+ 'Last year'
+ >>> to_fuzzy_date(datetime.date(2009, 4, 13), todaysDate)
+ 'Last Monday'
+ >>> to_fuzzy_date(datetime.date(2009, 4, 20), todaysDate)
+ 'This Monday'
+ >>> to_fuzzy_date(datetime.date(2010, 4, 13), todaysDate)
+ 'Next year'
+ >>> to_fuzzy_date(datetime.date(2012, 12, 12), todaysDate)
+ 'Forever from now'
"""
delta = targetDate - todaysDate
days = abs(delta.days)
directionByN = "Later" if isFuture else "Earlier"
yearDelta = abs(targetDate.year - todaysDate.year)
- if 2 < yearDelta:
+ if 1 < yearDelta:
directionByInf = "from now" if isFuture else "ago"
return "Forever %s" % directionByInf
- elif 1 < yearDelta:
+ elif 1 == yearDelta:
return "%s year" % directionBy1
monthDelta = abs(targetDate.month - todaysDate.month)
- if 2 < monthDelta:
+ if 1 < monthDelta:
return "%s this year" % directionByN
- elif 1 < monthDelta:
+ elif 1 == monthDelta:
return "%s month" % directionBy1
dayDelta = abs(targetDate.day - todaysDate.day)