summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/morph2.py59
-rw-r--r--morphlib/morph2_tests.py32
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