50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
|
import glob
|
||
|
import os
|
||
|
import itertools
|
||
|
|
||
|
from unittest import TestCase
|
||
|
|
||
|
import yamale
|
||
|
|
||
|
|
||
|
class YamaleTestCase(TestCase):
|
||
|
""" TestCase for easily validating YAML in your own tests.
|
||
|
`schema`: String of path to the schema file to use. One schema file per test case.
|
||
|
`yaml`: String or list of yaml files to validate. Accepts globs.
|
||
|
`base_dir`: String path to prepend to all other paths. This is optional.
|
||
|
"""
|
||
|
|
||
|
schema = None
|
||
|
yaml = None
|
||
|
base_dir = None
|
||
|
|
||
|
def validate(self, validators=None):
|
||
|
schema = self.schema
|
||
|
yaml = self.yaml
|
||
|
base_dir = self.base_dir
|
||
|
|
||
|
if schema is None:
|
||
|
return
|
||
|
|
||
|
if type(yaml) != list:
|
||
|
yaml = [yaml]
|
||
|
|
||
|
if base_dir is not None:
|
||
|
schema = os.path.join(base_dir, schema)
|
||
|
yaml = {os.path.join(base_dir, y) for y in yaml}
|
||
|
|
||
|
# Run yaml through glob and flatten list
|
||
|
yaml = set(itertools.chain(*map(glob.glob, yaml)))
|
||
|
|
||
|
# Remove schema from set of data files
|
||
|
yaml = yaml - {schema}
|
||
|
|
||
|
yamale_schema = yamale.make_schema(schema, validators=validators)
|
||
|
yamale_data = itertools.chain(*map(yamale.make_data, yaml))
|
||
|
|
||
|
for result in yamale.validate(yamale_schema, yamale_data):
|
||
|
if not result.isValid():
|
||
|
raise ValueError(result)
|
||
|
return True
|
||
|
|