summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@gmail.com>2014-11-05 14:20:43 +0000
committerRichard Maw <richard.maw@gmail.com>2014-11-05 18:40:36 +0000
commiteae31f6a5a4cb263bd34ae85db327b52bc31ac91 (patch)
tree80cb94cf37bfc3c134a2245883dbab9e68034d65
parent10cc7833069b5d4a9a1da77fae161cd20446b101 (diff)
downloadmorph-eae31f6a5a4cb263bd34ae85db327b52bc31ac91.tar.gz
Validate stratum specs more thouroughly.
-rw-r--r--morphlib/morphloader.py35
1 files changed, 33 insertions, 2 deletions
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py
index 03267566..5aa54175 100644
--- a/morphlib/morphloader.py
+++ b/morphlib/morphloader.py
@@ -17,6 +17,7 @@
import collections
+import itertools
import logging
import warnings
import yaml
@@ -104,6 +105,14 @@ class ObsoleteFieldsError(MorphologyValidationError):
(morph_filename, ' '.join(fields)))
+class IncompatibeFieldsError(MorphologyValidationError): # pragma: no cover
+
+ def __init__(self, fields, morph_filename):
+ self.msg = (
+ 'Morphology %s uses incompatible fields: %s' %
+ (morph_filename, ' '.join(fields)))
+
+
class UnknownArchitectureError(MorphologyValidationError):
def __init__(self, arch, morph_filename):
@@ -567,7 +576,7 @@ class MorphologyLoader(object):
morph['name'], chunk_name, morph.filename)
# Validate run-depends if specified
- if 'run-depends' in morph:
+ if 'run-depends' in morph: # pragma: no cover
rundep_map = morph['run-depends']
if not isinstance(rundep_map, dict):
raise InvalidTypeError(
@@ -660,12 +669,34 @@ class MorphologyLoader(object):
warnings.warn(MorphologyObsoleteFieldWarning(morphology, spec, field),
stacklevel=2)
+ obsolete_stratum_spec_fields = ('repo', 'ref')
+ incompatible_stratum_spec_fields = (('artifact', 'artifacts'),)
+ required_stratum_spec_fields = ()
+ optional_stratum_spec_fields = ('name', 'morph')
+ known_stratum_spec_fields = set(itertools.chain(
+ obsolete_stratum_spec_fields,
+ itertools.chain.from_iterable(incompatible_stratum_spec_fields),
+ required_stratum_spec_fields, optional_stratum_spec_fields))
@classmethod
def _validate_stratum_specs_fields(cls, morphology, specs):
for spec in specs:
- for obsolete_field in ('repo', 'ref'):
+ for obsolete_field in cls.obsolete_stratum_spec_fields:
if obsolete_field in spec:
cls._warn_obsolete_field(morphology, spec, obsolete_field)
+ for incompatible_fields in cls.incompatible_stratum_spec_fields:
+ if len([field for field in
+ cls.incompatible_stratum_spec_fields
+ if field in spec]) > 1: # pragma: no cover
+ raise IncompatibleFieldsError(incompatible_fields,
+ morphology.filename)
+ missing_fields = set(f for f in cls.required_stratum_spec_fields
+ if f not in spec)
+ if missing_fields: # pragma: no cover
+ raise MissingFieldError(' or '.join(missing_fields),
+ morphology.filename)
+ unrecognised = set(f for f in spec
+ if f not in cls.known_stratum_spec_fields)
+
def _require_field(self, field, morphology):
if field not in morphology: