From 09b6d77a5eea0594965b27d1697fa2fed2ec3b39 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Tue, 17 Jun 2014 16:19:47 +0000 Subject: 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. --- morphlib/morphloader.py | 64 +++++++++++++++++++++++++++---------------------- 1 file 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) -- cgit v1.2.1