Refactoring qtip.base.error 05/29005/7
authorYujun Zhang <zhang.yujunz@zte.com.cn>
Sat, 18 Feb 2017 04:14:43 +0000 (12:14 +0800)
committerYujun Zhang <zhang.yujunz@zte.com.cn>
Tue, 21 Feb 2017 08:58:50 +0000 (16:58 +0800)
- move method make_tbd to qtip.util.dev
- add suffix Error to follow the Python naming convention
- rename arguments of NotFoundError to make it generic

Change-Id: I81e406b7fa10c3b40004434f6a9c2e7bbf7603ee
Signed-off-by: Yujun Zhang <zhang.yujunz@zte.com.cn>
qtip/base/error.py
qtip/loader/file.py
qtip/loader/yaml_file.py
qtip/runner/__init__.py
qtip/util/dev.py [new file with mode: 0644]
qtip/util/formula.py
test-requirements.txt
tests/unit/base/error_test.py [new file with mode: 0644]
tests/unit/loader/yaml_file_test.py
tests/unit/util/dev_test.py [new file with mode: 0644]

index a055aa8..f23d8cd 100644 (file)
@@ -12,16 +12,16 @@ class BaseError(Exception):
     pass
 
 
-class InvalidContent(BaseError):
+class InvalidContentError(BaseError):
     def __init__(self, filename, excinfo=None):
         self.filename = filename
         self.excinfo = excinfo
 
 
-class NotFound(BaseError):
-    def __init__(self, module, package='qtip'):
-        self.package = package
-        self.module = module
+class NotFoundError(BaseError):
+    def __init__(self, needle, heystack='qtip'):
+        self.needle = needle
+        self.heystack = heystack
 
 
 class ToBeDoneError(BaseError):
@@ -29,9 +29,3 @@ class ToBeDoneError(BaseError):
     def __init__(self, method, module):
         self.method = method
         self.module = module
-
-
-def make_tbd(method, module='qtip'):
-    def tbd():
-        raise ToBeDoneError(method, module)
-    return tbd
index 0ea4d5b..038f57d 100644 (file)
@@ -12,7 +12,7 @@ from os import listdir
 from os import path
 
 from qtip.base.constant import BaseProp
-from qtip.base.error import NotFound
+from qtip.base.error import NotFoundError
 from qtip.loader.base import BaseLoader
 
 
@@ -35,7 +35,7 @@ class FileLoader(BaseLoader):
             abspath = path.join(p, self.RELATIVE_PATH, name)
             if path.exists(abspath):
                 return abspath
-        raise NotFound(name, paths)
+        raise NotFoundError(name, paths)
 
     @classmethod
     def list_all(cls, paths=None):
index 8b78a47..7ff838f 100644 (file)
@@ -10,7 +10,7 @@
 from os import path
 import yaml
 
-from qtip.base.error import InvalidContent
+from qtip.base.error import InvalidContentError
 from qtip.base.constant import BaseProp
 from qtip.loader.file import FileLoader
 
@@ -25,6 +25,6 @@ class YamlFileLoader(FileLoader):
         with open(abspath, 'r') as stream:
             content = yaml.safe_load(stream)
             if not isinstance(content, dict):
-                raise InvalidContent(abspath)
+                raise InvalidContentError(abspath)
             self.content = content
             self.name = content.get(BaseProp.NAME, path.splitext(name)[0])
index 79c3885..52c43a1 100644 (file)
@@ -8,7 +8,7 @@
 ##############################################################################
 
 from qtip.base.constant import PkgName, BaseProp
-from qtip.base.error import NotFound
+from qtip.base.error import NotFoundError
 from qtip.collector.stdout import StdoutCollector
 from qtip.driver.random import RandomDriver
 from qtip.reporter.console import ConsoleReporter
@@ -28,16 +28,16 @@ class Runner(object):
         if driver_name == 'random':
             self.driver = RandomDriver()
         else:
-            raise NotFound(driver_name, heystack=PkgName.DRIVER)
+            raise NotFoundError(driver_name, heystack=PkgName.DRIVER)
 
         if collector_name == 'stdout':
             self.collector = StdoutCollector()
         else:
-            raise NotFound(collector_name,
-                           heystack=PkgName.COLLECTOR)
+            raise NotFoundError(collector_name,
+                                heystack=PkgName.COLLECTOR)
 
         if reporter_name == 'console':
             self.reporter = ConsoleReporter()
         else:
