]> code.communitydata.science - rises_declines_wikia_code.git/blob - mediawiki_dump_tools/Mediawiki-Utilities/mw/types/serializable.py
Initial commit
[rises_declines_wikia_code.git] / mediawiki_dump_tools / Mediawiki-Utilities / mw / types / serializable.py
1 from itertools import chain
2
3
4 class Type:
5     def __eq__(self, other):
6         if other is None:
7             return False
8         try:
9             for key in self.keys():
10                 if getattr(self, key) != getattr(other, key):
11                     return False
12
13             return True
14         except KeyError:
15             return False
16
17     def __neq__(self, other):
18         return not self.__eq__(other)
19
20     def __str__(self):
21         return self.__repr__()
22
23     def __repr__(self):
24         return "%s(%s)" % (
25             self.__class__.__name__,
26             ", ".join(
27                 "%s=%r" % (k, v) for k, v in self.items()
28             )
29         )
30
31     def items(self):
32         for key in self.keys():
33             yield key, getattr(self, key)
34
35     def keys(self):
36         return (
37             key for key in
38             chain(getattr(self, "__slots__", []), self.__dict__.keys())
39             if key[:2] != "__"
40         )
41
42     def serialize(self):
43         return dict(
44             (k, self._serialize(v))
45             for k, v in self.items()
46         )
47
48     def _serialize(self, value):
49         if hasattr(value, "serialize"):
50             return value.serialize()
51         else:
52             return value
53
54     @classmethod
55     def deserialize(cls, doc_or_instance):
56         if isinstance(doc_or_instance, cls):
57             return doc_or_instance
58         else:
59             return cls(**doc_or_instance)
60
61
62 class Dict(dict, Type):
63     def serialize(self):
64         return {k: self._serialize(v) for k, v in self.items()}
65
66     @staticmethod
67     def deserialize(d, value_deserializer=lambda v: v):
68         if isinstance(d, Dict):
69             return d
70         else:
71             return Dict((k, value_deserializer(v)) for k, v in d.items())
72
73
74 class Set(set, Type):
75     def serialize(self):
76         return [self._serialize(v) for v in self]
77
78     @staticmethod
79     def deserialize(s, value_deserializer=lambda v: v):
80
81         if isinstance(s, Set):
82             return s
83         else:
84             return Set(value_deserializer(v) for v in s)
85
86
87 class List(list, Type):
88     def serialize(self):
89         return list(self._serialize(v) for v in self)
90
91     @staticmethod
92     def deserialize(l, value_deserializer=lambda v: v):
93
94         if isinstance(l, List):
95             return l
96         else:
97             return List(value_deserializer(v) for v in l)

Community Data Science Collective || Want to submit a patch?