| Index: third_party/twisted_8_1/twisted/python/util.py
|
| diff --git a/third_party/twisted_8_1/twisted/python/util.py b/third_party/twisted_8_1/twisted/python/util.py
|
| deleted file mode 100644
|
| index 82180521b2389b98c9a98392c4b3aa127097c6cd..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/python/util.py
|
| +++ /dev/null
|
| @@ -1,915 +0,0 @@
|
| -# -*- test-case-name: twisted.python.test.test_util -*-
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -import os, sys, hmac, errno, new, inspect
|
| -try:
|
| - import pwd, grp
|
| -except ImportError:
|
| - pwd = grp = None
|
| -try:
|
| - from os import setgroups, getgroups
|
| -except ImportError:
|
| - setgroups = getgroups = None
|
| -from UserDict import UserDict
|
| -
|
| -
|
| -class InsensitiveDict:
|
| - """Dictionary, that has case-insensitive keys.
|
| -
|
| - Normally keys are retained in their original form when queried with
|
| - .keys() or .items(). If initialized with preserveCase=0, keys are both
|
| - looked up in lowercase and returned in lowercase by .keys() and .items().
|
| - """
|
| - """
|
| - Modified recipe at
|
| - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66315 originally
|
| - contributed by Sami Hangaslammi.
|
| - """
|
| -
|
| - def __init__(self, dict=None, preserve=1):
|
| - """Create an empty dictionary, or update from 'dict'."""
|
| - self.data = {}
|
| - self.preserve=preserve
|
| - if dict:
|
| - self.update(dict)
|
| -
|
| - def __delitem__(self, key):
|
| - k=self._lowerOrReturn(key)
|
| - del self.data[k]
|
| -
|
| - def _lowerOrReturn(self, key):
|
| - if isinstance(key, str) or isinstance(key, unicode):
|
| - return key.lower()
|
| - else:
|
| - return key
|
| -
|
| - def __getitem__(self, key):
|
| - """Retrieve the value associated with 'key' (in any case)."""
|
| - k = self._lowerOrReturn(key)
|
| - return self.data[k][1]
|
| -
|
| - def __setitem__(self, key, value):
|
| - """Associate 'value' with 'key'. If 'key' already exists, but
|
| - in different case, it will be replaced."""
|
| - k = self._lowerOrReturn(key)
|
| - self.data[k] = (key, value)
|
| -
|
| - def has_key(self, key):
|
| - """Case insensitive test whether 'key' exists."""
|
| - k = self._lowerOrReturn(key)
|
| - return self.data.has_key(k)
|
| - __contains__=has_key
|
| -
|
| - def _doPreserve(self, key):
|
| - if not self.preserve and (isinstance(key, str)
|
| - or isinstance(key, unicode)):
|
| - return key.lower()
|
| - else:
|
| - return key
|
| -
|
| - def keys(self):
|
| - """List of keys in their original case."""
|
| - return list(self.iterkeys())
|
| -
|
| - def values(self):
|
| - """List of values."""
|
| - return list(self.itervalues())
|
| -
|
| - def items(self):
|
| - """List of (key,value) pairs."""
|
| - return list(self.iteritems())
|
| -
|
| - def get(self, key, default=None):
|
| - """Retrieve value associated with 'key' or return default value
|
| - if 'key' doesn't exist."""
|
| - try:
|
| - return self[key]
|
| - except KeyError:
|
| - return default
|
| -
|
| - def setdefault(self, key, default):
|
| - """If 'key' doesn't exists, associate it with the 'default' value.
|
| - Return value associated with 'key'."""
|
| - if not self.has_key(key):
|
| - self[key] = default
|
| - return self[key]
|
| -
|
| - def update(self, dict):
|
| - """Copy (key,value) pairs from 'dict'."""
|
| - for k,v in dict.items():
|
| - self[k] = v
|
| -
|
| - def __repr__(self):
|
| - """String representation of the dictionary."""
|
| - items = ", ".join([("%r: %r" % (k,v)) for k,v in self.items()])
|
| - return "InsensitiveDict({%s})" % items
|
| -
|
| - def iterkeys(self):
|
| - for v in self.data.itervalues():
|
| - yield self._doPreserve(v[0])
|
| -
|
| - def itervalues(self):
|
| - for v in self.data.itervalues():
|
| - yield v[1]
|
| -
|
| - def iteritems(self):
|
| - for (k, v) in self.data.itervalues():
|
| - yield self._doPreserve(k), v
|
| -
|
| - def popitem(self):
|
| - i=self.items()[0]
|
| - del self[i[0]]
|
| - return i
|
| -
|
| - def clear(self):
|
| - for k in self.keys():
|
| - del self[k]
|
| -
|
| - def copy(self):
|
| - return InsensitiveDict(self, self.preserve)
|
| -
|
| - def __len__(self):
|
| - return len(self.data)
|
| -
|
| - def __eq__(self, other):
|
| - for k,v in self.items():
|
| - if not (k in other) or not (other[k]==v):
|
| - return 0
|
| - return len(self)==len(other)
|
| -
|
| -class OrderedDict(UserDict):
|
| - """A UserDict that preserves insert order whenever possible."""
|
| - def __init__(self, dict=None, **kwargs):
|
| - self._order = []
|
| - self.data = {}
|
| - if dict is not None:
|
| - if hasattr(dict,'keys'):
|
| - self.update(dict)
|
| - else:
|
| - for k,v in dict: # sequence
|
| - self[k] = v
|
| - if len(kwargs):
|
| - self.update(kwargs)
|
| - def __repr__(self):
|
| - return '{'+', '.join([('%r: %r' % item) for item in self.items()])+'}'
|
| -
|
| - def __setitem__(self, key, value):
|
| - if not self.has_key(key):
|
| - self._order.append(key)
|
| - UserDict.__setitem__(self, key, value)
|
| -
|
| - def copy(self):
|
| - return self.__class__(self)
|
| -
|
| - def __delitem__(self, key):
|
| - UserDict.__delitem__(self, key)
|
| - self._order.remove(key)
|
| -
|
| - def iteritems(self):
|
| - for item in self._order:
|
| - yield (item, self[item])
|
| -
|
| - def items(self):
|
| - return list(self.iteritems())
|
| -
|
| - def itervalues(self):
|
| - for item in self._order:
|
| - yield self[item]
|
| -
|
| - def values(self):
|
| - return list(self.itervalues())
|
| -
|
| - def iterkeys(self):
|
| - return iter(self._order)
|
| -
|
| - def keys(self):
|
| - return list(self._order)
|
| -
|
| - def popitem(self):
|
| - key = self._order[-1]
|
| - value = self[key]
|
| - del self[key]
|
| - return (key, value)
|
| -
|
| - def setdefault(self, item, default):
|
| - if self.has_key(item):
|
| - return self[item]
|
| - self[item] = default
|
| - return default
|
| -
|
| - def update(self, d):
|
| - for k, v in d.items():
|
| - self[k] = v
|
| -
|
| -def uniquify(lst):
|
| - """Make the elements of a list unique by inserting them into a dictionary.
|
| - This must not change the order of the input lst.
|
| - """
|
| - dct = {}
|
| - result = []
|
| - for k in lst:
|
| - if not dct.has_key(k): result.append(k)
|
| - dct[k] = 1
|
| - return result
|
| -
|
| -def padTo(n, seq, default=None):
|
| - """Pads a sequence out to n elements,
|
| -
|
| - filling in with a default value if it is not long enough.
|
| -
|
| - If the input sequence is longer than n, raises ValueError.
|
| -
|
| - Details, details:
|
| - This returns a new list; it does not extend the original sequence.
|
| - The new list contains the values of the original sequence, not copies.
|
| - """
|
| -
|
| - if len(seq) > n:
|
| - raise ValueError, "%d elements is more than %d." % (len(seq), n)
|
| -
|
| - blank = [default] * n
|
| -
|
| - blank[:len(seq)] = list(seq)
|
| -
|
| - return blank
|
| -
|
| -def getPluginDirs():
|
| - import twisted
|
| - systemPlugins = os.path.join(os.path.dirname(os.path.dirname(
|
| - os.path.abspath(twisted.__file__))), 'plugins')
|
| - userPlugins = os.path.expanduser("~/TwistedPlugins")
|
| - confPlugins = os.path.expanduser("~/.twisted")
|
| - allPlugins = filter(os.path.isdir, [systemPlugins, userPlugins, confPlugins])
|
| - return allPlugins
|
| -
|
| -def addPluginDir():
|
| - sys.path.extend(getPluginDirs())
|
| -
|
| -def sibpath(path, sibling):
|
| - """Return the path to a sibling of a file in the filesystem.
|
| -
|
| - This is useful in conjunction with the special __file__ attribute
|
| - that Python provides for modules, so modules can load associated
|
| - resource files.
|
| - """
|
| - return os.path.join(os.path.dirname(os.path.abspath(path)), sibling)
|
| -
|
| -
|
| -def _getpass(prompt):
|
| - """Helper to turn IOErrors into KeyboardInterrupts"""
|
| - import getpass
|
| - try:
|
| - return getpass.getpass(prompt)
|
| - except IOError, e:
|
| - if e.errno == errno.EINTR:
|
| - raise KeyboardInterrupt
|
| - raise
|
| - except EOFError:
|
| - raise KeyboardInterrupt
|
| -
|
| -def getPassword(prompt = 'Password: ', confirm = 0, forceTTY = 0,
|
| - confirmPrompt = 'Confirm password: ',
|
| - mismatchMessage = "Passwords don't match."):
|
| - """Obtain a password by prompting or from stdin.
|
| -
|
| - If stdin is a terminal, prompt for a new password, and confirm (if
|
| - C{confirm} is true) by asking again to make sure the user typed the same
|
| - thing, as keystrokes will not be echoed.
|
| -
|
| - If stdin is not a terminal, and C{forceTTY} is not true, read in a line
|
| - and use it as the password, less the trailing newline, if any. If
|
| - C{forceTTY} is true, attempt to open a tty and prompt for the password
|
| - using it. Raise a RuntimeError if this is not possible.
|
| -
|
| - @returns: C{str}
|
| - """
|
| - isaTTY = hasattr(sys.stdin, 'isatty') and sys.stdin.isatty()
|
| -
|
| - old = None
|
| - try:
|
| - if not isaTTY:
|
| - if forceTTY:
|
| - try:
|
| - old = sys.stdin, sys.stdout
|
| - sys.stdin = sys.stdout = open('/dev/tty', 'r+')
|
| - except:
|
| - raise RuntimeError("Cannot obtain a TTY")
|
| - else:
|
| - password = sys.stdin.readline()
|
| - if password[-1] == '\n':
|
| - password = password[:-1]
|
| - return password
|
| -
|
| - while 1:
|
| - try1 = _getpass(prompt)
|
| - if not confirm:
|
| - return try1
|
| - try2 = _getpass(confirmPrompt)
|
| - if try1 == try2:
|
| - return try1
|
| - else:
|
| - sys.stderr.write(mismatchMessage + "\n")
|
| - finally:
|
| - if old:
|
| - sys.stdin.close()
|
| - sys.stdin, sys.stdout = old
|
| -
|
| -
|
| -def dict(*a, **k):
|
| - import warnings
|
| - import __builtin__
|
| - warnings.warn('twisted.python.util.dict is deprecated. Use __builtin__.dict instead')
|
| - return __builtin__.dict(*a, **k)
|
| -
|
| -def println(*a):
|
| - sys.stdout.write(' '.join(map(str, a))+'\n')
|
| -
|
| -# XXX
|
| -# This does not belong here
|
| -# But where does it belong?
|
| -
|
| -def str_xor(s, b):
|
| - return ''.join([chr(ord(c) ^ b) for c in s])
|
| -
|
| -def keyed_md5(secret, challenge):
|
| - """Create the keyed MD5 string for the given secret and challenge."""
|
| - import warnings
|
| - warnings.warn(
|
| - "keyed_md5() is deprecated. Use the stdlib module hmac instead.",
|
| - DeprecationWarning, stacklevel=2
|
| - )
|
| - return hmac.HMAC(secret, challenge).hexdigest()
|
| -
|
| -def makeStatBar(width, maxPosition, doneChar = '=', undoneChar = '-', currentChar = '>'):
|
| - """Creates a function that will return a string representing a progress bar.
|
| - """
|
| - aValue = width / float(maxPosition)
|
| - def statBar(position, force = 0, last = ['']):
|
| - assert len(last) == 1, "Don't mess with the last parameter."
|
| - done = int(aValue * position)
|
| - toDo = width - done - 2
|
| - result = "[%s%s%s]" % (doneChar * done, currentChar, undoneChar * toDo)
|
| - if force:
|
| - last[0] = result
|
| - return result
|
| - if result == last[0]:
|
| - return ''
|
| - last[0] = result
|
| - return result
|
| -
|
| - statBar.__doc__ = """statBar(position, force = 0) -> '[%s%s%s]'-style progress bar
|
| -
|
| - returned string is %d characters long, and the range goes from 0..%d.
|
| - The 'position' argument is where the '%s' will be drawn. If force is false,
|
| - '' will be returned instead if the resulting progress bar is identical to the
|
| - previously returned progress bar.
|
| -""" % (doneChar * 3, currentChar, undoneChar * 3, width, maxPosition, currentChar)
|
| - return statBar
|
| -
|
| -def spewer(frame, s, ignored):
|
| - """A trace function for sys.settrace that prints every function or method call."""
|
| - from twisted.python import reflect
|
| - if frame.f_locals.has_key('self'):
|
| - se = frame.f_locals['self']
|
| - if hasattr(se, '__class__'):
|
| - k = reflect.qual(se.__class__)
|
| - else:
|
| - k = reflect.qual(type(se))
|
| - print 'method %s of %s at %s' % (
|
| - frame.f_code.co_name, k, id(se)
|
| - )
|
| - else:
|
| - print 'function %s in %s, line %s' % (
|
| - frame.f_code.co_name,
|
| - frame.f_code.co_filename,
|
| - frame.f_lineno)
|
| -
|
| -def searchupwards(start, files=[], dirs=[]):
|
| - """Walk upwards from start, looking for a directory containing
|
| - all files and directories given as arguments::
|
| - >>> searchupwards('.', ['foo.txt'], ['bar', 'bam'])
|
| -
|
| - If not found, return None
|
| - """
|
| - start=os.path.abspath(start)
|
| - parents=start.split(os.sep)
|
| - exists=os.path.exists; join=os.sep.join; isdir=os.path.isdir
|
| - while len(parents):
|
| - candidate=join(parents)+os.sep
|
| - allpresent=1
|
| - for f in files:
|
| - if not exists("%s%s" % (candidate, f)):
|
| - allpresent=0
|
| - break
|
| - if allpresent:
|
| - for d in dirs:
|
| - if not isdir("%s%s" % (candidate, d)):
|
| - allpresent=0
|
| - break
|
| - if allpresent: return candidate
|
| - parents.pop(-1)
|
| - return None
|
| -
|
| -
|
| -class LineLog:
|
| - """
|
| - A limited-size line-based log, useful for logging line-based
|
| - protocols such as SMTP.
|
| -
|
| - When the log fills up, old entries drop off the end.
|
| - """
|
| - def __init__(self, size=10):
|
| - """
|
| - Create a new log, with size lines of storage (default 10).
|
| - A log size of 0 (or less) means an infinite log.
|
| - """
|
| - if size < 0:
|
| - size = 0
|
| - self.log = [None]*size
|
| - self.size = size
|
| -
|
| - def append(self,line):
|
| - if self.size:
|
| - self.log[:-1] = self.log[1:]
|
| - self.log[-1] = line
|
| - else:
|
| - self.log.append(line)
|
| -
|
| - def str(self):
|
| - return '\n'.join(filter(None,self.log))
|
| -
|
| - def __getitem__(self, item):
|
| - return filter(None,self.log)[item]
|
| -
|
| - def clear(self):
|
| - """Empty the log"""
|
| - self.log = [None]*self.size
|
| -
|
| -def raises(exception, f, *args, **kwargs):
|
| - """Determine whether the given call raises the given exception"""
|
| - try:
|
| - f(*args, **kwargs)
|
| - except exception:
|
| - return 1
|
| - return 0
|
| -
|
| -class IntervalDifferential:
|
| - """
|
| - Given a list of intervals, generate the amount of time to sleep between
|
| - \"instants\".
|
| -
|
| - For example, given 7, 11 and 13, the three (infinite) sequences::
|
| -
|
| - 7 14 21 28 35 ...
|
| - 11 22 33 44 ...
|
| - 13 26 39 52 ...
|
| -
|
| - will be generated, merged, and used to produce::
|
| -
|
| - (7, 0) (4, 1) (2, 2) (1, 0) (7, 0) (1, 1) (4, 2) (2, 0) (5, 1) (2, 0)
|
| -
|
| - New intervals may be added or removed as iteration proceeds using the
|
| - proper methods.
|
| - """
|
| -
|
| - def __init__(self, intervals, default=60):
|
| - """
|
| - @type intervals: C{list} of C{int}, C{long}, or C{float} param
|
| - @param intervals: The intervals between instants.
|
| -
|
| - @type default: C{int}, C{long}, or C{float}
|
| - @param default: The duration to generate if the intervals list
|
| - becomes empty.
|
| - """
|
| - self.intervals = intervals[:]
|
| - self.default = default
|
| -
|
| - def __iter__(self):
|
| - return _IntervalDifferentialIterator(self.intervals, self.default)
|
| -
|
| -class _IntervalDifferentialIterator:
|
| - def __init__(self, i, d):
|
| -
|
| - self.intervals = [[e, e, n] for (e, n) in zip(i, range(len(i)))]
|
| - self.default = d
|
| - self.last = 0
|
| -
|
| - def next(self):
|
| - if not self.intervals:
|
| - return (self.default, None)
|
| - last, index = self.intervals[0][0], self.intervals[0][2]
|
| - self.intervals[0][0] += self.intervals[0][1]
|
| - self.intervals.sort()
|
| - result = last - self.last
|
| - self.last = last
|
| - return result, index
|
| -
|
| - def addInterval(self, i):
|
| - if self.intervals:
|
| - delay = self.intervals[0][0] - self.intervals[0][1]
|
| - self.intervals.append([delay + i, i, len(self.intervals)])
|
| - self.intervals.sort()
|
| - else:
|
| - self.intervals.append([i, i, 0])
|
| -
|
| - def removeInterval(self, interval):
|
| - for i in range(len(self.intervals)):
|
| - if self.intervals[i][1] == interval:
|
| - index = self.intervals[i][2]
|
| - del self.intervals[i]
|
| - for i in self.intervals:
|
| - if i[2] > index:
|
| - i[2] -= 1
|
| - return
|
| - raise ValueError, "Specified interval not in IntervalDifferential"
|
| -
|
| -
|
| -class FancyStrMixin:
|
| - """
|
| - Set showAttributes to a sequence of strings naming attributes, OR
|
| - sequences of (attributeName, displayName, formatCharacter)
|
| - """
|
| - showAttributes = ()
|
| - def __str__(self):
|
| - r = ['<', hasattr(self, 'fancybasename') and self.fancybasename or self.__class__.__name__]
|
| - for attr in self.showAttributes:
|
| - if isinstance(attr, str):
|
| - r.append(' %s=%r' % (attr, getattr(self, attr)))
|
| - else:
|
| - r.append((' %s=' + attr[2]) % (attr[1], getattr(self, attr[0])))
|
| - r.append('>')
|
| - return ''.join(r)
|
| - __repr__ = __str__
|
| -
|
| -
|
| -
|
| -class FancyEqMixin:
|
| - compareAttributes = ()
|
| - def __eq__(self, other):
|
| - if not self.compareAttributes:
|
| - return self is other
|
| - if isinstance(self, other.__class__):
|
| - return (
|
| - [getattr(self, name) for name in self.compareAttributes] ==
|
| - [getattr(other, name) for name in self.compareAttributes])
|
| - return NotImplemented
|
| -
|
| -
|
| - def __ne__(self, other):
|
| - result = self.__eq__(other)
|
| - if result is NotImplemented:
|
| - return result
|
| - return not result
|
| -
|
| -
|
| -
|
| -def dsu(list, key):
|
| - L2 = [(key(e), i, e) for (i, e) in zip(range(len(list)), list)]
|
| - L2.sort()
|
| - return [e[2] for e in L2]
|
| -
|
| -if pwd is None or grp is None or setgroups is None or getgroups is None:
|
| - def initgroups(uid, primaryGid):
|
| - """
|
| - Do nothing.
|
| -
|
| - Underlying platform support require to manipulate groups is missing.
|
| - """
|
| -else:
|
| - def _setgroups_until_success(l):
|
| - while(1):
|
| - # NASTY NASTY HACK (but glibc does it so it must be okay):
|
| - # In case sysconfig didn't give the right answer, find the limit
|
| - # on max groups by just looping, trying to set fewer and fewer
|
| - # groups each time until it succeeds.
|
| - try:
|
| - setgroups(l)
|
| - except ValueError:
|
| - # This exception comes from python itself restricting
|
| - # number of groups allowed.
|
| - if len(l) > 1:
|
| - del l[-1]
|
| - else:
|
| - raise
|
| - except OSError, e:
|
| - if e.errno == errno.EINVAL and len(l) > 1:
|
| - # This comes from the OS saying too many groups
|
| - del l[-1]
|
| - else:
|
| - raise
|
| - else:
|
| - # Success, yay!
|
| - return
|
| -
|
| - def initgroups(uid, primaryGid):
|
| - """
|
| - Initializes the group access list.
|
| -
|
| - This is done by reading the group database /etc/group and using all
|
| - groups of which C{uid} is a member. The additional group
|
| - C{primaryGid} is also added to the list.
|
| -
|
| - If the given user is a member of more than C{NGROUPS}, arbitrary
|
| - groups will be silently discarded to bring the number below that
|
| - limit.
|
| -
|
| - @type uid: C{int}
|
| - @param uid: The UID for which to look up group information.
|
| -
|
| - @type primaryGid: C{int} or C{NoneType}
|
| - @param primaryGid: If provided, an additional GID to include when
|
| - setting the groups.
|
| - """
|
| - try:
|
| - # Try to get the maximum number of groups
|
| - max_groups = os.sysconf("SC_NGROUPS_MAX")
|
| - except:
|
| - # No predefined limit
|
| - max_groups = 0
|
| -
|
| - username = pwd.getpwuid(uid)[0]
|
| - l = []
|
| - if primaryGid is not None:
|
| - l.append(primaryGid)
|
| - for groupname, password, gid, userlist in grp.getgrall():
|
| - if username in userlist:
|
| - l.append(gid)
|
| - if len(l) == max_groups:
|
| - break # No more groups, ignore any more
|
| - try:
|
| - _setgroups_until_success(l)
|
| - except OSError, e:
|
| - # We might be able to remove this code now that we
|
| - # don't try to setgid/setuid even when not asked to.
|
| - if e.errno == errno.EPERM:
|
| - for g in getgroups():
|
| - if g not in l:
|
| - raise
|
| - else:
|
| - raise
|
| -
|
| -
|
| -
|
| -def switchUID(uid, gid, euid=False):
|
| - if euid:
|
| - setuid = os.seteuid
|
| - setgid = os.setegid
|
| - else:
|
| - setuid = os.setuid
|
| - setgid = os.setgid
|
| - if gid is not None:
|
| - setgid(gid)
|
| - if uid is not None:
|
| - initgroups(uid, gid)
|
| - setuid(uid)
|
| -
|
| -
|
| -class SubclassableCStringIO(object):
|
| - """A wrapper around cStringIO to allow for subclassing"""
|
| - __csio = None
|
| -
|
| - def __init__(self, *a, **kw):
|
| - from cStringIO import StringIO
|
| - self.__csio = StringIO(*a, **kw)
|
| -
|
| - def __iter__(self):
|
| - return self.__csio.__iter__()
|
| -
|
| - def next(self):
|
| - return self.__csio.next()
|
| -
|
| - def close(self):
|
| - return self.__csio.close()
|
| -
|
| - def isatty(self):
|
| - return self.__csio.isatty()
|
| -
|
| - def seek(self, pos, mode=0):
|
| - return self.__csio.seek(pos, mode)
|
| -
|
| - def tell(self):
|
| - return self.__csio.tell()
|
| -
|
| - def read(self, n=-1):
|
| - return self.__csio.read(n)
|
| -
|
| - def readline(self, length=None):
|
| - return self.__csio.readline(length)
|
| -
|
| - def readlines(self, sizehint=0):
|
| - return self.__csio.readlines(sizehint)
|
| -
|
| - def truncate(self, size=None):
|
| - return self.__csio.truncate(size)
|
| -
|
| - def write(self, s):
|
| - return self.__csio.write(s)
|
| -
|
| - def writelines(self, list):
|
| - return self.__csio.writelines(list)
|
| -
|
| - def flush(self):
|
| - return self.__csio.flush()
|
| -
|
| - def getvalue(self):
|
| - return self.__csio.getvalue()
|
| -
|
| -def moduleMovedForSplit(origModuleName, newModuleName, moduleDesc,
|
| - projectName, projectURL, globDict):
|
| - from twisted.python import reflect
|
| - modoc = """
|
| -%(moduleDesc)s
|
| -
|
| -This module is DEPRECATED. It has been split off into a third party
|
| -package, Twisted %(projectName)s. Please see %(projectURL)s.
|
| -
|
| -This is just a place-holder that imports from the third-party %(projectName)s
|
| -package for backwards compatibility. To use it, you need to install
|
| -that package.
|
| -""" % {'moduleDesc': moduleDesc,
|
| - 'projectName': projectName,
|
| - 'projectURL': projectURL}
|
| -
|
| - #origModule = reflect.namedModule(origModuleName)
|
| - try:
|
| - newModule = reflect.namedModule(newModuleName)
|
| - except ImportError:
|
| - raise ImportError("You need to have the Twisted %s "
|
| - "package installed to use %s. "
|
| - "See %s."
|
| - % (projectName, origModuleName, projectURL))
|
| -
|
| - # Populate the old module with the new module's contents
|
| - for k,v in vars(newModule).items():
|
| - globDict[k] = v
|
| - globDict['__doc__'] = modoc
|
| - import warnings
|
| - warnings.warn("%s has moved to %s. See %s." % (origModuleName, newModuleName,
|
| - projectURL),
|
| - DeprecationWarning, stacklevel=3)
|
| - return
|
| -
|
| -
|
| -def untilConcludes(f, *a, **kw):
|
| - while True:
|
| - try:
|
| - return f(*a, **kw)
|
| - except (IOError, OSError), e:
|
| - if e.args[0] == errno.EINTR:
|
| - continue
|
| - raise
|
| -
|
| -# A value about twice as large as any Python int, to which negative values
|
| -# from id() will be added, moving them into a range which should begin just
|
| -# above where positive values from id() leave off.
|
| -_HUGEINT = (sys.maxint + 1L) * 2L
|
| -def unsignedID(obj):
|
| - """
|
| - Return the id of an object as an unsigned number so that its hex
|
| - representation makes sense
|
| - """
|
| - rval = id(obj)
|
| - if rval < 0:
|
| - rval += _HUGEINT
|
| - return rval
|
| -
|
| -def mergeFunctionMetadata(f, g):
|
| - """
|
| - Overwrite C{g}'s name and docstring with values from C{f}. Update
|
| - C{g}'s instance dictionary with C{f}'s.
|
| -
|
| - To use this function safely you must use the return value. In Python 2.3,
|
| - L{mergeFunctionMetadata} will create a new function. In later versions of
|
| - Python, C{g} will be mutated and returned.
|
| -
|
| - @return: A function that has C{g}'s behavior and metadata merged from
|
| - C{f}.
|
| - """
|
| - try:
|
| - g.__name__ = f.__name__
|
| - except TypeError:
|
| - try:
|
| - merged = new.function(
|
| - g.func_code, g.func_globals,
|
| - f.__name__, inspect.getargspec(g)[-1],
|
| - g.func_closure)
|
| - except TypeError:
|
| - pass
|
| - else:
|
| - merged = g
|
| - try:
|
| - merged.__doc__ = f.__doc__
|
| - except (TypeError, AttributeError):
|
| - pass
|
| - try:
|
| - merged.__dict__.update(g.__dict__)
|
| - merged.__dict__.update(f.__dict__)
|
| - except (TypeError, AttributeError):
|
| - pass
|
| - merged.__module__ = f.__module__
|
| - return merged
|
| -
|
| -
|
| -def nameToLabel(mname):
|
| - """
|
| - Convert a string like a variable name into a slightly more human-friendly
|
| - string with spaces and capitalized letters.
|
| -
|
| - @type mname: C{str}
|
| - @param mname: The name to convert to a label. This must be a string
|
| - which could be used as a Python identifier. Strings which do not take
|
| - this form will result in unpredictable behavior.
|
| -
|
| - @rtype: C{str}
|
| - """
|
| - labelList = []
|
| - word = ''
|
| - lastWasUpper = False
|
| - for letter in mname:
|
| - if letter.isupper() == lastWasUpper:
|
| - # Continuing a word.
|
| - word += letter
|
| - else:
|
| - # breaking a word OR beginning a word
|
| - if lastWasUpper:
|
| - # could be either
|
| - if len(word) == 1:
|
| - # keep going
|
| - word += letter
|
| - else:
|
| - # acronym
|
| - # we're processing the lowercase letter after the acronym-then-capital
|
| - lastWord = word[:-1]
|
| - firstLetter = word[-1]
|
| - labelList.append(lastWord)
|
| - word = firstLetter + letter
|
| - else:
|
| - # definitely breaking: lower to upper
|
| - labelList.append(word)
|
| - word = letter
|
| - lastWasUpper = letter.isupper()
|
| - if labelList:
|
| - labelList[0] = labelList[0].capitalize()
|
| - else:
|
| - return mname.capitalize()
|
| - labelList.append(word)
|
| - return ' '.join(labelList)
|
| -
|
| -
|
| -
|
| -def uidFromString(uidString):
|
| - """
|
| - Convert a user identifier, as a string, into an integer UID.
|
| -
|
| - @type uid: C{str}
|
| - @param uid: A string giving the base-ten representation of a UID or the
|
| - name of a user which can be converted to a UID via L{pwd.getpwnam}.
|
| -
|
| - @rtype: C{int}
|
| - @return: The integer UID corresponding to the given string.
|
| -
|
| - @raise ValueError: If the user name is supplied and L{pwd} is not
|
| - available.
|
| - """
|
| - try:
|
| - return int(uidString)
|
| - except ValueError:
|
| - if pwd is None:
|
| - raise
|
| - return pwd.getpwnam(uidString)[2]
|
| -
|
| -
|
| -
|
| -def gidFromString(gidString):
|
| - """
|
| - Convert a group identifier, as a string, into an integer GID.
|
| -
|
| - @type uid: C{str}
|
| - @param uid: A string giving the base-ten representation of a GID or the
|
| - name of a group which can be converted to a GID via L{grp.getgrnam}.
|
| -
|
| - @rtype: C{int}
|
| - @return: The integer GID corresponding to the given string.
|
| -
|
| - @raise ValueError: If the group name is supplied and L{grp} is not
|
| - available.
|
| - """
|
| - try:
|
| - return int(gidString)
|
| - except ValueError:
|
| - if grp is None:
|
| - raise
|
| - return grp.getgrnam(gidString)[2]
|
| -
|
| -
|
| -
|
| -__all__ = [
|
| - "uniquify", "padTo", "getPluginDirs", "addPluginDir", "sibpath",
|
| - "getPassword", "dict", "println", "keyed_md5", "makeStatBar",
|
| - "OrderedDict", "InsensitiveDict", "spewer", "searchupwards", "LineLog",
|
| - "raises", "IntervalDifferential", "FancyStrMixin", "FancyEqMixin",
|
| - "dsu", "switchUID", "SubclassableCStringIO", "moduleMovedForSplit",
|
| - "unsignedID", "mergeFunctionMetadata", "nameToLabel", "uidFromString",
|
| - "gidFromString",
|
| -]
|
|
|