Fixing some load/save issues with filebackend
[doneit] / src / toolbox.py
index 4601f3f..92cfeff 100644 (file)
@@ -1,10 +1,15 @@
 import sys
 import StringIO
 import urllib
+import urlparse
 from xml.dom import minidom
 import datetime
 
 
+class NonExistent(object):
+       pass
+
+
 class Optional(object):
        """
        Taglines:
@@ -40,9 +45,6 @@ class Optional(object):
        'Blacksheep'
        """
 
-       class NonExistent(object):
-               pass
-
        def __init__(self, value = NonExistent):
                self._value = value
 
@@ -50,10 +52,10 @@ class Optional(object):
                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
@@ -75,6 +77,27 @@ class Optional(object):
                        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
@@ -134,6 +157,36 @@ def load_xml(source, alternative=None):
        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