diff options
Diffstat (limited to 'morphlib/definitions_version.py')
-rw-r--r-- | morphlib/definitions_version.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/morphlib/definitions_version.py b/morphlib/definitions_version.py new file mode 100644 index 00000000..44bed178 --- /dev/null +++ b/morphlib/definitions_version.py @@ -0,0 +1,78 @@ +# 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 =*= + + +'''Functions for dealing with the definitions VERSION marker file.''' + + +import cliapp +import yaml + +import morphlib + + +SUPPORTED_VERSIONS = [3, 4, 5, 6] + + +class DefinitionsVersionError(cliapp.AppException): + pass + + +class UnknownVersionError(DefinitionsVersionError): # pragma: no cover + def __init__(self, version): + DefinitionsVersionError.__init__( + self, "Definitions format version %s is not supported" % version) + + +class InvalidVersionFileError(DefinitionsVersionError): # pragma: no cover + def __init__(self): + DefinitionsVersionError.__init__(self, "invalid VERSION file") + + +def parse_version_file(version_text): + '''Parse VERSION file and return the version of the format if: + + VERSION is a YAML file + and it's a dict + and has the key 'version' + and the type stored in the 'version' key is an int + + otherwise returns None + + ''' + yaml_obj = yaml.safe_load(version_text) + + return (yaml_obj['version'] if yaml_obj is not None + and isinstance(yaml_obj, dict) + and 'version' in yaml_obj + and isinstance(yaml_obj['version'], int) + + else None) + + +def check_version_file(version_text): # pragma: no cover + '''Check the VERSION information is valid and is a supported version.''' + + if version_text == None: + raise InvalidVersionFileError() + + version = morphlib.definitions_version.parse_version_file(version_text) + + if version == None: + raise InvalidVersionFileError() + + if version not in SUPPORTED_VERSIONS: + raise UnknownVersionError(version) |