diff options
author | Jannis Pohlmann <jannis.pohlmann@codethink.co.uk> | 2012-09-04 15:52:07 +0000 |
---|---|---|
committer | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2012-09-04 16:59:09 +0100 |
commit | 99e80f647f9ef1c17da203342d932fb5ffc440ee (patch) | |
tree | bb8cb9a6b377653193d0ea45b9224a5c49c3814b /morphlib | |
parent | a0ba0157c77bc3230f9de2b58d3a3fb40db0ab76 (diff) | |
download | morph-99e80f647f9ef1c17da203342d932fb5ffc440ee.tar.gz |
Rework morphology child lookup to be more useful for branch/merge
In order to modify morphologies in place and then write them back to
disk in system branches (e.g. when running "morph edit"), we need to
have access to the dicts that store references to strata in system
morphologies and chunks in stratum morphologies, respectively.
Therefor, the previous triplet-returning child lookup is replaced
with a new internal method to ensure uniqueness of names in
morphologies and a new method to lookup children in this commit.
The unit tests are adjusted to cover everything in appropriate ways.
Diffstat (limited to 'morphlib')
-rw-r--r-- | morphlib/morph2.py | 59 | ||||
-rw-r--r-- | morphlib/morph2_tests.py | 32 |
2 files changed, 61 insertions, 30 deletions
diff --git a/morphlib/morph2.py b/morphlib/morph2.py index ffb05660..a707030d 100644 --- a/morphlib/morph2.py +++ b/morphlib/morph2.py @@ -44,7 +44,7 @@ class Morphology(object): def __init__(self, text): self._dict = json.loads(text) self._set_defaults() - self._create_child_index() + self._validate_children() def __getitem__(self, key): return self._dict[key] @@ -55,10 +55,40 @@ class Morphology(object): def keys(self): return self._dict.keys() - def lookup_morphology_by_name(self, name): - '''Find child morphology by its morphology name, honouring aliases - defined within this stratum.''' - return self._child_dict[name] + def _validate_children(self): + if self['kind'] == 'system': + names = set() + for info in self['strata']: + name = info.get('alias', info['morph']) + if name in names: + raise ValueError('Duplicate stratum "%s"' % name) + names.add(name) + elif self['kind'] == 'stratum': + names = set() + for info in self['chunks']: + name = info.get('alias', info['name']) + if name in names: + raise ValueError('Duplicate chunk "%s"' % name) + names.add(name) + + def lookup_child_by_name(self, name): + '''Find child reference by its name. + + This lookup honors aliases. + + ''' + + if self['kind'] == 'system': + for info in self['strata']: + source_name = info.get('alias', info['morph']) + if source_name == name: + return info + elif self['kind'] == 'stratum': + for info in self['chunks']: + source_name = info.get('alias', info['name']) + if source_name == name: + return info + raise KeyError('"%s" not found' % name) def _set_defaults(self): if 'max-jobs' in self: @@ -92,22 +122,3 @@ class Morphology(object): source['morph'] = source['name'] if 'build-depends' not in source: source['build-depends'] = None - - def _get_valid_triple(self, info): - return (info['repo'], info['ref'], "%s.morph" % info['morph']) - - def _create_child_index(self): - self._child_dict = {} - if self['kind'] == 'system': - for info in self['strata']: - source_name = info.get('alias', info['morph']) - if source_name in self._child_dict: - raise ValueError("duplicate stratum name: " + source_name) - self._child_dict[source_name] = self._get_valid_triple(info) - elif self['kind'] == 'stratum': - for info in self['chunks']: - # FIXME: in the future, chunks will have an 'alias' field too - source_name = info['name'] - if source_name in self._child_dict: - raise ValueError("duplicate chunk name: " + source_name) - self._child_dict[source_name] = self._get_valid_triple(info) diff --git a/morphlib/morph2_tests.py b/morphlib/morph2_tests.py index afa55769..60917537 100644 --- a/morphlib/morph2_tests.py +++ b/morphlib/morph2_tests.py @@ -101,10 +101,11 @@ class MorphologyTests(unittest.TestCase): ] } ''') - self.assertEqual(m.lookup_morphology_by_name("stratum1"), - ("repo", "ref", "stratum1.morph")) - self.assertEqual(m.lookup_morphology_by_name("aliased-stratum"), - ("repo", "ref", "stratum2.morph")) + self.assertEqual(m.lookup_child_by_name('stratum1'), + {'morph': 'stratum1', 'repo': 'repo', 'ref': 'ref' }) + self.assertEqual(m.lookup_child_by_name('aliased-stratum'), + {'alias': 'aliased-stratum', 'morph': 'stratum2', + 'repo': 'repo', 'ref': 'ref'}) def test_stratum_indexes_chunks(self): m = Morphology(''' @@ -119,8 +120,27 @@ class MorphologyTests(unittest.TestCase): ] } ''') - self.assertEqual(m.lookup_morphology_by_name("chunk"), - ("repo", "ref", "chunk.morph")) + + child = m.lookup_child_by_name('chunk') + self.assertEqual(child['name'], 'chunk') + self.assertEqual(child['repo'], 'repo') + self.assertEqual(child['ref'], 'ref') + + def test_raises_error_when_child_lookup_fails(self): + m = Morphology(''' + { + "kind": "stratum", + "chunks": [ + { + "name": "chunk", + "repo": "repo", + "ref": "ref" + } + ] + } + ''') + + self.assertRaises(KeyError, m.lookup_child_by_name, 'foo') ## Validation tests |