summaryrefslogtreecommitdiff
path: root/morphlib
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-06-17 16:19:47 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-07-07 12:30:16 +0000
commit09b6d77a5eea0594965b27d1697fa2fed2ec3b39 (patch)
treee617d5a574af8d7308f4d4f83ecead725d902a2c /morphlib
parent956f5204ec7f69db8a276a4e10313fd282a235a6 (diff)
downloadmorph-09b6d77a5eea0594965b27d1697fa2fed2ec3b39.tar.gz
Add class hierarchies for Morphology load errors
There's a lot of them, it's too much of a pain to enumerate them all, so it's convenient to provide a hierachy and catch the base exceptions.
Diffstat (limited to 'morphlib')
-rw-r--r--morphlib/morphloader.py64
1 files changed, 36 insertions, 28 deletions
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py
index 368e5477..45416a19 100644
--- a/morphlib/morphloader.py
+++ b/morphlib/morphloader.py
@@ -40,25 +40,33 @@ class MorphologyObsoleteFieldWarning(UserWarning):
class MorphologySyntaxError(morphlib.Error):
+ pass
+
+
+class MorphologyNotYamlError(MorphologySyntaxError):
def __init__(self, morphology, errmsg):
self.msg = 'Syntax error in morphology %s:\n%s' % (morphology, errmsg)
-class NotADictionaryError(morphlib.Error):
+class NotADictionaryError(MorphologySyntaxError):
def __init__(self, morph_filename):
self.msg = 'Not a dictionary: morphology %s' % morph_filename
-class UnknownKindError(morphlib.Error):
+class MorphologyValidationError(morphlib.Error):
+ pass
+
+
+class UnknownKindError(MorphologyValidationError):
def __init__(self, kind, morph_filename):
self.msg = (
'Unknown kind %s in morphology %s' % (kind, morph_filename))
-class MissingFieldError(morphlib.Error):
+class MissingFieldError(MorphologyValidationError):
def __init__(self, field, morphology_name):
self.field = field
@@ -67,7 +75,7 @@ class MissingFieldError(morphlib.Error):
'Missing field %s from morphology %s' % (field, morphology_name))
-class InvalidFieldError(morphlib.Error):
+class InvalidFieldError(MorphologyValidationError):
def __init__(self, field, morphology_name):
self.field = field
@@ -76,7 +84,7 @@ class InvalidFieldError(morphlib.Error):
'Field %s not allowed in morphology %s' % (field, morphology_name))
-class InvalidTypeError(morphlib.Error):
+class InvalidTypeError(MorphologyValidationError):
def __init__(self, field, expected, actual, morphology_name):
self.field = field
@@ -88,7 +96,7 @@ class InvalidTypeError(morphlib.Error):
(field, expected, actual, morphology_name))
-class ObsoleteFieldsError(morphlib.Error):
+class ObsoleteFieldsError(MorphologyValidationError):
def __init__(self, fields, morph_filename):
self.msg = (
@@ -96,14 +104,14 @@ class ObsoleteFieldsError(morphlib.Error):
(morph_filename, ' '.join(fields)))
-class UnknownArchitectureError(morphlib.Error):
+class UnknownArchitectureError(MorphologyValidationError):
def __init__(self, arch, morph_filename):
self.msg = ('Unknown architecture %s in morphology %s'
% (arch, morph_filename))
-class NoBuildDependenciesError(morphlib.Error):
+class NoBuildDependenciesError(MorphologyValidationError):
def __init__(self, stratum_name, chunk_name, morph_filename):
self.msg = (
@@ -111,7 +119,7 @@ class NoBuildDependenciesError(morphlib.Error):
(stratum_name, chunk_name, morph_filename))
-class NoStratumBuildDependenciesError(morphlib.Error):
+class NoStratumBuildDependenciesError(MorphologyValidationError):
def __init__(self, stratum_name, morph_filename):
self.msg = (
@@ -119,7 +127,7 @@ class NoStratumBuildDependenciesError(morphlib.Error):
(stratum_name, morph_filename))
-class EmptyStratumError(morphlib.Error):
+class EmptyStratumError(MorphologyValidationError):
def __init__(self, stratum_name, morph_filename):
self.msg = (
@@ -127,86 +135,86 @@ class EmptyStratumError(morphlib.Error):
(stratum_name, morph_filename))
-class DuplicateChunkError(morphlib.Error):
+class DuplicateChunkError(MorphologyValidationError):
def __init__(self, stratum_name, chunk_name):
self.stratum_name = stratum_name
self.chunk_name = chunk_name
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'Duplicate chunk %(chunk_name)s '\
'in stratum %(stratum_name)s' % locals())
-class EmptyRefError(morphlib.Error):
+class EmptyRefError(MorphologyValidationError):
def __init__(self, ref_location, morph_filename):
self.ref_location = ref_location
self.morph_filename = morph_filename
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'Empty ref found for %(ref_location)s '\
'in %(morph_filename)s' % locals())
-class ChunkSpecRefNotStringError(morphlib.Error):
+class ChunkSpecRefNotStringError(MorphologyValidationError):
def __init__(self, ref_value, chunk_name, stratum_name):
self.ref_value = ref_value
self.chunk_name = chunk_name
self.stratum_name = stratum_name
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'Ref %(ref_value)s for %(chunk_name)s '\
'in stratum %(stratum_name)s is not a string' % locals())
-class SystemStrataNotListError(morphlib.Error):
+class SystemStrataNotListError(MorphologyValidationError):
def __init__(self, system_name, strata_type):
self.system_name = system_name
self.strata_type = strata_type
typename = strata_type.__name__
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'System %(system_name)s has the wrong type for its strata: '\
'%(typename)s, expected list' % locals())
-class DuplicateStratumError(morphlib.Error):
+class DuplicateStratumError(MorphologyValidationError):
def __init__(self, system_name, stratum_name):
self.system_name = system_name
self.stratum_name = stratum_name
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'Duplicate stratum %(stratum_name)s '\
'in system %(system_name)s' % locals())
-class SystemStratumSpecsNotMappingError(morphlib.Error):
+class SystemStratumSpecsNotMappingError(MorphologyValidationError):
def __init__(self, system_name, strata):
self.system_name = system_name
self.strata = strata
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'System %(system_name)s has stratum specs '\
'that are not mappings.' % locals())
-class EmptySystemError(morphlib.Error):
+class EmptySystemError(MorphologyValidationError):
def __init__(self, system_name):
- morphlib.Error.__init__(
+ MorphologyValidationError.__init__(
self, 'System %(system_name)s has no strata.' % locals())
-class MultipleValidationErrors(morphlib.Error):
+class MultipleValidationErrors(MorphologyValidationError):
def __init__(self, name, errors):
self.name = name
self.errors = errors
self.msg = 'Multiple errors when validating %(name)s:'
for error in errors:
- self.msg += ('\t' + str(error))
+ self.msg += ('\n' + str(error))
-class DuplicateDeploymentNameError(morphlib.Error):
+class DuplicateDeploymentNameError(MorphologyValidationError):
def __init__(self, cluster_filename, duplicates):
self.duplicates = duplicates
@@ -352,7 +360,7 @@ class MorphologyLoader(object):
try:
obj = yaml.safe_load(text)
except yaml.error.YAMLError as e:
- raise MorphologySyntaxError(morph_filename, e)
+ raise MorphologyNotYamlError(morph_filename, e)
if not isinstance(obj, dict):
raise NotADictionaryError(morph_filename)