From aa1ae3333d723b7bf91beab4f357c1cb99ecf742 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Thu, 17 May 2012 14:55:47 +0000 Subject: CacheKeyComputer: re-use dict hash logic for morphology hashing CacheKeyComputer already re-invents the wheel for hashing a dict, so re-use that logic rather than re-implement it as creating a huge string. --- morphlib/cachekeycomputer.py | 19 ++----------------- morphlib/cachekeycomputer_tests.py | 13 ------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/morphlib/cachekeycomputer.py b/morphlib/cachekeycomputer.py index 6ae2b107..e8cbed2c 100644 --- a/morphlib/cachekeycomputer.py +++ b/morphlib/cachekeycomputer.py @@ -91,24 +91,9 @@ class CacheKeyComputer(object): elif kind in ('system', 'stratum'): morphology = artifact.source.morphology le_dict = dict((k,morphology[k]) for k in morphology.keys()) - checksum = hashlib.sha1(self._stringify(le_dict)) + checksum = hashlib.sha1() + self._hash_thing(checksum, le_dict) keys['morphology-sha1'] = checksum.hexdigest() return keys - def _stringify(self, value): - if type(value) in [str, unicode, int]: - return str(value) - elif value is None: - return '' - elif type(value) is list: - return '[' + ','.join(self._stringify(x) for x in value) + ']' - elif type(value) is dict: - keys = value.keys() - keys.sort(key=lambda s: [ord(c) for c in s]) - pairs = ['%s:%s' % (self._stringify(k), self._stringify(value[k])) - for k in keys] - return '{' + ','.join(pairs) + '}' - else: # pragma: no cover - raise NotImplementedError( - 'type %s is not stringified' % type(value)) diff --git a/morphlib/cachekeycomputer_tests.py b/morphlib/cachekeycomputer_tests.py index 32aef02e..807fbe89 100644 --- a/morphlib/cachekeycomputer_tests.py +++ b/morphlib/cachekeycomputer_tests.py @@ -166,17 +166,4 @@ class CacheKeyComputerTests(unittest.TestCase): old_sha = self.ckc.compute_key(old_artifact) new_sha = self.ckc.compute_key(new_artifact) self.assertEqual(old_sha, new_sha) - - def test_stringifies_string(self): - self.assertEqual(self.ckc._stringify('foo'), 'foo') - - def test_stringifies_integer(self): - self.assertEqual(self.ckc._stringify(12765), '12765') - - def test_stringifies_dict(self): - self.assertEqual(self.ckc._stringify({'foo': 'bar', 'yo': 'foobar' }), - '{foo:bar,yo:foobar}') - - def test_stringifies_list(self): - self.assertEqual(self.ckc._stringify(['foo', 'bar']), '[foo,bar]') -- cgit v1.2.1