diff options
Diffstat (limited to 'morphlib/defaults.py')
-rw-r--r-- | morphlib/defaults.py | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/morphlib/defaults.py b/morphlib/defaults.py new file mode 100644 index 00000000..9e695a90 --- /dev/null +++ b/morphlib/defaults.py @@ -0,0 +1,108 @@ +# Copyright (C) 2015 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# =*= License: GPL-2 =*= + + +import cliapp +import jsonschema +import yaml + +import os + +import morphlib + + +class Defaults(object): + '''Represents predefined default values specific to Baserock definitions. + + The DEFAULTS file was added in definitions format version 7, which lets + users set these defaults. The text of DEFAULTS file can be passed in as + 'text', and will be validated and parsed if definitions_version >= 7. + + Prior to version 7, the defaults were hardcoded in Morph. These defaults + will be returned if definitions_version < 7. + + ''' + def __init__(self, definitions_version, text=None): + self._build_systems = {} + self._split_rules = {} + + schema_path = os.path.join(morphlib.util.schemas_directory(), + 'defaults.json-schema') + with open(schema_path) as f: + self.schema = yaml.load(f) + + if definitions_version >= 7: + if text: + self._build_systems, self._split_rules = self._parse(text) + else: + self._build_systems, self._split_rules = self._builtins() + + def _parse(self, text): + build_systems = {} + split_rules = {} + + # This reports errors against <string> rather than the actual filename, + # which is sad. + data = yaml.safe_load(text) + + if data is None: + # It's OK to be empty, I guess. + return build_systems, split_rules + + try: + # It would be nice if this could give line numbers when it spotted + # errors. Seems tricky. + jsonschema.validate(data, self.schema) + except jsonschema.ValidationError as e: + raise cliapp.AppException('Invalid DEFAULTS file: %s' % e.message) + + build_system_data = data.get('build-systems', {}) + for name, commands in build_system_data.items(): + build_system = morphlib.buildsystem.BuildSystem() + build_system.from_dict(name, commands) + build_systems[name] = build_system + + # It would make sense to create artifactsplitrule.SplitRule instances + # here, instead of an unlabelled data structure. That would need some + # changes to source.make_sources() and the 'artifactsplitrule' module. + split_rules_data = data.get('split-rules', {}) + for kind, rules in split_rules_data.items(): + split_rules[kind] = [] + for rule in rules: + rule_unlabelled = (rule['artifact'], rule['include']) + split_rules[kind].append(rule_unlabelled) + + return build_systems, split_rules + + def _builtins(self): + build_systems = {} + split_rules = {} + + for build_system in morphlib.buildsystem.build_systems: + build_systems[build_system.name] = build_system + + split_rules['chunk'] = \ + morphlib.artifactsplitrule.DEFAULT_CHUNK_RULES + split_rules['stratum'] = \ + morphlib.artifactsplitrule.DEFAULT_STRATUM_RULES + + return build_systems, split_rules + + def build_systems(self): + return self._build_systems + + def split_rules(self): + return self._split_rules |