diff --git a/pdml2flow/autovivification.py b/pdml2flow/autovivification.py index 9f8842b..4bc4027 100644 --- a/pdml2flow/autovivification.py +++ b/pdml2flow/autovivification.py @@ -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): diff --git a/pdml2flow/flow.py b/pdml2flow/flow.py index 7c6b340..a5d704b 100644 --- a/pdml2flow/flow.py +++ b/pdml2flow/flow.py @@ -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) @@ -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) diff --git a/test/autovivification_test.py b/test/autovivification_test.py index 47df088..0f78255 100755 --- a/test/autovivification_test.py +++ b/test/autovivification_test.py @@ -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({