| Index: third_party/psutil/psutil/_compat.py
|
| diff --git a/third_party/psutil/psutil/_compat.py b/third_party/psutil/psutil/_compat.py
|
| deleted file mode 100644
|
| index 1cac8b7b6721ba99366945ac441761325e25f38f..0000000000000000000000000000000000000000
|
| --- a/third_party/psutil/psutil/_compat.py
|
| +++ /dev/null
|
| @@ -1,154 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# $Id: _compat.py 1142 2011-10-05 18:45:49Z g.rodola $
|
| -#
|
| -# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Module which provides compatibility with older Python versions."""
|
| -
|
| -__all__ = ["namedtuple", "property"]
|
| -
|
| -from operator import itemgetter as _itemgetter
|
| -from keyword import iskeyword as _iskeyword
|
| -import sys as _sys
|
| -import __builtin__
|
| -
|
| -try:
|
| - from collections import namedtuple
|
| -except ImportError:
|
| - def namedtuple(typename, field_names, verbose=False, rename=False):
|
| - """A collections.namedtuple implementation written in Python
|
| - to support Python versions < 2.6.
|
| -
|
| - Taken from: http://code.activestate.com/recipes/500261/
|
| - """
|
| - # Parse and validate the field names. Validation serves two
|
| - # purposes, generating informative error messages and preventing
|
| - # template injection attacks.
|
| - if isinstance(field_names, basestring):
|
| - # names separated by whitespace and/or commas
|
| - field_names = field_names.replace(',', ' ').split()
|
| - field_names = tuple(map(str, field_names))
|
| - if rename:
|
| - names = list(field_names)
|
| - seen = set()
|
| - for i, name in enumerate(names):
|
| - if (not min(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
|
| - or not name or name[0].isdigit() or name.startswith('_')
|
| - or name in seen):
|
| - names[i] = '_%d' % i
|
| - seen.add(name)
|
| - field_names = tuple(names)
|
| - for name in (typename,) + field_names:
|
| - if not min(c.isalnum() or c=='_' for c in name):
|
| - raise ValueError('Type names and field names can only contain ' \
|
| - 'alphanumeric characters and underscores: %r'
|
| - % name)
|
| - if _iskeyword(name):
|
| - raise ValueError('Type names and field names cannot be a keyword: %r' \
|
| - % name)
|
| - if name[0].isdigit():
|
| - raise ValueError('Type names and field names cannot start with a ' \
|
| - 'number: %r' % name)
|
| - seen_names = set()
|
| - for name in field_names:
|
| - if name.startswith('_') and not rename:
|
| - raise ValueError('Field names cannot start with an underscore: %r'
|
| - % name)
|
| - if name in seen_names:
|
| - raise ValueError('Encountered duplicate field name: %r' % name)
|
| - seen_names.add(name)
|
| -
|
| - # Create and fill-in the class template
|
| - numfields = len(field_names)
|
| - # tuple repr without parens or quotes
|
| - argtxt = repr(field_names).replace("'", "")[1:-1]
|
| - reprtxt = ', '.join('%s=%%r' % name for name in field_names)
|
| - template = '''class %(typename)s(tuple):
|
| - '%(typename)s(%(argtxt)s)' \n
|
| - __slots__ = () \n
|
| - _fields = %(field_names)r \n
|
| - def __new__(_cls, %(argtxt)s):
|
| - return _tuple.__new__(_cls, (%(argtxt)s)) \n
|
| - @classmethod
|
| - def _make(cls, iterable, new=tuple.__new__, len=len):
|
| - 'Make a new %(typename)s object from a sequence or iterable'
|
| - result = new(cls, iterable)
|
| - if len(result) != %(numfields)d:
|
| - raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result))
|
| - return result \n
|
| - def __repr__(self):
|
| - return '%(typename)s(%(reprtxt)s)' %% self \n
|
| - def _asdict(self):
|
| - 'Return a new dict which maps field names to their values'
|
| - return dict(zip(self._fields, self)) \n
|
| - def _replace(_self, **kwds):
|
| - 'Return a new %(typename)s object replacing specified fields with new values'
|
| - result = _self._make(map(kwds.pop, %(field_names)r, _self))
|
| - if kwds:
|
| - raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
|
| - return result \n
|
| - def __getnewargs__(self):
|
| - return tuple(self) \n\n''' % locals()
|
| - for i, name in enumerate(field_names):
|
| - template += ' %s = _property(_itemgetter(%d))\n' % (name, i)
|
| - if verbose:
|
| - print template
|
| -
|
| - # Execute the template string in a temporary namespace
|
| - namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename,
|
| - _property=property, _tuple=tuple)
|
| - try:
|
| - exec template in namespace
|
| - except SyntaxError, e:
|
| - raise SyntaxError(e.message + ':\n' + template)
|
| - result = namespace[typename]
|
| -
|
| - # For pickling to work, the __module__ variable needs to be set
|
| - # to the frame where the named tuple is created. Bypass this
|
| - # step in enviroments where sys._getframe is not defined (Jython
|
| - # for example) or sys._getframe is not defined for arguments
|
| - # greater than 0 (IronPython).
|
| - try:
|
| - result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
|
| - except (AttributeError, ValueError):
|
| - pass
|
| -
|
| - return result
|
| -
|
| -
|
| -# dirty hack to support property.setter on python < 2.6
|
| -property = property
|
| -
|
| -if not hasattr(property, "setter"):
|
| -
|
| - class property(property):
|
| -
|
| - def __init__(self, fget, *args, **kwargs):
|
| - self.__doc__ = fget.__doc__
|
| - super(property, self).__init__(fget, *args, **kwargs)
|
| -
|
| - def setter(self, fset):
|
| - cls_ns = _sys._getframe(1).f_locals
|
| - for k, v in cls_ns.iteritems():
|
| - if v == self:
|
| - propname = k
|
| - break
|
| - cls_ns[propname] = property(self.fget, fset,
|
| - self.fdel, self.__doc__)
|
| - return cls_ns[propname]
|
| -
|
| - def deleter(self, fdel):
|
| - cls_ns = _sys._getframe(1).f_locals
|
| - for k, v in cls_ns.iteritems():
|
| - if v == self:
|
| - propname = k
|
| - break
|
| - cls_ns[propname] = property(self.fget, self.fset,
|
| - fdel, self.__doc__)
|
| - return cls_ns[propname]
|
| -
|
| - __builtin__.property = property
|
| -
|
|
|