diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2014-02-18 10:17:38 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2014-02-18 10:17:38 +0000 |
commit | 2dd6635be7cb3f07b818eeec45e64a0b795d4e87 (patch) | |
tree | afd4740cb7e114e935ba987e164dff7dcdc4a59a /morphlib/morphloader.py | |
parent | a859a3377f488ef11ebed2631dbd51b2aa82afe4 (diff) | |
parent | ed0385399dbd3cfffb9af5838456efbb9183bd48 (diff) | |
download | morph-2dd6635be7cb3f07b818eeec45e64a0b795d4e87.tar.gz |
Merge branch 'baserock/richardmaw/S10407/field-order'
Reviewed-by: Lars Wirzenius
Diffstat (limited to 'morphlib/morphloader.py')
-rw-r--r-- | morphlib/morphloader.py | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py index e4367fa1..cd005fae 100644 --- a/morphlib/morphloader.py +++ b/morphlib/morphloader.py @@ -205,6 +205,61 @@ class MultipleValidationErrors(morphlib.Error): self.msg += ('\t' + str(error)) +class OrderedDumper(yaml.SafeDumper): + keyorder = ( + 'name', + 'kind', + 'description', + 'arch', + 'strata', + 'configuration-extensions', + 'morph', + 'repo', + 'ref', + 'unpetrify-ref', + 'build-depends', + 'build-mode', + 'artifacts', + 'max-jobs', + 'products', + 'chunks', + 'build-system', + 'pre-configure-commands', + 'configure-commands', + 'post-configure-commands', + 'pre-build-commands', + 'build-commands', + 'post-build-commands', + 'pre-install-commands', + 'install-commands', + 'post-install-commands', + 'artifact', + 'include', + 'systems', + 'deploy', + 'type', + 'location', + ) + + @classmethod + def _iter_in_global_order(cls, mapping): + for key in cls.keyorder: + if key in mapping: + yield key, mapping[key] + for key in sorted(mapping.iterkeys()): + if key not in cls.keyorder: + yield key, mapping[key] + + @classmethod + def _represent_dict(cls, dumper, mapping): + return dumper.represent_mapping('tag:yaml.org,2002:map', + cls._iter_in_global_order(mapping)) + + def __init__(self, *args, **kwargs): + yaml.SafeDumper.__init__(self, *args, **kwargs) + self.add_representer(dict, self._represent_dict) + + class MorphologyLoader(object): '''Load morphologies from disk, or save them back to disk.''' @@ -324,7 +379,8 @@ class MorphologyLoader(object): def save_to_string(self, morphology): '''Return normalised textual form of morphology.''' - return yaml.safe_dump(morphology.data, default_flow_style=False) + return yaml.dump(morphology.data, Dumper=OrderedDumper, + default_flow_style=False) def save_to_file(self, filename, morphology): '''Save a morphology object to a named file.''' |