← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~smoser/cloud-init:fix/py26-skipif into cloud-init:master

 

Scott Moser has proposed merging ~smoser/cloud-init:fix/py26-skipif into cloud-init:master.

Commit message:
Fix the built-in cloudinit/tests/helpers:skipIf

this version
a.) actually has correct logic
b.) can decorate a class.

Requested reviews:
  cloud-init commiters (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~smoser/cloud-init/+git/cloud-init/+merge/354062

see commit message
-- 
Your team cloud-init commiters is requested to review the proposed merge of ~smoser/cloud-init:fix/py26-skipif into cloud-init:master.
diff --git a/cloudinit/tests/helpers.py b/cloudinit/tests/helpers.py
index 5bfe7fa..148e0ae 100644
--- a/cloudinit/tests/helpers.py
+++ b/cloudinit/tests/helpers.py
@@ -428,15 +428,34 @@ def readResource(name, mode='r'):
 try:
     skipIf = unittest.skipIf
 except AttributeError:
-    # Python 2.6.  Doesn't have to be high fidelity.
+    # Python 2.6.
     def skipIf(condition, reason):
-        def decorator(func):
-            def wrapper(*args, **kws):
-                if condition:
-                    return func(*args, **kws)
-                else:
-                    print(reason, file=sys.stderr)
-            return wrapper
+        def decorator(test):
+            def decorate_callable(mycallable):
+                @functools.wraps(mycallable)
+                def wrapper(*args, **kws):
+                    if condition:
+                        raise SkipTest(reason)
+                    else:
+                        return mycallable(*args, **kws)
+                return wrapper
+
+            def decorate_test_methods(klass):
+                for attr in dir(klass):
+                    attr_value = getattr(klass, attr)
+                    if not hasattr(attr_value, "__call__"):
+                        continue
+
+                    if not attr.startswith('test_'):
+                        continue
+
+                    setattr(klass, attr, decorate_callable(attr_value))
+                return klass
+
+            if isinstance(test, (type,)):
+                return decorate_test_methods(klass=test)
+            return decorate_callable(test)
+
         return decorator
 
 

Follow ups