Module twisted.spread.jelly
S-expression-based persistence of python objects.
Stability: semi-stable
Future Plans: Optimization. Lots of optimization. No semantic
breakages should be necessary, but if small tweaks are required to gain
acceptable large-scale performance then they will be made. Although Glyph
is the maintainer, Bruce Mitchener will be supervising most of the
optimization work here.
I do something very much like Pickle<pickle>
;
however, pickle's main goal seems to be efficiency (both in space and
time); jelly's main goals are security, human readability, and
portability to other environments.
This is how Jelly converts various objects to s-expressions:
Boolean: True --> ['boolean', 'true']
Integer: 1 --> 1
List: [1, 2] --> ['list', 1, 2]
String: "hello" --> "hello"
Float: 2.3 --> 2.3
Dictionary: {'a' : 1, 'b' : 'c'} --> ['dictionary', ['b', 'c'],
['a', 1]]
Module: UserString --> ['module', 'UserString']
Class: UserString.UserString --> ['class', ['module',
'UserString'], 'UserString']
Function: string.join --> ['function', 'join', ['module',
'string']]
Instance: s is an instance of UserString.UserString, with a __dict__
{'data': 'hello'}: ["UserString.UserString", ['dictionary',
['data', 'hello']]]
# ['instance', ['class', ['module', 'UserString'], 'UserString'],
['dictionary', ['data', 'hello']]]
Class Method: UserString.UserString.center: ['method', 'center',
['None'], ['class', ['module', 'UserString'], 'UserString']]
Instance Method: s.center, where s is an instance of
UserString.UserString: ['method', 'center', ['instance', ['reference', 1,
['class', ['module', 'UserString'], 'UserString']], ['dictionary',
['data', 'd']]], ['dereference', 1]]
Author: Glyph
Lefkowitz<mailto:glyph@twistedmatrix.com>
Classes |
DummySecurityOptions |
DummySecurityOptions() -> insecure security options Dummy security
options -- this class will allow anything. |
Jellyable |
Inherit from me to Jelly yourself directly. |
SecurityOptions |
This will by default disallow everything, except for 'none'. |
Unjellyable |
Inherit from me to Unjelly yourself directly. |
Unpersistable |
This is an instance of a class that comes back when something couldn't
be persisted. |
_Dummy |
(Internal) Dummy class, used for unserializing instances. |
_Jellier |
(Internal) This class manages state for a call to jelly() |
_Unjellier |
|
Exceptions |
InsecureJelly |
This exception will be raised when a jelly is deemed `insecure';
e.g. |
Function Summary |
|
getInstanceState (inst,
jellier)
Utility method to default to 'normal' state rules in
serialization. |
|
jelly (object,
taster,
persistentStore,
invoker)
Serialize to s-expression. |
|
setInstanceState (inst,
unjellier,
jellyList)
Utility method to default to 'normal' state rules in
unserialization. |
|
setUnjellyableFactoryForClass (classname,
copyFactory)
Set the factory to construct a remote instance of a type: |
|
setUnjellyableForClass (classname,
unjellyable)
Set which local class will represent a remote type. |
|
setUnjellyableForClassTree (module,
baseClass,
prefix)
Set all classes in a module derived from baseClass as
copiers for a corresponding remote class. |
|
unjelly (sexp,
taster,
persistentLoad,
invoker)
Unserialize from s-expression. |
|
_maybeClass(classnamep)
|
getInstanceState(inst,
jellier)
Utility method to default to 'normal' state rules in
serialization.
-
|
jelly(object,
taster=<twisted.spread.jelly.DummySecurityOptions instan...,
persistentStore=None,
invoker=None)
Serialize to s-expression.
Returns a list which is the serialized representation of an object. An
optional 'taster' argument takes a SecurityOptions and will mark any
insecure objects as unpersistable rather than serializing them.
-
|
setInstanceState(inst,
unjellier,
jellyList)
Utility method to default to 'normal' state rules in
unserialization.
-
|
setUnjellyableFactoryForClass(classname,
copyFactory)
Set the factory to construct a remote instance of a type:
jellier.setFactoryForClass('module.package.Class', MyFactory)
Call this at the module level immediately after its class definition.
copyFactory should return an instance or subclass of RemoteCopy<pb.RemoteCopy> .
Similar to setUnjellyableForClass except it uses a
factory instead of creating an instance.
-
|
setUnjellyableForClass(classname,
unjellyable)
Set which local class will represent a remote type.
If you have written a Copyable class that you expect your client to be
receiving, write a local "copy" class to represent it, then
call:
jellier.setUnjellyableForClass('module.package.Class', MyJellier).
Call this at the module level immediately after its class definition.
MyCopier should be a subclass of RemoteCopy.
The classname may be a special tag returned by
'Copyable.getTypeToCopyFor' rather than an actual classname.
This call is also for cached classes, since there will be no overlap.
The rules are the same.
-
|
setUnjellyableForClassTree(module,
baseClass,
prefix=None)
Set all classes in a module derived from baseClass as
copiers for a corresponding remote class.
When you have a heirarchy of Copyable (or Cacheable) classes on one
side, and a mirror structure of Copied (or RemoteCache) classes on the
other, use this to setCopierForClass all your Copieds for the
Copyables.
Each copyTag (the "classname" argument to getTypeToCopyFor,
and what the Copyable's getTypeToCopyFor returns) is formed from adding
a prefix to the Copied's class name. The prefix defaults to
module.__name__. If you wish the copy tag to consist of solely the
classname, pass the empty string ''.
-
- Parameters:
module -
a module object from which to pull the Copied classes. (passing
sys.modules[__name__] might be useful)
baseClass -
the base class from which all your Copied classes derive.
prefix -
the string prefixed to classnames to form the unjellyableRegistry.
|
unjelly(sexp,
taster=<twisted.spread.jelly.DummySecurityOptions instan...,
persistentLoad=None,
invoker=None)
Unserialize from s-expression.
Takes an list that was the result from a call to jelly() and
unserializes an arbitrary object from it. The optional 'taster'
argument, an instance of SecurityOptions, will cause an InsecureJelly
exception to be raised if a disallowed type, module, or class attempted
to unserialize.
-
|
__version__
-
- Type:
-
str
- Value:
|
BooleanType
-
- Type:
-
NoneType
- Value:
|
class_atom
-
- Type:
-
str
- Value:
|
dereference_atom
-
- Type:
-
str
- Value:
|
dictionary_atom
-
- Type:
-
str
- Value:
|
DictTypes
-
- Type:
-
tuple
- Value:
|
function_atom
-
- Type:
-
str
- Value:
|
globalSecurity
-
- Type:
-
SecurityOptions
- Value:
<twisted.spread.jelly.SecurityOptions instance at 0x838d2a4>
|
|
instance_atom
-
- Type:
-
str
- Value:
|
list_atom
-
- Type:
-
str
- Value:
|
module_atom
-
- Type:
-
str
- Value:
|
None_atom
-
- Type:
-
str
- Value:
|
persistent_atom
-
- Type:
-
str
- Value:
|
reference_atom
-
- Type:
-
str
- Value:
|
tuple_atom
-
- Type:
-
str
- Value:
|
unjellyableFactoryRegistry
-
- Type:
-
dict
- Value:
|
unjellyableRegistry
-
- Type:
-
dict
- Value:
{'cached': <function unjellyCached at 0x848b854>,
'lcache': <function unjellyLCache at 0x848b88c>,
'local': <function unjellyLocal at 0x847616c>,
'remote': <class twisted.spread.pb.RemoteReference at 0x844040c>,
'twisted.spread.pb.CopyableFailure': <class twisted.spread.pb.CopiedF\
ailure at 0x8344ec4>,
'twisted.web.server.Request': <class twisted.web.distrib.Request at 0\
x86cfaec>}
|
|
unpersistable_atom
-
- Type:
-
str
- Value:
|