From c159aeb69e976aa78c2ce29a6808abaa83ef02ae Mon Sep 17 00:00:00 2001 From: Nils Philippsen Date: Apr 20 2017 08:23:13 +0000 Subject: make metadata be ordered "prettier" when dumped If the pyaml package is installed, use that and OrderedDict objects so that the generated modulemd document has a defined order with e.g. 'document' and 'version' nodes at the top. Require 'modulemd[pretty]' to pull in the pyaml package automatically. --- diff --git a/modulemd/__init__.py b/modulemd/__init__.py index 9fc79f9..0fd4400 100644 --- a/modulemd/__init__.py +++ b/modulemd/__init__.py @@ -43,6 +43,17 @@ Example usage: import sys import yaml +try: + import pyaml +except ImportError: + pyaml = None + # the yaml package can't handle OrderedDict objects + yaml_dict = dict +else: + # only if the pyaml package is available use OrderedDicts for dumping + from collections import OrderedDict as yaml_dict + + if sys.version_info > (3,): long = int @@ -254,29 +265,29 @@ class ModuleMetadata(object): :rtype: str """ - data = dict() + data = yaml_dict() # header data["document"] = "modulemd" data["version"] = self.mdversion # data - data["data"] = dict() + data["data"] = yaml_dict() data["data"]["name"] = self.name data["data"]["stream"] = self.stream data["data"]["version"] = self.version data["data"]["summary"] = self.summary data["data"]["description"] = self.description - data["data"]["license"] = dict() + data["data"]["license"] = yaml_dict() data["data"]["license"]["module"] = list(self.module_licenses) if self.content_licenses: data["data"]["license"]["content"] = list(self.content_licenses) if self.buildrequires or self.requires: - data["data"]["dependencies"] = dict() + data["data"]["dependencies"] = yaml_dict() if self.buildrequires: data["data"]["dependencies"]["buildrequires"] = self.buildrequires if self.requires: data["data"]["dependencies"]["requires"] = self.requires if self.community or self.documentation or self.tracker: - data["data"]["references"] = dict() + data["data"]["references"] = yaml_dict() if self.community: data["data"]["references"]["community"] = self.community if self.documentation: @@ -286,32 +297,32 @@ class ModuleMetadata(object): if self.xmd: data["data"]["xmd"] = self.xmd if self.profiles: - data["data"]["profiles"] = dict() + data["data"]["profiles"] = yaml_dict() for profile in self.profiles.keys(): if self.profiles[profile].description: if profile not in data["data"]["profiles"]: - data["data"]["profiles"][profile] = dict() + data["data"]["profiles"][profile] = yaml_dict() data["data"]["profiles"][profile]["description"] = \ str(self.profiles[profile].description) if self.profiles[profile].rpms: if profile not in data["data"]["profiles"]: - data["data"]["profiles"][profile] = dict() + data["data"]["profiles"][profile] = yaml_dict() data["data"]["profiles"][profile]["rpms"] = \ list(self.profiles[profile].rpms) if self.api: - data["data"]["api"] = dict() + data["data"]["api"] = yaml_dict() if self.api.rpms: data["data"]["api"]["rpms"] = list(self.api.rpms) if self.filter: - data["data"]["filter"] = dict() + data["data"]["filter"] = yaml_dict() if self.filter.rpms: data["data"]["filter"]["rpms"] = list(self.filter.rpms) if self.components: - data["data"]["components"] = dict() + data["data"]["components"] = yaml_dict() if self.components.rpms: - data["data"]["components"]["rpms"] = dict() + data["data"]["components"]["rpms"] = yaml_dict() for p in self.components.rpms.values(): - extra = dict() + extra = yaml_dict() extra["rationale"] = p.rationale if p.buildorder: extra["buildorder"] = p.buildorder @@ -327,9 +338,9 @@ class ModuleMetadata(object): extra["multilib"] = list(p.multilib) data["data"]["components"]["rpms"][p.name] = extra if self.components.modules: - data["data"]["components"]["modules"] = dict() + data["data"]["components"]["modules"] = yaml_dict() for p in self.components.modules.values(): - extra = dict() + extra = yaml_dict() extra["rationale"] = p.rationale if p.buildorder: extra["buildorder"] = p.buildorder @@ -338,7 +349,10 @@ class ModuleMetadata(object): if p.ref: extra["ref"] = p.ref data["data"]["components"]["modules"][p.name] = extra - return yaml.safe_dump(data) + if pyaml: + return pyaml.dump(data) + else: + return yaml.safe_dump(data) @property def mdversion(self): diff --git a/setup.py b/setup.py index 14af889..328f0f2 100755 --- a/setup.py +++ b/setup.py @@ -28,4 +28,9 @@ setup( install_requires = [ "PyYAML", ], + extras_require = { + "pretty": [ + "pyaml", + ], + }, )