diff options
-rw-r--r-- | qtip/base/error.py | 11 | ||||
-rw-r--r-- | qtip/loader/plan.py | 1 | ||||
-rw-r--r-- | qtip/loader/yaml_file.py | 19 | ||||
-rw-r--r-- | tests/data/yaml/invalid.yaml | 1 | ||||
-rw-r--r-- | tests/data/yaml/with_name.yaml | 1 | ||||
-rw-r--r-- | tests/data/yaml/without_name.yaml | 1 | ||||
-rw-r--r-- | tests/unit/loader/yaml_file_test.py | 33 |
7 files changed, 49 insertions, 18 deletions
diff --git a/qtip/base/error.py b/qtip/base/error.py index 01a7f7a6..a055aa8d 100644 --- a/qtip/base/error.py +++ b/qtip/base/error.py @@ -8,22 +8,23 @@ ############################################################################## -class QtipError(Exception): +class BaseError(Exception): pass -class InvalidFormat(QtipError): - def __init__(self, filename): +class InvalidContent(BaseError): + def __init__(self, filename, excinfo=None): self.filename = filename + self.excinfo = excinfo -class NotFound(QtipError): +class NotFound(BaseError): def __init__(self, module, package='qtip'): self.package = package self.module = module -class ToBeDoneError(QtipError): +class ToBeDoneError(BaseError): """something still to be done""" def __init__(self, method, module): self.method = method diff --git a/qtip/loader/plan.py b/qtip/loader/plan.py index 6f1764e2..9b5546e0 100644 --- a/qtip/loader/plan.py +++ b/qtip/loader/plan.py @@ -26,7 +26,6 @@ class Plan(YamlFileLoader): self.qpis = [QPISpec(qpi, paths=paths) for qpi in self.content[PlanProp.QPIS]] - self.info = self.content[PlanProp.INFO] _config = self.content[PlanProp.CONFIG] # TODO(yujunz) create collector by name diff --git a/qtip/loader/yaml_file.py b/qtip/loader/yaml_file.py index f1cd4614..ccaee8db 100644 --- a/qtip/loader/yaml_file.py +++ b/qtip/loader/yaml_file.py @@ -7,11 +7,10 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -from collections import defaultdict from os import path import yaml -from qtip.base.error import InvalidFormat +from qtip.base.error import InvalidContent from qtip.base.constant import BaseProp from qtip.loader.file import FileLoader @@ -21,13 +20,9 @@ class YamlFileLoader(FileLoader): def __init__(self, name, paths=None): super(YamlFileLoader, self).__init__(name, paths) - content = defaultdict(lambda: None) - - try: - content.update(yaml.safe_load(file(self._abspath))) - except yaml.YAMLError: - # TODO(yujunz) log yaml error - raise InvalidFormat(self._abspath) - - self.name = content[BaseProp.NAME] or path.splitext(name)[0] - self.content = content + with open(self._abspath, 'r') as stream: + content = yaml.safe_load(stream) + if not isinstance(content, dict): + raise InvalidContent(self._abspath) + self.content = content + self.name = content.get(BaseProp.NAME, path.splitext(name)[0]) diff --git a/tests/data/yaml/invalid.yaml b/tests/data/yaml/invalid.yaml new file mode 100644 index 00000000..22e31ed1 --- /dev/null +++ b/tests/data/yaml/invalid.yaml @@ -0,0 +1 @@ +invalid - yaml
\ No newline at end of file diff --git a/tests/data/yaml/with_name.yaml b/tests/data/yaml/with_name.yaml new file mode 100644 index 00000000..25f7f83d --- /dev/null +++ b/tests/data/yaml/with_name.yaml @@ -0,0 +1 @@ +name: name in content
\ No newline at end of file diff --git a/tests/data/yaml/without_name.yaml b/tests/data/yaml/without_name.yaml new file mode 100644 index 00000000..bd234bd4 --- /dev/null +++ b/tests/data/yaml/without_name.yaml @@ -0,0 +1 @@ +no_name: yaml file without name
\ No newline at end of file diff --git a/tests/unit/loader/yaml_file_test.py b/tests/unit/loader/yaml_file_test.py new file mode 100644 index 00000000..17836946 --- /dev/null +++ b/tests/unit/loader/yaml_file_test.py @@ -0,0 +1,33 @@ +############################################################################## +# Copyright (c) 2017 ZTE Corp and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import os +import pytest + +from qtip.base.error import InvalidContent +from qtip.loader.yaml_file import YamlFileLoader + + +@pytest.fixture +def yaml_root(data_root): + return os.path.join(data_root, 'yaml') + + +@pytest.mark.parametrize('filename, expected', [ + ('with_name.yaml', 'name in content'), + ('without_name.yaml', 'without_name')]) +def test_init(yaml_root, filename, expected): + loader = YamlFileLoader(filename, [yaml_root]) + assert loader.name == expected + + +def test_invalid_content(yaml_root): + with pytest.raises(InvalidContent) as excinfo: + YamlFileLoader('invalid.yaml', [yaml_root]) + assert 'invalid.yaml' in excinfo.value.filename |