-            raise NotFound(reporter_name,
-                           heystack=PkgName.REPORTER)
+            raise NotFoundError(reporter_name,
+                                heystack=PkgName.REPORTER)
diff --git a/qtip/util/dev.py b/qtip/util/dev.py
new file mode 100644 (file)
index 0000000..b77bf1e
--- /dev/null
@@ -0,0 +1,17 @@
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation 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
+##############################################################################
+
+
+from qtip.base.error import ToBeDoneError
+
+
+def create_to_be_done(method, module='qtip'):
+    def tbd():
+        raise ToBeDoneError(method, module)
+    return tbd
index cdfbae8..e92d21f 100644 (file)
@@ -9,7 +9,7 @@
 
 import numpy
 
-from qtip.base.error import make_tbd
+from qtip.util.dev import create_to_be_done
 from qtip.base.constant import FormulaName
 
 
@@ -17,10 +17,10 @@ MAPPING = {
     FormulaName.ARITHMETIC_MEAN: numpy.mean,
     FormulaName.WEIGHTED_ARITHMETIC_MEAN: numpy.average,
     # TODO(yujunz) find or implement the method
-    FormulaName.GEOMETRIC_MEAN: make_tbd(FormulaName.GEOMETRIC_MEAN, __name__),
+    FormulaName.GEOMETRIC_MEAN: create_to_be_done(FormulaName.GEOMETRIC_MEAN, __name__),
     # TODO(yujunz) find or implement the method
     FormulaName.WEIGHTED_GEOMETRIC_MEAN:
-        make_tbd(FormulaName.GEOMETRIC_MEAN, __name__)}
+        create_to_be_done(FormulaName.GEOMETRIC_MEAN, __name__)}
 
 
 class Formula:
index a508012..e434748 100644 (file)
@@ -9,3 +9,7 @@ coverage
 pykwalify
 mock
 pip_check_reqs
+coverage
+pytest-cov
+pytest-faker
+tox
diff --git a/tests/unit/base/error_test.py b/tests/unit/base/error_test.py
new file mode 100644 (file)
index 0000000..2be6d69
--- /dev/null
@@ -0,0 +1,48 @@
+###############################################################
+# Copyright (c) 2017 ZTE Corporation
+#
+# 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 pytest
+
+from qtip.base.error import InvalidContentError
+from qtip.base.error import NotFoundError
+from qtip.base.error import ToBeDoneError
+
+
+def test_invalid_content(faker):
+    filename = faker.file_name()
+    error = InvalidContentError(filename)
+    assert error.filename == filename
+
+
+def test_not_found(faker):
+    package = faker.pystr()
+    module = faker.pystr()
+    error = NotFoundError(module)
+    assert error.needle == module
+    assert error.heystack == 'qtip'
+
+    error = NotFoundError(module, package)
+    assert error.needle == module
+    assert error.heystack == package
+
+
+@pytest.fixture
+def method(faker):
+    return faker.pystr()
+
+
+@pytest.fixture
+def module(faker):
+    return faker.pystr()
+
+
+def test_to_be_done(method, module):
+    error = ToBeDoneError(method, module)
+    assert error.method == method
+    assert error.module == module
index 1783694..0f0632c 100644 (file)
@@ -10,7 +10,7 @@
 import os
 import pytest
 
-from qtip.base.error import InvalidContent
+from qtip.base.error import InvalidContentError
 from qtip.loader.yaml_file import YamlFileLoader
 
 
@@ -28,6 +28,6 @@ def test_init(yaml_root, filename, expected):
 
 
 def test_invalid_content(yaml_root):
-    with pytest.raises(InvalidContent) as excinfo:
+    with pytest.raises(InvalidContentError) as excinfo:
         YamlFileLoader('invalid.yaml', [yaml_root])
     assert 'invalid.yaml' in excinfo.value.filename
diff --git a/tests/unit/util/dev_test.py b/tests/unit/util/dev_test.py
new file mode 100644 (file)
index 0000000..021b100
--- /dev/null
@@ -0,0 +1,32 @@
+###############################################################
+# Copyright (c) 2017 ZTE Corporation
+#
+# 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 pytest
+
+from qtip.base.error import ToBeDoneError
+from qtip.util.dev import create_to_be_done
+
+
+def test_create_to_be_done(faker):
+    method = faker.pystr()
+    module = faker.pystr()
+
+    tbd = create_to_be_done(method)
+    assert callable(tbd)
+    with pytest.raises(ToBeDoneError) as excinfo:
+        tbd()
+    assert excinfo.value.method == method
+    assert excinfo.value.module == 'qtip'
+
+    tbd = create_to_be_done(method, module)
+    assert callable(tbd)
+    with pytest.raises(ToBeDoneError) as excinfo:
+        tbd()
+    assert excinfo.value.method == method
+    assert excinfo.value.module == module