Skip to content

Commit

Permalink
Autovification.cast_dicts add 'to' parameter
Browse files Browse the repository at this point in the history
* tests
  • Loading branch information
Ente committed Jan 31, 2018
1 parent 08c2a3f commit c92f263
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 6 deletions.
10 changes: 6 additions & 4 deletions pdml2flow/autovivification.py
Expand Up @@ -42,14 +42,16 @@ def compress(self, d=DEFAULT):
return {k: v for k, v in ((k, self.compress(v)) for k, v in d.items())}
return d

def cast_dicts(self, d=DEFAULT):
"""Returns a copy of d with all dicts casted to type(self). """
def cast_dicts(self, to=DEFAULT, d=DEFAULT):
"""Returns a copy of d with all dicts casted to the type 'to'."""
if to is DEFAULT:
to = type(self)
if d is DEFAULT:
d = self
if isinstance(d, list):
return [v for v in (self.cast_dicts(v) for v in d)]
return [v for v in (self.cast_dicts(to, v) for v in d)]
elif isinstance(d, dict):
return type(self)({k: v for k, v in ((k, self.cast_dicts(v)) for k, v in d.items())})
return to({k: v for k, v in ((k, self.cast_dicts(to, v)) for k, v in d.items())})
return d

def merge(self, b, a=DEFAULT):
Expand Down
4 changes: 2 additions & 2 deletions pdml2flow/flow.py
Expand Up @@ -34,7 +34,7 @@ def __init__(self, first_frame):

# call plugins
for plugin in Conf.PLUGINS:
plugin.flow_new(self, first_frame)
plugin.flow_new(self, first_frame.cast_dicts(dict))

self.add_frame(first_frame)

Expand Down Expand Up @@ -82,7 +82,7 @@ def add_frame(self, frame):
debug('flow duration: {}'.format(self.__newest_frame_time - self.__first_frame_time))

for plugin in Conf.PLUGINS:
plugin.frame_new(frame, self)
plugin.frame_new(frame.cast_dicts(dict), self)

def not_expired(self):
return self.__newest_frame_time > (Flow.newest_overall_frame_time - Conf.FLOW_BUFFER_TIME)
Expand Down
102 changes: 102 additions & 0 deletions test/autovivification_test.py
Expand Up @@ -210,6 +210,108 @@ def test_cast_dicts(self):
#self.assertEqual(type(a[10][0]), NoneType)
#self.assertEqual(type(a[10][1]), NoneType)

def test_cast_dicts_to_dicts(self):
a = AutoVivification({
0: [0, 0],
1: [1, 1],
2: [0, 1, 0, 1],
3: {0: [0, 0], 1: [1, 1]},
4: [[0, 1], [0, 1], [0, 1], [0, 1]],
5: {0: {0: [0, 0], 1: [1, 1]}, 1: {0: [0, 0], 1: [1, 1]}},
6: ['string', 'string'],
7: [True, True],
8: [False, False],
9: [0.1, 0.1],
10: [None, None],
11: AutoVivification({0: [0, 0], 1: [1, 1]}),
12: AutoVivification({0: AutoVivification({0: 0}), 1: AutoVivification({1: 1})}),
}).cast_dicts(to=dict)
self.assertEqual(type(a), dict)

self.assertEqual(type(a[0]), list)
self.assertEqual(type(a[0][0]), int)
self.assertEqual(type(a[0][1]), int)

self.assertEqual(type(a[1]), list)
self.assertEqual(type(a[1][0]), int)
self.assertEqual(type(a[1][1]), int)

self.assertEqual(type(a[2]), list)
self.assertEqual(type(a[2][0]), int)
self.assertEqual(type(a[2][1]), int)
self.assertEqual(type(a[2][2]), int)
self.assertEqual(type(a[2][3]), int)

self.assertEqual(type(a[3]), dict)
self.assertEqual(type(a[3][0]), list)
self.assertEqual(type(a[3][0][0]), int)
self.assertEqual(type(a[3][0][1]), int)
self.assertEqual(type(a[3][1]), list)
self.assertEqual(type(a[3][1][0]), int)
self.assertEqual(type(a[3][1][1]), int)

self.assertEqual(type(a[4]), list)
self.assertEqual(type(a[4][0]), list)
self.assertEqual(type(a[4][0][0]), int)
self.assertEqual(type(a[4][0][1]), int)
self.assertEqual(type(a[4][1]), list)
self.assertEqual(type(a[4][1][0]), int)
self.assertEqual(type(a[4][1][1]), int)
self.assertEqual(type(a[4][2]), list)
self.assertEqual(type(a[4][2][0]), int)
self.assertEqual(type(a[4][2][1]), int)
self.assertEqual(type(a[4][3]), list)
self.assertEqual(type(a[4][3][0]), int)
self.assertEqual(type(a[4][3][1]), int)

self.assertEqual(type(a[5]), dict)
self.assertEqual(type(a[5][0]), dict)
self.assertEqual(type(a[5][0][0]), list)
self.assertEqual(type(a[5][0][0][0]), int)
self.assertEqual(type(a[5][0][0][1]), int)
self.assertEqual(type(a[5][0][1][0]), int)
self.assertEqual(type(a[5][0][1][1]), int)
self.assertEqual(type(a[5][1]), dict)
self.assertEqual(type(a[5][1][0]), list)
self.assertEqual(type(a[5][1][0][0]), int)
self.assertEqual(type(a[5][1][0][1]), int)
self.assertEqual(type(a[5][1][1][0]), int)
self.assertEqual(type(a[5][1][1][1]), int)

self.assertEqual(type(a[6]), list)
self.assertEqual(type(a[6][0]), str)
self.assertEqual(type(a[6][1]), str)

self.assertEqual(type(a[7]), list)
self.assertEqual(type(a[7][0]), bool)
self.assertEqual(type(a[7][1]), bool)

self.assertEqual(type(a[8]), list)
self.assertEqual(type(a[8][0]), bool)
self.assertEqual(type(a[8][1]), bool)

self.assertEqual(type(a[9]), list)
self.assertEqual(type(a[9][0]), float)
self.assertEqual(type(a[9][1]), float)

self.assertEqual(type(a[10]), list)
#self.assertEqual(type(a[10][0]), NoneType)
#self.assertEqual(type(a[10][1]), NoneType)

self.assertEqual(type(a[11]), dict)
self.assertEqual(type(a[11][0]), list)
self.assertEqual(type(a[11][0][0]), int)
self.assertEqual(type(a[11][0][1]), int)
self.assertEqual(type(a[11][1]), list)
self.assertEqual(type(a[11][1][0]), int)
self.assertEqual(type(a[11][1][1]), int)

self.assertEqual(type(a[12]), dict)
self.assertEqual(type(a[12][0]), dict)
self.assertEqual(type(a[12][0][0]), int)
self.assertEqual(type(a[12][1]), dict)
self.assertEqual(type(a[12][1][1]), int)

def test_merge(self):
self.assertEqual(
AutoVivification({
Expand Down

0 comments on commit c92f263

Please sign in to comment.