summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/morphloader.py25
-rw-r--r--morphlib/morphloader_tests.py71
2 files changed, 94 insertions, 2 deletions
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py
index 70f46064..c94078f9 100644
--- a/morphlib/morphloader.py
+++ b/morphlib/morphloader.py
@@ -332,8 +332,22 @@ class MorphologyLoader(object):
self._set_stratum_defaults(morphology)
elif kind == 'chunk':
self._set_chunk_defaults(morphology)
- else:
- assert kind == 'cluster'
+
+ def unset_defaults(self, morphology):
+ '''If a field is equal to its default, delete it.
+
+ The morphology is assumed to be valid.
+
+ '''
+
+ kind = morphology['kind']
+ defaults = self._static_defaults[kind]
+ for key in defaults:
+ if key in morphology and morphology[key] == defaults[key]:
+ del morphology[key]
+
+ if kind == 'stratum':
+ self._unset_stratum_defaults(morphology)
def _set_system_defaults(self, morph):
pass
@@ -345,6 +359,13 @@ class MorphologyLoader(object):
if 'morph' not in spec:
spec['morph'] = spec['name']
+ def _unset_stratum_defaults(self, morph):
+ for spec in morph['chunks']:
+ if 'repo' in spec and spec['repo'] == spec['name']:
+ del spec['repo']
+ if 'morph' in spec and spec['morph'] == spec['name']:
+ del spec['morph']
+
def _set_chunk_defaults(self, morph):
if morph['max-jobs'] is not None:
morph['max-jobs'] = int(morph['max-jobs'])
diff --git a/morphlib/morphloader_tests.py b/morphlib/morphloader_tests.py
index 6e957510..ac0fef53 100644
--- a/morphlib/morphloader_tests.py
+++ b/morphlib/morphloader_tests.py
@@ -385,6 +385,20 @@ name: foo
'max-jobs': None,
})
+ def test_unsets_defaults_for_chunks(self):
+ m = morphlib.morph3.Morphology({
+ 'kind': 'chunk',
+ 'name': 'foo',
+ 'build-system': 'manual',
+ })
+ self.loader.unset_defaults(m)
+ self.assertEqual(
+ dict(m),
+ {
+ 'kind': 'chunk',
+ 'name': 'foo',
+ })
+
def test_sets_defaults_for_strata(self):
m = morphlib.morph3.Morphology({
'kind': 'stratum',
@@ -421,6 +435,27 @@ name: foo
],
})
+ def test_unsets_defaults_for_strata(self):
+ test_dict = {
+ 'kind': 'stratum',
+ 'name': 'foo',
+ 'chunks': [
+ {
+ 'name': 'bar',
+ "ref": "bar",
+ 'build-mode': 'bootstrap',
+ 'build-depends': [],
+ },
+ ],
+ }
+ test_dict_with_build_depends = dict(test_dict)
+ test_dict_with_build_depends["build-depends"] = []
+ m = morphlib.morph3.Morphology(test_dict_with_build_depends)
+ self.loader.unset_defaults(m)
+ self.assertEqual(
+ dict(m),
+ test_dict)
+
def test_sets_defaults_for_system(self):
m = morphlib.morph3.Morphology({
'kind': 'system',
@@ -442,6 +477,22 @@ name: foo
'disk-size': '1G',
})
+ def test_unsets_defaults_for_system(self):
+ m = morphlib.morph3.Morphology({
+ 'kind': 'system',
+ 'name': 'foo',
+ 'arch': 'x86_64',
+ 'strata': [],
+ })
+ self.loader.unset_defaults(m)
+ self.assertEqual(
+ dict(m),
+ {
+ 'kind': 'system',
+ 'name': 'foo',
+ 'arch': 'x86_64',
+ })
+
def test_sets_stratum_chunks_repo_and_morph_from_name(self):
m = morphlib.morph3.Morphology(
{
@@ -461,6 +512,26 @@ name: foo
self.assertEqual(m['chunks'][0]['repo'], 'le-chunk')
self.assertEqual(m['chunks'][0]['morph'], 'le-chunk')
+ def test_collapses_stratum_chunks_repo_and_morph_from_name(self):
+ m = morphlib.morph3.Morphology(
+ {
+ "name": "foo",
+ "kind": "stratum",
+ "chunks": [
+ {
+ "name": "le-chunk",
+ "repo": "le-chunk",
+ "morph": "le-chunk",
+ "ref": "ref",
+ "build-depends": [],
+ }
+ ]
+ })
+
+ self.loader.unset_defaults(m)
+ self.assertTrue('repo' not in m['chunks'][0])
+ self.assertTrue('morph' not in m['chunks'][0])
+
def test_convertes_max_jobs_to_an_integer(self):
m = morphlib.morph3.Morphology(
{