Index: third_party/twisted_8_1/twisted/persisted/styles.py |
diff --git a/third_party/twisted_8_1/twisted/persisted/styles.py b/third_party/twisted_8_1/twisted/persisted/styles.py |
deleted file mode 100644 |
index a684935d159d3e3112af31c03e4645b52e092a4c..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/persisted/styles.py |
+++ /dev/null |
@@ -1,256 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_persisted -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
- |
-""" |
-Different styles of persisted objects. |
-""" |
- |
-# System Imports |
-import types |
-import copy_reg |
-import copy |
- |
-try: |
- import cStringIO as StringIO |
-except ImportError: |
- import StringIO |
- |
-# Twisted Imports |
-from twisted.python import log |
- |
-try: |
- from new import instancemethod |
-except: |
- from org.python.core import PyMethod |
- instancemethod = PyMethod |
- |
-oldModules = {} |
- |
-## First, let's register support for some stuff that really ought to |
-## be registerable... |
- |
-def pickleMethod(method): |
- 'support function for copy_reg to pickle method refs' |
- return unpickleMethod, (method.im_func.__name__, |
- method.im_self, |
- method.im_class) |
- |
-def unpickleMethod(im_name, |
- im_self, |
- im_class): |
- 'support function for copy_reg to unpickle method refs' |
- try: |
- unbound = getattr(im_class,im_name) |
- if im_self is None: |
- return unbound |
- bound=instancemethod(unbound.im_func, |
- im_self, |
- im_class) |
- return bound |
- except AttributeError: |
- log.msg("Method",im_name,"not on class",im_class) |
- assert im_self is not None,"No recourse: no instance to guess from." |
- # Attempt a common fix before bailing -- if classes have |
- # changed around since we pickled this method, we may still be |
- # able to get it by looking on the instance's current class. |
- unbound = getattr(im_self.__class__,im_name) |
- log.msg("Attempting fixup with",unbound) |
- if im_self is None: |
- return unbound |
- bound=instancemethod(unbound.im_func, |
- im_self, |
- im_self.__class__) |
- return bound |
- |
-copy_reg.pickle(types.MethodType, |
- pickleMethod, |
- unpickleMethod) |
- |
-def pickleModule(module): |
- 'support function for copy_reg to pickle module refs' |
- return unpickleModule, (module.__name__,) |
- |
-def unpickleModule(name): |
- 'support function for copy_reg to unpickle module refs' |
- if oldModules.has_key(name): |
- log.msg("Module has moved: %s" % name) |
- name = oldModules[name] |
- log.msg(name) |
- return __import__(name,{},{},'x') |
- |
- |
-copy_reg.pickle(types.ModuleType, |
- pickleModule, |
- unpickleModule) |
- |
-def pickleStringO(stringo): |
- 'support function for copy_reg to pickle StringIO.OutputTypes' |
- return unpickleStringO, (stringo.getvalue(), stringo.tell()) |
- |
-def unpickleStringO(val, sek): |
- x = StringIO.StringIO() |
- x.write(val) |
- x.seek(sek) |
- return x |
- |
-if hasattr(StringIO, 'OutputType'): |
- copy_reg.pickle(StringIO.OutputType, |
- pickleStringO, |
- unpickleStringO) |
- |
-def pickleStringI(stringi): |
- return unpickleStringI, (stringi.getvalue(), stringi.tell()) |
- |
-def unpickleStringI(val, sek): |
- x = StringIO.StringIO(val) |
- x.seek(sek) |
- return x |
- |
- |
-if hasattr(StringIO, 'InputType'): |
- copy_reg.pickle(StringIO.InputType, |
- pickleStringI, |
- unpickleStringI) |
- |
-class Ephemeral: |
- """ |
- This type of object is never persisted; if possible, even references to it |
- are eliminated. |
- """ |
- |
- def __getstate__(self): |
- log.msg( "WARNING: serializing ephemeral %s" % self ) |
- import gc |
- for r in gc.get_referrers(self): |
- log.msg( " referred to by %s" % (r,)) |
- return None |
- |
- def __setstate__(self, state): |
- log.msg( "WARNING: unserializing ephemeral %s" % self.__class__ ) |
- self.__class__ = Ephemeral |
- |
- |
-versionedsToUpgrade = {} |
-upgraded = {} |
- |
-def doUpgrade(): |
- global versionedsToUpgrade, upgraded |
- for versioned in versionedsToUpgrade.values(): |
- requireUpgrade(versioned) |
- versionedsToUpgrade = {} |
- upgraded = {} |
- |
-def requireUpgrade(obj): |
- """Require that a Versioned instance be upgraded completely first. |
- """ |
- objID = id(obj) |
- if objID in versionedsToUpgrade and objID not in upgraded: |
- upgraded[objID] = 1 |
- obj.versionUpgrade() |
- return obj |
- |
-from twisted.python import reflect |
- |
-def _aybabtu(c): |
- l = [] |
- for b in reflect.allYourBase(c, Versioned): |
- if b not in l and b is not Versioned: |
- l.append(b) |
- return l |
- |
-class Versioned: |
- """ |
- This type of object is persisted with versioning information. |
- |
- I have a single class attribute, the int persistenceVersion. After I am |
- unserialized (and styles.doUpgrade() is called), self.upgradeToVersionX() |
- will be called for each version upgrade I must undergo. |
- |
- For example, if I serialize an instance of a Foo(Versioned) at version 4 |
- and then unserialize it when the code is at version 9, the calls:: |
- |
- self.upgradeToVersion5() |
- self.upgradeToVersion6() |
- self.upgradeToVersion7() |
- self.upgradeToVersion8() |
- self.upgradeToVersion9() |
- |
- will be made. If any of these methods are undefined, a warning message |
- will be printed. |
- """ |
- persistenceVersion = 0 |
- persistenceForgets = () |
- |
- def __setstate__(self, state): |
- versionedsToUpgrade[id(self)] = self |
- self.__dict__ = state |
- |
- def __getstate__(self, dict=None): |
- """Get state, adding a version number to it on its way out. |
- """ |
- dct = copy.copy(dict or self.__dict__) |
- bases = _aybabtu(self.__class__) |
- bases.reverse() |
- bases.append(self.__class__) # don't forget me!! |
- for base in bases: |
- if base.__dict__.has_key('persistenceForgets'): |
- for slot in base.persistenceForgets: |
- if dct.has_key(slot): |
- del dct[slot] |
- if base.__dict__.has_key('persistenceVersion'): |
- dct['%s.persistenceVersion' % reflect.qual(base)] = base.persistenceVersion |
- return dct |
- |
- def versionUpgrade(self): |
- """(internal) Do a version upgrade. |
- """ |
- bases = _aybabtu(self.__class__) |
- # put the bases in order so superclasses' persistenceVersion methods |
- # will be called first. |
- bases.reverse() |
- bases.append(self.__class__) # don't forget me!! |
- # first let's look for old-skool versioned's |
- if self.__dict__.has_key("persistenceVersion"): |
- |
- # Hacky heuristic: if more than one class subclasses Versioned, |
- # we'll assume that the higher version number wins for the older |
- # class, so we'll consider the attribute the version of the older |
- # class. There are obviously possibly times when this will |
- # eventually be an incorrect assumption, but hopefully old-school |
- # persistenceVersion stuff won't make it that far into multiple |
- # classes inheriting from Versioned. |
- |
- pver = self.__dict__['persistenceVersion'] |
- del self.__dict__['persistenceVersion'] |
- highestVersion = 0 |
- highestBase = None |
- for base in bases: |
- if not base.__dict__.has_key('persistenceVersion'): |
- continue |
- if base.persistenceVersion > highestVersion: |
- highestBase = base |
- highestVersion = base.persistenceVersion |
- if highestBase: |
- self.__dict__['%s.persistenceVersion' % reflect.qual(highestBase)] = pver |
- for base in bases: |
- # ugly hack, but it's what the user expects, really |
- if (Versioned not in base.__bases__ and |
- not base.__dict__.has_key('persistenceVersion')): |
- continue |
- currentVers = base.persistenceVersion |
- pverName = '%s.persistenceVersion' % reflect.qual(base) |
- persistVers = (self.__dict__.get(pverName) or 0) |
- if persistVers: |
- del self.__dict__[pverName] |
- assert persistVers <= currentVers, "Sorry, can't go backwards in time." |
- while persistVers < currentVers: |
- persistVers = persistVers + 1 |
- method = base.__dict__.get('upgradeToVersion%s' % persistVers, None) |
- if method: |
- log.msg( "Upgrading %s (of %s @ %s) to version %s" % (reflect.qual(base), reflect.qual(self.__class__), id(self), persistVers) ) |
- method(self) |
- else: |
- log.msg( 'Warning: cannot upgrade %s to version %s' % (base, persistVers) ) |