##############################################################################
-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
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
# 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
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])
--- /dev/null
+invalid - yaml
\ No newline at end of file
--- /dev/null
+name: name in content
\ No newline at end of file
--- /dev/null
+no_name: yaml file without name
\ No newline at end of file
--- /dev/null
+##############################################################################
+# 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