tests: added extra tests for perm origin dicts and serialization problems
This commit is contained in:
parent
aab457fdca
commit
a0f3d48424
1 changed files with 72 additions and 0 deletions
72
test_special_dict.py
Normal file
72
test_special_dict.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
import collections
|
||||
|
||||
|
||||
class PermOriginDict(dict):
|
||||
"""
|
||||
A special dict used for tracking permissions along with their origins.
|
||||
|
||||
`__setitem__` has been overridden to expect a tuple(perm, origin)
|
||||
`__getitem__` will return only the perm
|
||||
`.perm_origin_stack` will return the stack of (perm, origin) set per key
|
||||
|
||||
>>> perms = PermOriginDict()
|
||||
>>> perms['resource'] = 'read', 'default', 1
|
||||
>>> perms['resource']
|
||||
'read'
|
||||
>>> perms['resource'] = 'write', 'admin', 2
|
||||
>>> perms['resource']
|
||||
'write'
|
||||
>>> perms.perm_origin_stack
|
||||
{'resource': [('read', 'default', 1), ('write', 'admin', 2)]}
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kw):
|
||||
dict.__init__(self, *args, **kw)
|
||||
super(PermOriginDict, self).__setattr__('perm_origin_stack', collections.OrderedDict())
|
||||
|
||||
def __setitem__(self, key, perm_origin_obj_id):
|
||||
print(f"setting: {perm_origin_obj_id}")
|
||||
if isinstance(perm_origin_obj_id, tuple):
|
||||
(perm, origin, obj_id) = perm_origin_obj_id
|
||||
self.perm_origin_stack.setdefault(key, []).append((perm, origin, obj_id))
|
||||
else:
|
||||
perm = perm_origin_obj_id
|
||||
dict.__setitem__(self, key, perm)
|
||||
|
||||
# def __getstate__(self):
|
||||
# dict_state = self.__dict__.copy()
|
||||
# perm_origin_stack = self.perm_origin_stack.__dict__.copy()
|
||||
# print(dict_state, perm_origin_stack)
|
||||
# return dict_state, perm_origin_stack
|
||||
#
|
||||
# def __setstate__(self, state):
|
||||
# print('setstate called')
|
||||
# print(f'setstate os {state}')
|
||||
# self.perm_origin_stack = collections.OrderedDict()
|
||||
|
||||
|
||||
dd = PermOriginDict()
|
||||
|
||||
dd['key1'] = 'perm1', 'from_where1', 121
|
||||
dd['key2'] = 'perm2', 'from_where2', 122
|
||||
dd['key3'] = 'perm3', 'from_where3', 123
|
||||
dd['key3'] = 'perm4', 'from_where4', 125
|
||||
|
||||
|
||||
print(list(dd.keys()))
|
||||
print(f"key:{dd['key1']}")
|
||||
print(dd.perm_origin_stack)
|
||||
|
||||
print ('-- before pickle --')
|
||||
|
||||
import pickle
|
||||
|
||||
data = pickle.dumps(dd, protocol=pickle.HIGHEST_PROTOCOL)
|
||||
print(data)
|
||||
|
||||
new_dd = pickle.loads(data)
|
||||
|
||||
print ('-- after pickle --')
|
||||
print(list(dd.keys()))
|
||||
print(f"key:{dd['key1']}")
|
||||
print(dd.perm_origin_stack)
|
||||
Loading…
Add table
Add a link
Reference in a new issue