def testCircleWithInvoker(self): class dummyInvokerClass: pass dummyInvoker = dummyInvokerClass() dummyInvoker.serializingPerspective = None a0 = ClassA() jelly.setUnjellyableForClass(ClassA, ClassA) jelly.setUnjellyableForClass(ClassB, ClassB) j = jelly.jelly(a0, invoker=dummyInvoker) a1 = jelly.unjelly(j) self.failUnlessIdentical(a1.ref.ref, a1, "Identity not preserved in circular reference")
def test_circleWithInvoker(self): class DummyInvokerClass: pass dummyInvoker = DummyInvokerClass() dummyInvoker.serializingPerspective = None a0 = ClassA() jelly.setUnjellyableForClass(ClassA, ClassA) jelly.setUnjellyableForClass(ClassB, ClassB) j = jelly.jelly(a0, invoker=dummyInvoker) a1 = jelly.unjelly(j) self.failUnlessIdentical(a1.ref.ref, a1, "Identity not preserved in circular reference")
def test_unjellyable(self): """ Test that if Unjellyable is used to deserialize a jellied object, state comes out right. """ class JellyableTestClass(jelly.Jellyable): pass jelly.setUnjellyableForClass(JellyableTestClass, jelly.Unjellyable) input = JellyableTestClass() input.attribute = 'value' output = jelly.unjelly(jelly.jelly(input)) self.assertEquals(output.attribute, 'value') self.assertIsInstance(output, jelly.Unjellyable)
def test_unjellyable(self): """ Test that if Unjellyable is used to deserialize a jellied object, state comes out right. """ class JellyableTestClass(jelly.Jellyable): pass jelly.setUnjellyableForClass(JellyableTestClass, jelly.Unjellyable) input = JellyableTestClass() input.attribute = 'value' output = jelly.unjelly(jelly.jelly(input)) self.assertEqual(output.attribute, 'value') self.assertIsInstance(output, jelly.Unjellyable)
def testUnjellyable(self): """ Test that if Unjellyable is used to deserialize a jellied object, state comes out right. """ class JellyableTestClass(jelly.Jellyable): pass jelly.setUnjellyableForClass(JellyableTestClass, jelly.Unjellyable) input = JellyableTestClass() input.attribute = 'value' output = jelly.unjelly(jelly.jelly(input)) self.assertEquals(output.attribute, 'value') self.failUnless( isinstance(output, jelly.Unjellyable), "Got instance of %r, not Unjellyable" % (output.__class__,))
def testUnjellyable(self): """ Test that if Unjellyable is used to deserialize a jellied object, state comes out right. """ class JellyableTestClass(jelly.Jellyable): pass jelly.setUnjellyableForClass(JellyableTestClass, jelly.Unjellyable) input = JellyableTestClass() input.attribute = 'value' output = jelly.unjelly(jelly.jelly(input)) self.assertEquals(output.attribute, 'value') self.failUnless( isinstance(output, jelly.Unjellyable), "Got instance of %r, not Unjellyable" % (output.__class__, ))
enum = etype(value, name, nicks[value]) for extra_key, extra_values in extras.items(): assert not hasattr(enum, extra_key) setattr(enum, extra_key, extra_values[value]) etype[value] = enum _enumClassRegistry[type_name] = etype return etype # Enum unjellyer should not be a new style class, # otherwise Twsited 2.0.1 will not recognise it. class EnumUnjellyer(jelly.Unjellyable): def unjellyFor(self, unjellier, jellyList): enumClassName, value, name, nick = jellyList[1:] enumClass = _enumClassRegistry.get(enumClassName, None) if enumClass: # Retrieve the enum singleton enum = enumClass.get(value) assert enum.name == name, "Inconsistent Enum Name" else: # Create a generic Enum container enum = Enum(value, name, nick) enum._enumClassName = enumClassName return enum jelly.setUnjellyableForClass(qual(Enum), EnumUnjellyer)
def __eq__(self, value): return (value is self or (self.str == value.str and self.unicode == value.unicode and self.int == value.int and self.long == value.long and abs(self.float - value.float) < 0.00000001 and self.bool == value.bool and self.none == value.none and self.list == value.list and self.tuple == value.tuple and self.set == value.set and self.dict == value.dict and self.ref == value.ref)) jelly.setUnjellyableForClass(qual(SerializableDummy), SerializableDummy) @serialization.register class NotReferenceableDummy(serialization.Serializable, jelly.Jellyable): referenceable = False def __init__(self, value=42): self.value = value def getStateFor(self, jellyer): return self.snapshot() def unjellyFor(self, unjellyer, data): # The way to handle circular references in spread
def registerGIOJelly(): """Register the jelly used by the GIO VFS backend. """ setUnjellyableForClass(GIOFile, GIOFile) setUnjellyableForClass(GIODirectory, GIODirectory) log.info('jelly', 'GIO registered')
def jellyFor(self, jellier): sxp = jellier.prepare(self) sxp.extend([ qual(self.__class__), self._root, self._path]) return jellier.preserve(self, sxp) ## Unjellyable Overriden Methods ## def unjellyFor(self, unjellier, jellyList): self._root, self._path = jellyList[1:] return self jelly.setUnjellyableForClass(qual(VirtualPath), VirtualPath) class VirtualPathProperty(properties.ValueProperty): def __init__(self, descriptor, default=None, required=False): properties.ValueProperty.__init__(self, descriptor, default, required) def checkValue(self, value): return isinstance(value, VirtualPath) def str2val(self, strval): return VirtualPath(strval) def val2str(self, value): return str(value)
def registerGnomeVFSJelly(): """Register the jelly used by the GnomeVFS VFS backend. """ setUnjellyableForClass(GnomeVFSFile, GnomeVFSFile) setUnjellyableForClass(GnomeVFSDirectory, GnomeVFSDirectory) log.info('jelly', 'GnomeVFS registered')
def testSimpleCircle(self): jelly.setUnjellyableForClass(ClassA, ClassA) jelly.setUnjellyableForClass(ClassB, ClassB) a = jelly.unjelly(jelly.jelly(ClassA())) self.failUnless(a.ref.ref is a, "Identity not preserved in circular reference")
def test_simpleCircle(self): jelly.setUnjellyableForClass(ClassA, ClassA) jelly.setUnjellyableForClass(ClassB, ClassB) a = jelly.unjelly(jelly.jelly(ClassA())) self.assertIs(a.ref.ref, a, "Identity not preserved in circular reference")
def test_simpleCircle(self): jelly.setUnjellyableForClass(ClassA, ClassA) jelly.setUnjellyableForClass(ClassB, ClassB) a = jelly.unjelly(jelly.jelly(ClassA())) self.assertIdentical(a.ref.ref, a, "Identity not preserved in circular reference")
# This file may be distributed and/or modified under the terms of # the GNU Lesser General Public License version 2.1 as published by # the Free Software Foundation. # This file is distributed without any warranty; without even the implied # warranty of merchantability or fitness for a particular purpose. # See "LICENSE.LGPL" in the source distribution for more information. # # Headers in this file shall remain intact. from twisted.spread import flavors from twisted.python.reflect import qual class Identity(flavors.Copyable, flavors.RemoteCopy): def __init__(self, identifier): self._identifier = identifier def getStateToCopyFor(self, perspective): return {"identifier": self._identifier} def setCopyableState(self, state): self._identifier = state["identifier"] ## Private ## from twisted.spread import jelly jelly.setUnjellyableForClass(qual(Identity), Identity)