Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Unified Diff: third_party/twisted_8_1/twisted/python/reflect.py

Issue 12261012: Remove third_party/twisted_8_1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/twisted_8_1/twisted/python/reflect.py
diff --git a/third_party/twisted_8_1/twisted/python/reflect.py b/third_party/twisted_8_1/twisted/python/reflect.py
deleted file mode 100644
index 522ec9bfabe218a860111d99963d3be2efe2f0fa..0000000000000000000000000000000000000000
--- a/third_party/twisted_8_1/twisted/python/reflect.py
+++ /dev/null
@@ -1,745 +0,0 @@
-# -*- test-case-name: twisted.test.test_reflect -*-
-
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-
-"""
-Standardized versions of various cool and/or strange things that you can do
-with Python's reflection capabilities.
-"""
-
-from __future__ import nested_scopes
-
-
-# System Imports
-import sys
-import os
-import types
-import string
-import pickle
-import new
-import traceback
-import weakref
-import re
-import warnings
-try:
- from collections import deque
-except ImportError:
- deque = list
-
-RegexType = type(re.compile(""))
-
-
-try:
- import cStringIO as StringIO
-except ImportError:
- import StringIO
-
-class Settable:
- """
- A mixin class for syntactic sugar. Lets you assign attributes by
- calling with keyword arguments; for example, C{x(a=b,c=d,y=z)} is the
- same as C{x.a=b;x.c=d;x.y=z}. The most useful place for this is
- where you don't want to name a variable, but you do want to set
- some attributes; for example, C{X()(y=z,a=b)}.
- """
- def __init__(self, **kw):
- self(**kw)
-
- def __call__(self,**kw):
- for key,val in kw.items():
- setattr(self,key,val)
- return self
-
-
-class AccessorType(type):
- """Metaclass that generates properties automatically.
-
- This is for Python 2.2 and up.
-
- Using this metaclass for your class will give you explicit accessor
- methods; a method called set_foo, will automatically create a property
- 'foo' that uses set_foo as a setter method. Same for get_foo and del_foo.
-
- Note that this will only work on methods that are present on class
- creation. If you add methods after the class is defined they will not
- automatically become properties. Likewise, class attributes will only
- be used if they are present upon class creation, and no getter function
- was set - if a getter is present, the class attribute will be ignored.
-
- This is a 2.2-only alternative to the Accessor mixin - just set in your
- class definition::
-
- __metaclass__ = AccessorType
-
- """
-
- def __init__(self, name, bases, d):
- type.__init__(self, name, bases, d)
- accessors = {}
- prefixs = ["get_", "set_", "del_"]
- for k in d.keys():
- v = getattr(self, k)
- for i in range(3):
- if k.startswith(prefixs[i]):
- accessors.setdefault(k[4:], [None, None, None])[i] = v
- for name, (getter, setter, deler) in accessors.items():
- # create default behaviours for the property - if we leave
- # the getter as None we won't be able to getattr, etc..
- if getter is None:
- if hasattr(self, name):
- value = getattr(self, name)
- def getter(this, value=value, name=name):
- if this.__dict__.has_key(name):
- return this.__dict__[name]
- else:
- return value
- else:
- def getter(this, name=name):
- if this.__dict__.has_key(name):
- return this.__dict__[name]
- else:
- raise AttributeError, "no such attribute %r" % name
- if setter is None:
- def setter(this, value, name=name):
- this.__dict__[name] = value
- if deler is None:
- def deler(this, name=name):
- del this.__dict__[name]
- setattr(self, name, property(getter, setter, deler, ""))
-
-
-class PropertyAccessor(object):
- """A mixin class for Python 2.2 that uses AccessorType.
-
- This provides compatability with the pre-2.2 Accessor mixin, up
- to a point.
-
- Extending this class will give you explicit accessor methods; a
- method called set_foo, for example, is the same as an if statement
- in __setattr__ looking for 'foo'. Same for get_foo and del_foo.
-
- There are also reallyDel and reallySet methods, so you can
- override specifics in subclasses without clobbering __setattr__
- and __getattr__, or using non-2.1 compatible code.
-
- There is are incompatibilities with Accessor - accessor
- methods added after class creation will *not* be detected. OTOH,
- this method is probably way faster.
-
- In addition, class attributes will only be used if no getter
- was defined, and instance attributes will not override getter methods
- whereas in original Accessor the class attribute or instance attribute
- would override the getter method.
- """
- # addendum to above:
- # The behaviour of Accessor is wrong IMHO, and I've found bugs
- # caused by it.
- # -- itamar
-
- __metaclass__ = AccessorType
-
- def reallySet(self, k, v):
- self.__dict__[k] = v
-
- def reallyDel(self, k):
- del self.__dict__[k]
-
-
-class Accessor:
- """
- Extending this class will give you explicit accessor methods; a
- method called C{set_foo}, for example, is the same as an if statement
- in L{__setattr__} looking for C{'foo'}. Same for C{get_foo} and
- C{del_foo}. There are also L{reallyDel} and L{reallySet} methods,
- so you can override specifics in subclasses without clobbering
- L{__setattr__} and L{__getattr__}.
-
- This implementation is for Python 2.1.
- """
-
- def __setattr__(self, k,v):
- kstring='set_%s'%k
- if hasattr(self.__class__,kstring):
- return getattr(self,kstring)(v)
- else:
- self.reallySet(k,v)
-
- def __getattr__(self, k):
- kstring='get_%s'%k
- if hasattr(self.__class__,kstring):
- return getattr(self,kstring)()
- raise AttributeError("%s instance has no accessor for: %s" % (qual(self.__class__),k))
-
- def __delattr__(self, k):
- kstring='del_%s'%k
- if hasattr(self.__class__,kstring):
- getattr(self,kstring)()
- return
- self.reallyDel(k)
-
- def reallySet(self, k,v):
- """
- *actually* set self.k to v without incurring side-effects.
- This is a hook to be overridden by subclasses.
- """
- if k == "__dict__":
- self.__dict__.clear()
- self.__dict__.update(v)
- else:
- self.__dict__[k]=v
-
- def reallyDel(self, k):
- """
- *actually* del self.k without incurring side-effects. This is a
- hook to be overridden by subclasses.
- """
- del self.__dict__[k]
-
-# just in case
-OriginalAccessor = Accessor
-
-
-class Summer(Accessor):
- """
- Extend from this class to get the capability to maintain 'related
- sums'. Have a tuple in your class like the following::
-
- sums=(('amount','credit','credit_total'),
- ('amount','debit','debit_total'))
-
- and the 'credit_total' member of the 'credit' member of self will
- always be incremented when the 'amount' member of self is
- incremented, similiarly for the debit versions.
- """
-
- def reallySet(self, k,v):
- "This method does the work."
- for sum in self.sums:
- attr=sum[0]
- obj=sum[1]
- objattr=sum[2]
- if k == attr:
- try:
- oldval=getattr(self, attr)
- except:
- oldval=0
- diff=v-oldval
- if hasattr(self, obj):
- ob=getattr(self,obj)
- if ob is not None:
- try:oldobjval=getattr(ob, objattr)
- except:oldobjval=0.0
- setattr(ob,objattr,oldobjval+diff)
-
- elif k == obj:
- if hasattr(self, attr):
- x=getattr(self,attr)
- setattr(self,attr,0)
- y=getattr(self,k)
- Accessor.reallySet(self,k,v)
- setattr(self,attr,x)
- Accessor.reallySet(self,y,v)
- Accessor.reallySet(self,k,v)
-
-class QueueMethod:
- """ I represent a method that doesn't exist yet."""
- def __init__(self, name, calls):
- self.name = name
- self.calls = calls
- def __call__(self, *args):
- self.calls.append((self.name, args))
-
-
-def funcinfo(function):
- """
- this is more documentation for myself than useful code.
- """
- warnings.warn(
- "[v2.5] Use inspect.getargspec instead of twisted.python.reflect.funcinfo",
- DeprecationWarning,
- stacklevel=2)
- code=function.func_code
- name=function.func_name
- argc=code.co_argcount
- argv=code.co_varnames[:argc]
- defaults=function.func_defaults
-
- out = []
-
- out.append('The function %s accepts %s arguments' % (name ,argc))
- if defaults:
- required=argc-len(defaults)
- out.append('It requires %s arguments' % required)
- out.append('The arguments required are: %s' % argv[:required])
- out.append('additional arguments are:')
- for i in range(argc-required):
- j=i+required
- out.append('%s which has a default of' % (argv[j], defaults[i]))
- return out
-
-
-ISNT=0
-WAS=1
-IS=2
-
-
-def fullFuncName(func):
- qualName = (str(pickle.whichmodule(func, func.__name__)) + '.' + func.__name__)
- if namedObject(qualName) is not func:
- raise Exception("Couldn't find %s as %s." % (func, qualName))
- return qualName
-
-def qual(clazz):
- """Return full import path of a class."""
- return clazz.__module__ + '.' + clazz.__name__
-
-def getcurrent(clazz):
- assert type(clazz) == types.ClassType, 'must be a class...'
- module = namedModule(clazz.__module__)
- currclass = getattr(module, clazz.__name__, None)
- if currclass is None:
- return clazz
- return currclass
-
-def getClass(obj):
- """Return the class or type of object 'obj'.
- Returns sensible result for oldstyle and newstyle instances and types."""
- if hasattr(obj, '__class__'):
- return obj.__class__
- else:
- return type(obj)
-
-# class graph nonsense
-
-# I should really have a better name for this...
-def isinst(inst,clazz):
- if type(inst) != types.InstanceType or type(clazz)!= types.ClassType:
- return isinstance(inst,clazz)
- cl = inst.__class__
- cl2 = getcurrent(cl)
- clazz = getcurrent(clazz)
- if issubclass(cl2,clazz):
- if cl == cl2:
- return WAS
- else:
- inst.__class__ = cl2
- return IS
- else:
- return ISNT
-
-
-def namedModule(name):
- """Return a module given its name."""
- topLevel = __import__(name)
- packages = name.split(".")[1:]
- m = topLevel
- for p in packages:
- m = getattr(m, p)
- return m
-
-
-def namedObject(name):
- """Get a fully named module-global object.
- """
- classSplit = string.split(name, '.')
- module = namedModule(string.join(classSplit[:-1], '.'))
- return getattr(module, classSplit[-1])
-
-namedClass = namedObject # backwards compat
-
-
-
-class _NoModuleFound(Exception):
- """
- No module was found because none exists.
- """
-
-
-
-def _importAndCheckStack(importName):
- """
- Import the given name as a module, then walk the stack to determine whether
- the failure was the module not existing, or some code in the module (for
- example a dependent import) failing. This can be helpful to determine
- whether any actual application code was run. For example, to distiguish
- administrative error (entering the wrong module name), from programmer
- error (writing buggy code in a module that fails to import).
-
- @raise Exception: if something bad happens. This can be any type of
- exception, since nobody knows what loading some arbitrary code might do.
-
- @raise _NoModuleFound: if no module was found.
- """
- try:
- try:
- return __import__(importName)
- except ImportError:
- excType, excValue, excTraceback = sys.exc_info()
- while excTraceback:
- execName = excTraceback.tb_frame.f_globals["__name__"]
- if (execName is None or # python 2.4+, post-cleanup
- execName == importName): # python 2.3, no cleanup
- raise excType, excValue, excTraceback
- excTraceback = excTraceback.tb_next
- raise _NoModuleFound()
- except:
- # Necessary for cleaning up modules in 2.3.
- sys.modules.pop(importName, None)
- raise
-
-
-
-def namedAny(name):
- """
- Retrieve a Python object from the global Python module namespace, by its
- fully qualified name. The first part of the name, that describes a module,
- will be discovered and imported.
-
- @param name: the fully qualified name of a Python object, which is a
- dot-separated list of python objects accessible via a name. This includes
- packages, modules, and any Python object which has attributes. For
- example, a fully-qualified name of this object is
- 'twisted.python.reflect.namedAny'.
-
- @type name: L{str}
-
- @return: the Python object identified by 'name'.
-
- @raise ValueError: if the top level dotted name that is passed is not a
- valid Python identifier, or the top level dotted name that is passed is not
- a valid python module.
-
- @raise AttributeError: if an attribute of an object along the way cannot be
- accessed, or a module along the way is not found.
-
- @raise ImportError: if any module involved cannot be imported for some
- reason.
- """
- names = name.split('.')
- topLevelPackage = None
- moduleNames = names[:]
- while not topLevelPackage:
- trialname = '.'.join(moduleNames)
- try:
- topLevelPackage = _importAndCheckStack(trialname)
- except _NoModuleFound:
- moduleNames.pop()
-
- obj = topLevelPackage
- for n in names[1:]:
- obj = getattr(obj, n)
-
- return obj
-
-def _reclass(clazz):
- clazz = getattr(namedModule(clazz.__module__),clazz.__name__)
- clazz.__bases__ = tuple(map(_reclass, clazz.__bases__))
- return clazz
-
-
-
-
-def macro(name, filename, source, **identifiers):
- """macro(name, source, **identifiers)
-
- This allows you to create macro-like behaviors in python. See
- twisted.python.hook for an example of its usage.
- """
- if not identifiers.has_key('name'):
- identifiers['name'] = name
- source = source % identifiers
- codeplace = "<%s (macro)>" % filename
- code = compile(source, codeplace, 'exec')
-
- # shield your eyes!
- sm = sys.modules
- tprm = "twisted.python.reflect.macros"
- if not sm.has_key(tprm):
- macros = new.module(tprm)
- sm[tprm] = macros
- macros.count = 0
- macros = sm[tprm]
- macros.count += 1
- macroname = 'macro_' + str(macros.count)
- tprmm = tprm + '.' + macroname
- mymod = new.module(tprmm)
- sys.modules[tprmm] = mymod
- setattr(macros, macroname, mymod)
- dict = mymod.__dict__
-
- # Before we go on, I guess I should explain why I just did that. Basically
- # it's a gross hack to get epydoc to work right, but the general idea is
- # that it will be a useful aid in debugging in _any_ app which expects
- # sys.modules to have the same globals as some function. For example, it
- # would be useful if you were foolishly trying to pickle a wrapped function
- # directly from a class that had been hooked.
-
- exec code in dict, dict
- return dict[name]
-
-def _determineClass(x):
- try:
- return x.__class__
- except:
- return type(x)
-
-def _determineClassName(x):
- c = _determineClass(x)
- try:
- return c.__name__
- except:
- try:
- return str(c)
- except:
- return '<BROKEN CLASS AT %s>' % id(c)
-
-def safe_repr(o):
- """safe_repr(anything) -> string
-
- Returns a string representation of an object, or a string containing a
- traceback, if that object's __repr__ raised an exception.
- """
-
- try:
- return repr(o)
- except:
- io = StringIO.StringIO()
- traceback.print_stack(file=io)
- whati = _determineClassName(o)
- swron = io.getvalue()
- gwith = id(o)
- you ='<%s instance at %s with repr error %s>' % (
- whati,swron,gwith)
- return you
-
-def safe_str(o):
- """safe_str(anything) -> string
-
- Returns a string representation of an object, or a string containing a
- traceback, if that object's __str__ raised an exception.
- """
-
- try:
- return str(o)
- except:
- strExc = '\n'.join(traceback.format_exception(*sys.exc_info()))
- clsName = _determineClassName(o)
- obId = id(o)
- return '<%s instance at %s with str error %s>' % (
- clsName, obId, strExc)
-
-
-##the following were factored out of usage
-
-def allYourBase(classObj, baseClass=None):
- """allYourBase(classObj, baseClass=None) -> list of all base
- classes that are subclasses of baseClass, unless it is None,
- in which case all bases will be added.
- """
- l = []
- accumulateBases(classObj, l, baseClass)
- return l
-
-
-def accumulateBases(classObj, l, baseClass=None):
- for base in classObj.__bases__:
- if baseClass is None or issubclass(base, baseClass):
- l.append(base)
- accumulateBases(base, l, baseClass)
-
-
-def prefixedMethodNames(classObj, prefix):
- """A list of method names with a given prefix in a given class.
- """
- dct = {}
- addMethodNamesToDict(classObj, dct, prefix)
- return dct.keys()
-
-
-def addMethodNamesToDict(classObj, dict, prefix, baseClass=None):
- """
- addMethodNamesToDict(classObj, dict, prefix, baseClass=None) -> dict
- this goes through 'classObj' (and its bases) and puts method names
- starting with 'prefix' in 'dict' with a value of 1. if baseClass isn't
- None, methods will only be added if classObj is-a baseClass
-
- If the class in question has the methods 'prefix_methodname' and
- 'prefix_methodname2', the resulting dict should look something like:
- {"methodname": 1, "methodname2": 1}.
- """
- for base in classObj.__bases__:
- addMethodNamesToDict(base, dict, prefix, baseClass)
-
- if baseClass is None or baseClass in classObj.__bases__:
- for name, method in classObj.__dict__.items():
- optName = name[len(prefix):]
- if ((type(method) is types.FunctionType)
- and (name[:len(prefix)] == prefix)
- and (len(optName))):
- dict[optName] = 1
-
-def prefixedMethods(obj, prefix=''):
- """A list of methods with a given prefix on a given instance.
- """
- dct = {}
- accumulateMethods(obj, dct, prefix)
- return dct.values()
-
-def accumulateMethods(obj, dict, prefix='', curClass=None):
- """accumulateMethods(instance, dict, prefix)
- I recurse through the bases of instance.__class__, and add methods
- beginning with 'prefix' to 'dict', in the form of
- {'methodname':*instance*method_object}.
- """
- if not curClass:
- curClass = obj.__class__
- for base in curClass.__bases__:
- accumulateMethods(obj, dict, prefix, base)
-
- for name, method in curClass.__dict__.items():
- optName = name[len(prefix):]
- if ((type(method) is types.FunctionType)
- and (name[:len(prefix)] == prefix)
- and (len(optName))):
- dict[optName] = getattr(obj, name)
-
-def accumulateClassDict(classObj, attr, adict, baseClass=None):
- """Accumulate all attributes of a given name in a class heirarchy into a single dictionary.
-
- Assuming all class attributes of this name are dictionaries.
- If any of the dictionaries being accumulated have the same key, the
- one highest in the class heirarchy wins.
- (XXX: If \"higest\" means \"closest to the starting class\".)
-
- Ex::
-
- | class Soy:
- | properties = {\"taste\": \"bland\"}
- |
- | class Plant:
- | properties = {\"colour\": \"green\"}
- |
- | class Seaweed(Plant):
- | pass
- |
- | class Lunch(Soy, Seaweed):
- | properties = {\"vegan\": 1 }
- |
- | dct = {}
- |
- | accumulateClassDict(Lunch, \"properties\", dct)
- |
- | print dct
-
- {\"taste\": \"bland\", \"colour\": \"green\", \"vegan\": 1}
- """
- for base in classObj.__bases__:
- accumulateClassDict(base, attr, adict)
- if baseClass is None or baseClass in classObj.__bases__:
- adict.update(classObj.__dict__.get(attr, {}))
-
-
-def accumulateClassList(classObj, attr, listObj, baseClass=None):
- """Accumulate all attributes of a given name in a class heirarchy into a single list.
-
- Assuming all class attributes of this name are lists.
- """
- for base in classObj.__bases__:
- accumulateClassList(base, attr, listObj)
- if baseClass is None or baseClass in classObj.__bases__:
- listObj.extend(classObj.__dict__.get(attr, []))
-
-
-def isSame(a, b):
- return (a is b)
-
-def isLike(a, b):
- return (a == b)
-
-def modgrep(goal):
- return objgrep(sys.modules, goal, isLike, 'sys.modules')
-
-def isOfType(start, goal):
- return ((type(start) is goal) or
- (isinstance(start, types.InstanceType) and
- start.__class__ is goal))
-
-
-def findInstances(start, t):
- return objgrep(start, t, isOfType)
-
-def objgrep(start, goal, eq=isLike, path='', paths=None, seen=None, showUnknowns=0, maxDepth=None):
- '''An insanely CPU-intensive process for finding stuff.
- '''
- if paths is None:
- paths = []
- if seen is None:
- seen = {}
- if eq(start, goal):
- paths.append(path)
- if seen.has_key(id(start)):
- if seen[id(start)] is start:
- return
- if maxDepth is not None:
- if maxDepth == 0:
- return
- maxDepth -= 1
- seen[id(start)] = start
- if isinstance(start, types.DictionaryType):
- r = []
- for k, v in start.items():
- objgrep(k, goal, eq, path+'{'+repr(v)+'}', paths, seen, showUnknowns, maxDepth)
- objgrep(v, goal, eq, path+'['+repr(k)+']', paths, seen, showUnknowns, maxDepth)
- elif isinstance(start, (list, tuple, deque)):
- for idx in xrange(len(start)):
- objgrep(start[idx], goal, eq, path+'['+str(idx)+']', paths, seen, showUnknowns, maxDepth)
- elif isinstance(start, types.MethodType):
- objgrep(start.im_self, goal, eq, path+'.im_self', paths, seen, showUnknowns, maxDepth)
- objgrep(start.im_func, goal, eq, path+'.im_func', paths, seen, showUnknowns, maxDepth)
- objgrep(start.im_class, goal, eq, path+'.im_class', paths, seen, showUnknowns, maxDepth)
- elif hasattr(start, '__dict__'):
- for k, v in start.__dict__.items():
- objgrep(v, goal, eq, path+'.'+k, paths, seen, showUnknowns, maxDepth)
- if isinstance(start, types.InstanceType):
- objgrep(start.__class__, goal, eq, path+'.__class__', paths, seen, showUnknowns, maxDepth)
- elif isinstance(start, weakref.ReferenceType):
- objgrep(start(), goal, eq, path+'()', paths, seen, showUnknowns, maxDepth)
- elif (isinstance(start, types.StringTypes+
- (types.IntType, types.FunctionType,
- types.BuiltinMethodType, RegexType, types.FloatType,
- types.NoneType, types.FileType)) or
- type(start).__name__ in ('wrapper_descriptor', 'method_descriptor',
- 'member_descriptor', 'getset_descriptor')):
- pass
- elif showUnknowns:
- print 'unknown type', type(start), start
- return paths
-
-
-def filenameToModuleName(fn):
- """
- Convert a name in the filesystem to the name of the Python module it is.
-
- This is agressive about getting a module name back from a file; it will
- always return a string. Agressive means 'sometimes wrong'; it won't look
- at the Python path or try to do any error checking: don't use this method
- unless you already know that the filename you're talking about is a Python
- module.
- """
- fullName = os.path.abspath(fn)
- base = os.path.basename(fn)
- if not base:
- # this happens when fn ends with a path separator, just skit it
- base = os.path.basename(fn[:-1])
- modName = os.path.splitext(base)[0]
- while 1:
- fullName = os.path.dirname(fullName)
- if os.path.exists(os.path.join(fullName, "__init__.py")):
- modName = "%s.%s" % (os.path.basename(fullName), modName)
- else:
- break
- return modName
-
-#boo python
« no previous file with comments | « third_party/twisted_8_1/twisted/python/rebuild.py ('k') | third_party/twisted_8_1/twisted/python/release.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698