diff options
Diffstat (limited to 'morphlib/morph2.py')
-rw-r--r-- | morphlib/morph2.py | 59 |
1 files changed, 35 insertions, 24 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) |