From 8229cfb750223a7f98229300396cec96fa31ae4f Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Fri, 26 Sep 2014 17:10:47 +0100 Subject: Serialise morphologies in a new way --- distbuild/serialise.py | 45 ++++++--------------------------------- distbuild/serialise_tests.py | 50 ++++++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 69 deletions(-) diff --git a/distbuild/serialise.py b/distbuild/serialise.py index 9b38c84f..4c3dfb31 100644 --- a/distbuild/serialise.py +++ b/distbuild/serialise.py @@ -22,22 +22,12 @@ import morphlib import logging -morphology_attributes = [ - 'needs_artifact_metadata_cached', -] - - def serialise_artifact(artifact): '''Serialise an Artifact object and its dependencies into string form.''' def encode_morphology(morphology): - result = {} - for key in morphology.keys(): - result[key] = morphology[key] - for x in morphology_attributes: - result['__%s' % x] = getattr(morphology, x) - return result - + return morphology.data + def encode_source(source, artifacts): source_dic = { 'name': source.name, @@ -119,30 +109,7 @@ def deserialise_artifact(encoded): ''' def decode_morphology(le_dict): - '''Convert a dict into something that kinda acts like a Morphology. - - As it happens, we don't need the full Morphology so we cheat. - Cheating is good. - - ''' - - class FakeMorphology(dict): - - def get_commands(self, which): - '''Get commands to run from a morphology or build system''' - if self[which] is None: - attr = '_'.join(which.split('-')) - bs = morphlib.buildsystem.lookup_build_system( - self['build-system']) - return getattr(bs, attr) - else: - return self[which] - - morphology = FakeMorphology(le_dict) - for x in morphology_attributes: - setattr(morphology, x, le_dict['__%s' % x]) - del morphology['__%s' % x] - return morphology + return morphlib.morphology.Morphology(le_dict) def decode_source(le_dict): '''Convert a dict into a Source object. @@ -167,8 +134,8 @@ def deserialise_artifact(encoded): break else: raise ValueError( - "Didn't find source %s in %s sources generated for %s." % - le_dict['name']. len(sources), le_dict['filename']) + "Didn't find source %s for %s." % (le_dict['name'], + le_dict['filename'])) source.cache_id = le_dict['cache_id'] source.cache_key = le_dict['cache_key'] @@ -215,7 +182,7 @@ def deserialise_artifact(encoded): key = artifacts[artifact_id].name sources[source_id].artifacts[key] = artifacts[artifact_id] - sources[source_id].dependencies = [artifacts[aid] for aid in + sources[source_id].dependencies = [artifacts_dict[aid] for aid in source_dict['dependencies']] return artifacts[artifacts_dict['_root']] diff --git a/distbuild/serialise_tests.py b/distbuild/serialise_tests.py index 8e0a9413..db32a7cf 100644 --- a/distbuild/serialise_tests.py +++ b/distbuild/serialise_tests.py @@ -22,21 +22,16 @@ import distbuild import morphlib -class MockMorphology(object): - - def __init__(self, name, kind): - self.dict = { - 'name': name, - 'kind': kind, - } - self.needs_staging_area = None - self.needs_artifact_metadata_cached = None - - def keys(self): - return self.dict.keys() - - def __getitem__(self, key): - return self.dict[key] +def make_morphology(name, kind): + m = morphlib.morphology.Morphology({ + 'name': name, + 'kind': kind, + }) + if kind == 'system': + m['strata'] = [] + loader = morphlib.morphloader.MorphologyLoader() + loader.set_defaults(m) + return m class MockSource(object): @@ -48,7 +43,7 @@ class MockSource(object): self.original_ref = '%s.source.original_ref' % name self.sha1 = '%s.source.sha1' % name self.tree = '%s.source.tree' % name - self.morphology = MockMorphology(name, kind) + self.morphology = make_morphology(name, kind) self.filename = '%s.source.filename' % name self.cache_id = { 'blip': '%s.blip' % name, @@ -63,7 +58,7 @@ class MockSource(object): -def mock_artifact(name, kind): +def make_artifact(name, kind): source = MockSource(name, kind) artifact = morphlib.artifact.Artifact(source, name) source.artifacts = {name: artifact} @@ -73,10 +68,10 @@ def mock_artifact(name, kind): class SerialisationTests(unittest.TestCase): def setUp(self): - self.art1 = mock_artifact('name1', 'chunk') - self.art2 = mock_artifact('name2', 'chunk') - self.art3 = mock_artifact('name3', 'stratum') - self.art4 = mock_artifact('name4', 'system') + self.art1 = make_artifact('name1', 'chunk') + self.art2 = make_artifact('name2', 'chunk') + self.art3 = make_artifact('name3', 'stratum') + self.art4 = make_artifact('name4', 'system') def assertEqualMorphologies(self, a, b): self.assertEqual(sorted(a.keys()), sorted(b.keys())) @@ -84,11 +79,6 @@ class SerialisationTests(unittest.TestCase): a_values = [a[k] for k in keys] b_values = [b[k] for k in keys] self.assertEqual(a_values, b_values) - self.assertEqual(a.needs_staging_area, b.needs_staging_area) - self.assertEqual(a.needs_artifact_metadata_cached, - b.needs_artifact_metadata_cached) - self.assertEqual(a.needs_staging_area, - b.needs_staging_area) def assertEqualSources(self, a, b): self.assertEqual(a.repo, b.repo) @@ -102,8 +92,8 @@ class SerialisationTests(unittest.TestCase): def assertEqualArtifacts(self, a, b): self.assertEqualSources(a.source, b.source) self.assertEqual(a.name, b.name) - self.assertEqual(a.cache_id, b.cache_id) - self.assertEqual(a.cache_key, b.cache_key) + self.assertEqual(a.source.cache_id, b.source.cache_id) + self.assertEqual(a.source.cache_key, b.source.cache_key) self.assertEqual(len(a.source.dependencies), len(b.source.dependencies)) for i in range(len(a.source.dependencies)): @@ -116,7 +106,7 @@ class SerialisationTests(unittest.TestCase): self.assertEqualArtifacts(artifact, decoded) def key(a): - return a.cache_key + return a.source.cache_key objs = {} queue = [decoded] @@ -127,7 +117,7 @@ class SerialisationTests(unittest.TestCase): self.assertTrue(obj is objs[k]) else: objs[k] = obj - queue.extend(obj.dependencies) + queue.extend(obj.source.dependencies) def test_returns_string(self): encoded = distbuild.serialise_artifact(self.art1) -- cgit v1.2.1