| Index: third_party/twisted_8_1/twisted/persisted/marmalade.py
|
| diff --git a/third_party/twisted_8_1/twisted/persisted/marmalade.py b/third_party/twisted_8_1/twisted/persisted/marmalade.py
|
| deleted file mode 100644
|
| index 0b87c9fd30172c6980de9b6de60fb539a685020d..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/persisted/marmalade.py
|
| +++ /dev/null
|
| @@ -1,416 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_persisted -*-
|
| -
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -"""Marmalade: jelly, with just a hint of bitterness.
|
| -
|
| -I can serialize a Python object to an XML DOM tree (twisted.web.microdom), and
|
| -therefore to XML data, similarly to twisted.spread.jelly. Because both Python
|
| -lists and DOM trees are tree data-structures, many of the idioms used here are
|
| -identical.
|
| -
|
| -"""
|
| -
|
| -import warnings
|
| -warnings.warn("twisted.persisted.marmalade is deprecated", DeprecationWarning, stacklevel=2)
|
| -
|
| -import new
|
| -
|
| -from twisted.python.reflect import namedModule, namedClass, namedObject, fullFuncName, qual
|
| -from twisted.persisted.crefutil import NotKnown, _Tuple, _InstanceMethod, _DictKeyAndValue, _Dereference, _Defer
|
| -
|
| -try:
|
| - from new import instancemethod
|
| -except:
|
| - from org.python.core import PyMethod
|
| - instancemethod = PyMethod
|
| -
|
| -import types
|
| -import copy_reg
|
| -
|
| -#for some reason, __builtins__ == __builtin__.__dict__ in the context where this is used.
|
| -#Can someone tell me why?
|
| -import __builtin__
|
| -
|
| -
|
| -def instance(klass, d):
|
| - if isinstance(klass, types.ClassType):
|
| - return new.instance(klass, d)
|
| - elif isinstance(klass, type):
|
| - o = object.__new__(klass)
|
| - o.__dict__ = d
|
| - return o
|
| - else:
|
| - raise TypeError, "%s is not a class" % klass
|
| -
|
| -
|
| -def getValueElement(node):
|
| - """Get the one child element of a given element.
|
| -
|
| - If there is more than one child element, raises ValueError. Otherwise,
|
| - returns the value element.
|
| - """
|
| - valueNode = None
|
| - for subnode in node.childNodes:
|
| - if isinstance(subnode, Element):
|
| - if valueNode is None:
|
| - valueNode = subnode
|
| - else:
|
| - raise ValueError("Only one value node allowed per instance!")
|
| - return valueNode
|
| -
|
| -
|
| -class DOMJellyable:
|
| -
|
| - jellyDOMVersion = 1
|
| -
|
| - def jellyToDOM(self, jellier, element):
|
| - element.setAttribute("marmalade:version", str(self.jellyDOMVersion))
|
| - method = getattr(self, "jellyToDOM_%s" % self.jellyDOMVersion, None)
|
| - if method:
|
| - method(jellier, element)
|
| - else:
|
| - element.appendChild(jellier.jellyToNode(self.__dict__))
|
| -
|
| - def unjellyFromDOM(self, unjellier, element):
|
| - pDOMVersion = element.getAttribute("marmalade:version") or "0"
|
| - method = getattr(self, "unjellyFromDOM_%s" % pDOMVersion, None)
|
| - if method:
|
| - method(unjellier, element)
|
| - else:
|
| - # XXX: DOMJellyable.unjellyNode does not exist
|
| - # XXX: 'node' is undefined - did you mean 'self', 'element', or 'Node'?
|
| - state = self.unjellyNode(getValueElement(node))
|
| - if hasattr(self.__class__, "__setstate__"):
|
| - self.__setstate__(state)
|
| - else:
|
| - self.__dict__ = state
|
| -
|
| -
|
| -
|
| -class DOMUnjellier:
|
| - def __init__(self):
|
| - self.references = {}
|
| - self._savedLater = []
|
| -
|
| - def unjellyLater(self, node):
|
| - """Unjelly a node, later.
|
| - """
|
| - d = _Defer()
|
| - self.unjellyInto(d, 0, node)
|
| - self._savedLater.append(d)
|
| - return d
|
| -
|
| - def unjellyInto(self, obj, loc, node):
|
| - """Utility method for unjellying one object into another.
|
| -
|
| - This automates the handling of backreferences.
|
| - """
|
| - o = self.unjellyNode(node)
|
| - obj[loc] = o
|
| - if isinstance(o, NotKnown):
|
| - o.addDependant(obj, loc)
|
| - return o
|
| -
|
| - def unjellyAttribute(self, instance, attrName, valueNode):
|
| - """Utility method for unjellying into instances of attributes.
|
| -
|
| - Use this rather than unjellyNode unless you like surprising bugs!
|
| - Alternatively, you can use unjellyInto on your instance's __dict__.
|
| - """
|
| - self.unjellyInto(instance.__dict__, attrName, valueNode)
|
| -
|
| - def unjellyNode(self, node):
|
| - if node.tagName.lower() == "none":
|
| - retval = None
|
| - elif node.tagName == "string":
|
| - # XXX FIXME this is obviously insecure
|
| - # if you doubt:
|
| - # >>> unjellyFromXML('''<string value="h"+str(__import__("sys"))+"i" />''')
|
| - # "h<module 'sys' (built-in)>i"
|
| - retval = str(eval('"%s"' % node.getAttribute("value")))
|
| - elif node.tagName == "int":
|
| - retval = int(node.getAttribute("value"))
|
| - elif node.tagName == "float":
|
| - retval = float(node.getAttribute("value"))
|
| - elif node.tagName == "longint":
|
| - retval = long(node.getAttribute("value"))
|
| - elif node.tagName == "bool":
|
| - retval = int(node.getAttribute("value"))
|
| - if retval:
|
| - retval = True
|
| - else:
|
| - retval = False
|
| - elif node.tagName == "module":
|
| - retval = namedModule(str(node.getAttribute("name")))
|
| - elif node.tagName == "class":
|
| - retval = namedClass(str(node.getAttribute("name")))
|
| - elif node.tagName == "unicode":
|
| - retval = unicode(str(node.getAttribute("value")).replace("\\n", "\n").replace("\\t", "\t"), "raw_unicode_escape")
|
| - elif node.tagName == "function":
|
| - retval = namedObject(str(node.getAttribute("name")))
|
| - elif node.tagName == "method":
|
| - im_name = node.getAttribute("name")
|
| - im_class = namedClass(node.getAttribute("class"))
|
| - im_self = self.unjellyNode(getValueElement(node))
|
| - if im_class.__dict__.has_key(im_name):
|
| - if im_self is None:
|
| - retval = getattr(im_class, im_name)
|
| - elif isinstance(im_self, NotKnown):
|
| - retval = _InstanceMethod(im_name, im_self, im_class)
|
| - else:
|
| - retval = instancemethod(im_class.__dict__[im_name],
|
| - im_self,
|
| - im_class)
|
| - else:
|
| - raise TypeError("instance method changed")
|
| - elif node.tagName == "tuple":
|
| - l = []
|
| - tupFunc = tuple
|
| - for subnode in node.childNodes:
|
| - if isinstance(subnode, Element):
|
| - l.append(None)
|
| - if isinstance(self.unjellyInto(l, len(l)-1, subnode), NotKnown):
|
| - tupFunc = _Tuple
|
| - retval = tupFunc(l)
|
| - elif node.tagName == "list":
|
| - l = []
|
| - finished = 1
|
| - for subnode in node.childNodes:
|
| - if isinstance(subnode, Element):
|
| - l.append(None)
|
| - self.unjellyInto(l, len(l)-1, subnode)
|
| - retval = l
|
| - elif node.tagName == "dictionary":
|
| - d = {}
|
| - keyMode = 1
|
| - for subnode in node.childNodes:
|
| - if isinstance(subnode, Element):
|
| - if keyMode:
|
| - kvd = _DictKeyAndValue(d)
|
| - if not subnode.getAttribute("role") == "key":
|
| - raise TypeError("Unjellying Error: key role not set")
|
| - self.unjellyInto(kvd, 0, subnode)
|
| - else:
|
| - self.unjellyInto(kvd, 1, subnode)
|
| - keyMode = not keyMode
|
| - retval = d
|
| - elif node.tagName == "instance":
|
| - className = node.getAttribute("class")
|
| - clasz = namedClass(className)
|
| - if issubclass(clasz, DOMJellyable):
|
| - retval = instance(clasz, {})
|
| - retval.unjellyFromDOM(self, node)
|
| - else:
|
| - state = self.unjellyNode(getValueElement(node))
|
| - if hasattr(clasz, "__setstate__"):
|
| - inst = instance(clasz, {})
|
| - inst.__setstate__(state)
|
| - else:
|
| - inst = instance(clasz, state)
|
| - retval = inst
|
| - elif node.tagName == "reference":
|
| - refkey = node.getAttribute("key")
|
| - retval = self.references.get(refkey)
|
| - if retval is None:
|
| - der = _Dereference(refkey)
|
| - self.references[refkey] = der
|
| - retval = der
|
| - elif node.tagName == "copyreg":
|
| - nodefunc = namedObject(node.getAttribute("loadfunc"))
|
| - loaddef = self.unjellyLater(getValueElement(node)).addCallback(
|
| - lambda result, _l: apply(_l, result), nodefunc)
|
| - retval = loaddef
|
| - else:
|
| - raise TypeError("Unsupported Node Type: %s" % (node.tagName,))
|
| - if node.hasAttribute("reference"):
|
| - refkey = node.getAttribute("reference")
|
| - ref = self.references.get(refkey)
|
| - if ref is None:
|
| - self.references[refkey] = retval
|
| - elif isinstance(ref, NotKnown):
|
| - ref.resolveDependants(retval)
|
| - self.references[refkey] = retval
|
| - else:
|
| - assert 0, "Multiple references with the same ID!"
|
| - return retval
|
| -
|
| - def unjelly(self, doc):
|
| - l = [None]
|
| - self.unjellyInto(l, 0, doc.childNodes[0])
|
| - for svd in self._savedLater:
|
| - svd.unpause()
|
| - return l[0]
|
| -
|
| -
|
| -class DOMJellier:
|
| - def __init__(self):
|
| - # dict of {id(obj): (obj, node)}
|
| - self.prepared = {}
|
| - self.document = Document()
|
| - self._ref_id = 0
|
| -
|
| - def prepareElement(self, element, object):
|
| - self.prepared[id(object)] = (object, element)
|
| -
|
| - def jellyToNode(self, obj):
|
| - """Create a node representing the given object and return it.
|
| - """
|
| - objType = type(obj)
|
| - #immutable (We don't care if these have multiple refs)
|
| - if objType is types.NoneType:
|
| - node = self.document.createElement("None")
|
| - elif objType is types.StringType:
|
| - node = self.document.createElement("string")
|
| - r = repr(obj)
|
| - if r[0] == '"':
|
| - r = r.replace("'", "\\'")
|
| - else:
|
| - r = r.replace('"', '\\"')
|
| - node.setAttribute("value", r[1:-1])
|
| - # node.appendChild(CDATASection(obj))
|
| - elif objType is types.IntType:
|
| - node = self.document.createElement("int")
|
| - node.setAttribute("value", str(obj))
|
| - elif objType is types.LongType:
|
| - node = self.document.createElement("longint")
|
| - s = str(obj)
|
| - if s[-1] == 'L':
|
| - s = s[:-1]
|
| - node.setAttribute("value", s)
|
| - elif objType is types.FloatType:
|
| - node = self.document.createElement("float")
|
| - node.setAttribute("value", repr(obj))
|
| - elif objType is types.MethodType:
|
| - node = self.document.createElement("method")
|
| - node.setAttribute("name", obj.im_func.__name__)
|
| - node.setAttribute("class", qual(obj.im_class))
|
| - # TODO: make methods 'prefer' not to jelly the object internally,
|
| - # so that the object will show up where it's referenced first NOT
|
| - # by a method.
|
| - node.appendChild(self.jellyToNode(obj.im_self))
|
| - elif hasattr(types, 'BooleanType') and objType is types.BooleanType:
|
| - node = self.document.createElement("bool")
|
| - node.setAttribute("value", str(int(obj)))
|
| - elif objType is types.ModuleType:
|
| - node = self.document.createElement("module")
|
| - node.setAttribute("name", obj.__name__)
|
| - elif objType==types.ClassType or issubclass(objType, type):
|
| - node = self.document.createElement("class")
|
| - node.setAttribute("name", qual(obj))
|
| - elif objType is types.UnicodeType:
|
| - node = self.document.createElement("unicode")
|
| - obj = obj.encode('raw_unicode_escape')
|
| - s = obj.replace("\n", "\\n").replace("\t", "\\t")
|
| - node.setAttribute("value", s)
|
| - elif objType in (types.FunctionType, types.BuiltinFunctionType):
|
| - # TODO: beat pickle at its own game, and do BuiltinFunctionType
|
| - # separately, looking for __self__ attribute and unpickling methods
|
| - # of C objects when possible.
|
| - node = self.document.createElement("function")
|
| - node.setAttribute("name", fullFuncName(obj))
|
| - else:
|
| - #mutable!
|
| - if self.prepared.has_key(id(obj)):
|
| - oldNode = self.prepared[id(obj)][1]
|
| - if oldNode.hasAttribute("reference"):
|
| - # it's been referenced already
|
| - key = oldNode.getAttribute("reference")
|
| - else:
|
| - # it hasn't been referenced yet
|
| - self._ref_id = self._ref_id + 1
|
| - key = str(self._ref_id)
|
| - oldNode.setAttribute("reference", key)
|
| - node = self.document.createElement("reference")
|
| - node.setAttribute("key", key)
|
| - return node
|
| - node = self.document.createElement("UNNAMED")
|
| - self.prepareElement(node, obj)
|
| - if objType is types.ListType or __builtin__.__dict__.has_key('object') and isinstance(obj, NodeList):
|
| - node.tagName = "list"
|
| - for subobj in obj:
|
| - node.appendChild(self.jellyToNode(subobj))
|
| - elif objType is types.TupleType:
|
| - node.tagName = "tuple"
|
| - for subobj in obj:
|
| - node.appendChild(self.jellyToNode(subobj))
|
| - elif objType is types.DictionaryType:
|
| - node.tagName = "dictionary"
|
| - for k, v in obj.items():
|
| - n = self.jellyToNode(k)
|
| - n.setAttribute("role", "key")
|
| - n2 = self.jellyToNode(v)
|
| - node.appendChild(n)
|
| - node.appendChild(n2)
|
| - elif copy_reg.dispatch_table.has_key(objType):
|
| - unpickleFunc, state = copy_reg.dispatch_table[objType](obj)
|
| - node = self.document.createElement("copyreg")
|
| - # node.setAttribute("type", objType.__name__)
|
| - node.setAttribute("loadfunc", fullFuncName(unpickleFunc))
|
| - node.appendChild(self.jellyToNode(state))
|
| - elif objType is types.InstanceType or hasattr(objType, "__module__"):
|
| - className = qual(obj.__class__)
|
| - node.tagName = "instance"
|
| - node.setAttribute("class", className)
|
| - if isinstance(obj, DOMJellyable):
|
| - obj.jellyToDOM(self, node)
|
| - else:
|
| - if hasattr(obj, "__getstate__"):
|
| - state = obj.__getstate__()
|
| - else:
|
| - state = obj.__dict__
|
| - n = self.jellyToNode(state)
|
| - node.appendChild(n)
|
| - else:
|
| - raise TypeError("Unsupported type: %s" % (objType.__name__,))
|
| - return node
|
| -
|
| - def jelly(self, obj):
|
| - """Create a document representing the current object, and return it.
|
| - """
|
| - node = self.jellyToNode(obj)
|
| - self.document.appendChild(node)
|
| - return self.document
|
| -
|
| -
|
| -def jellyToDOM(object):
|
| - """Convert an Object into an twisted.web.microdom.Document.
|
| - """
|
| - dj = DOMJellier()
|
| - document = dj.jelly(object)
|
| - return document
|
| -
|
| -
|
| -def unjellyFromDOM(document):
|
| - """Convert an twisted.web.microdom.Document into a Python object.
|
| - """
|
| - du = DOMUnjellier()
|
| - return du.unjelly(document)
|
| -
|
| -
|
| -def jellyToXML(object, file=None):
|
| - """jellyToXML(object, [file]) -> None | string
|
| -
|
| - Converts a Python object to an XML stream. If you pass a file, the XML
|
| - will be written to that file; otherwise, a string of the XML will be
|
| - returned.
|
| - """
|
| - document = jellyToDOM(object)
|
| - if file:
|
| - document.writexml(file, "", " ", "\n")
|
| - else:
|
| - return document.toprettyxml(" ", "\n")
|
| -
|
| -def unjellyFromXML(stringOrFile):
|
| - """I convert a string or the contents of an XML file into a Python object.
|
| - """
|
| - if hasattr(stringOrFile, "read"):
|
| - document = parse(stringOrFile)
|
| - else:
|
| - document = parseString(stringOrFile)
|
| - return unjellyFromDOM(document)
|
| -
|
| -
|
| -from twisted.web.microdom import Element, Document, parse, parseString, NodeList
|
|
|