annotate gamelib/serializer.py @ 553:7963fc09fac2

Make checkdialog take strings to show as input. Add possiblity of 3rd button on dialog
author Neil Muller <drnlmuller@gmail.com>
date Sat, 28 Nov 2009 17:45:28 +0000
parents 03be16420e8b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2 Interface for converting objects to and from simple structures: lists, dicts,
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 strings, integers and combinations there of. Used for sending objects over
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4 the communications API.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
7 REGISTERED_CLASSES = {}
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
9 def simplify(item, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 """Convert an item to a simple data structure."""
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
11 if refs is None:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
12 refs = set()
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
13
450
5d74d0e4a4cc Switch to XML (RPC) for save game encoding.
Simon Cross <hodgestar@gmail.com>
parents: 439
diff changeset
14 refid = str(id(item))
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
15
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
16 if refid in refs:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
17 return { 'byref': refid }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
18
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19 if issubclass(type(item), Simplifiable):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
20 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
21 value = item.simplify(refs)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
22 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23 elif type(item) is list:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
24 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
25 value = { 'list': [simplify(x, refs) for x in item] }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
26 value['refid'] = refid
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
27 elif type(item) is set:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
28 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
29 value = { 'set': [simplify(x, refs) for x in item] }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
30 value['refid'] = refid
543
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
31 elif type(item) is dict:
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
32 refs.add(refid)
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
33 value = { 'dict': [(simplify(k, refs), simplify(v, refs)) for k, v in item.iteritems()] }
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
34 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35 elif type(item) is tuple:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
36 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
37 value = { 'tuple': tuple([simplify(x, refs) for x in item]) }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
38 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
39 elif item is None:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
40 value = { 'none': '' }
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41 else:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
42 value = { 'raw': item }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
43
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
44 return value
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
46 def unsimplify(value, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
47 """Reverse the simplify process."""
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
48 if refs is None:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
49 refs = {}
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
50
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
51 if 'refid' in value:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
52 refid = value['refid']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
53
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 if value.has_key('class'):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
55 cls = REGISTERED_CLASSES[value['class']]
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
56 item = cls.unsimplify(value, refs)
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
57 elif value.has_key('list'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
58 item = []
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
59 refs[refid] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
60 item.extend(unsimplify(x, refs) for x in value['list'])
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
61 elif value.has_key('set'):
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
62 item = set()
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
63 refs[refid] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
64 item.update(unsimplify(x, refs) for x in value['set'])
543
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
65 elif value.has_key('dict'):
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
66 item = {}
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
67 refs[refid] = item
03be16420e8b Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents: 505
diff changeset
68 item.update(dict((unsimplify(k, refs), unsimplify(v, refs)) for k, v in value['dict']))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
69 elif value.has_key('tuple'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
70 item = tuple([unsimplify(x, refs) for x in value['tuple']])
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
71 elif value.has_key('none'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
72 item = None
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
73 elif value.has_key('raw'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
74 item = value['raw']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
75 elif value.has_key('byref'):
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
76 refid = value['byref']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
77 if refid in refs:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
78 item = refs[refid]
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
79 else:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
80 raise SimplifyError("Unknown refid %r in byref." % (refid,))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
81 else:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
82 raise SimplifyError("Unknown unsimplify type key.")
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
83
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
84 if 'refid' in value:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
85 refs[value['refid']] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
86
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
87 return item
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
88
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
89 class SimplifyError(Exception):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
90 pass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
92 class SimplifiableMetaclass(type):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
93 def __init__(cls, name, bases, dct):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
94 super(SimplifiableMetaclass, cls).__init__(name, bases, dct)
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
95 REGISTERED_CLASSES[cls.__name__] = cls
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
96
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
97 class Simplifiable(object):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
98 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
99 Object which can be simplified() and unsimplified() (i.e.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
100 converted to a data type which, for example, Python's XMLRPC
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
101 or json module is capable of handling). Each subclass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
102 must provide SIMPLIFY (a list of strings giving the names
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
103 of attributes which should be stored) unless a parent class
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
104 provides the right thing.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
105 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
106 __metaclass__ = SimplifiableMetaclass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
107
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
108 # List of attributes which need to be stored and restored
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
109 SIMPLIFY = []
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
110
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 467
diff changeset
111 @classmethod
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
112 def make(cls):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
113 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
114 Create an object of this class without any attributes set.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
115 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
116 return cls.__new__(cls)
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
117
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 467
diff changeset
118 @classmethod
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
119 def unsimplify(cls, value, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
120 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
121 Create an object of this class (or a sub-class) from its
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
122 simplification.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
123 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
124 actual_cls = REGISTERED_CLASSES[value['class']]
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
125 attrs = value['attributes']
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
126
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
127 if not issubclass(actual_cls, cls):
467
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
128 raise SimplifyError("Actual class (%r) not a subclass of"
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
129 " this class (%r)" % (actual_cls, cls))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
130
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
131 if not len(attrs) == len(actual_cls.SIMPLIFY):
467
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
132 raise SimplifyError("Wrong number of attributes for this"
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
133 " class (%r)" % (actual_cls,))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
134
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
135 obj = actual_cls.make()
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
136 refs[value['refid']] = obj
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
137
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
138 for attr, value in zip(actual_cls.SIMPLIFY, attrs):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
139 setattr(obj, attr, unsimplify(value, refs))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
140
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
141 return obj
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
142
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
143 def simplify(self, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
144 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
145 Create a simplified version (tar) of the object.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
146 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
147 value = {}
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
148 value['class'] = self.__class__.__name__
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
149
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
150 attrs = []
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
151 for attr in self.SIMPLIFY:
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
152 o = getattr(self, attr)
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
153 attrs.append(simplify(o, refs))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
154
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
155 value['attributes'] = attrs
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
156 return value
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
157
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
158 def copy(self):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
159 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
160 Return a copy of the object.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
161 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
162 return self.__class__.unsimplify(self.simplify())