No module name for builtin type and exception names

Make utils.reflection.get_class_name() return just type name (without
module) for builtin exceptions and types. This makes output less
clumsy and makes this function return same strings for python 2 and 3.

Change-Id: Ibc599ed34c804cf2cf2ab67e7466a48ebe7f6df3
This commit is contained in:
Ivan A. Melnikov
2013-10-10 14:20:08 +04:00
parent c5b84d021d
commit 5429b891fb
5 changed files with 40 additions and 36 deletions

View File

@@ -202,7 +202,7 @@ class EngineTaskTest(EngineTestBase):
'flow FAILURE', 'flow FAILURE',
'flow REVERTING', 'flow REVERTING',
'fail REVERTING', 'fail REVERTING',
'fail reverted(Failure: exceptions.RuntimeError: Woot!)', 'fail reverted(Failure: RuntimeError: Woot!)',
'fail REVERTED', 'fail REVERTED',
'fail PENDING', 'fail PENDING',
'flow REVERTED']) 'flow REVERTED'])
@@ -382,7 +382,7 @@ class EngineLinearFlowTest(EngineTestBase):
engine.run() engine.run()
self.assertEquals( self.assertEquals(
self.values, self.values,
['fail reverted(Failure: exceptions.RuntimeError: Woot!)']) ['fail reverted(Failure: RuntimeError: Woot!)'])
def test_correctly_reverts_children(self): def test_correctly_reverts_children(self):
flow = lf.Flow('root-1').add( flow = lf.Flow('root-1').add(
@@ -398,7 +398,7 @@ class EngineLinearFlowTest(EngineTestBase):
self.assertEquals( self.assertEquals(
self.values, self.values,
['task1', 'task2', ['task1', 'task2',
'fail reverted(Failure: exceptions.RuntimeError: Woot!)', 'fail reverted(Failure: RuntimeError: Woot!)',
'task2 reverted(5)', 'task1 reverted(5)']) 'task2 reverted(5)', 'task1 reverted(5)'])
@@ -540,7 +540,7 @@ class EngineGraphFlowTest(EngineTestBase):
self.assertEquals( self.assertEquals(
self.values, self.values,
['task1', 'task2', ['task1', 'task2',
'task3 reverted(Failure: exceptions.RuntimeError: Woot!)', 'task3 reverted(Failure: RuntimeError: Woot!)',
'task2 reverted(5)', 'task1 reverted(5)']) 'task2 reverted(5)', 'task1 reverted(5)'])
def test_graph_flow_four_tasks_revert_failure(self): def test_graph_flow_four_tasks_revert_failure(self):
@@ -634,7 +634,7 @@ class SuspendFlowTest(EngineTestBase):
self.assertEquals( self.assertEquals(
self.values, self.values,
['a', 'b', ['a', 'b',
'c reverted(Failure: exceptions.RuntimeError: Woot!)', 'c reverted(Failure: RuntimeError: Woot!)',
'b reverted(5)']) 'b reverted(5)'])
with self.assertRaisesRegexp(RuntimeError, '^Woot'): with self.assertRaisesRegexp(RuntimeError, '^Woot'):
engine.run() engine.run()
@@ -643,7 +643,7 @@ class SuspendFlowTest(EngineTestBase):
self.values, self.values,
['a', ['a',
'b', 'b',
'c reverted(Failure: exceptions.RuntimeError: Woot!)', 'c reverted(Failure: RuntimeError: Woot!)',
'b reverted(5)', 'b reverted(5)',
'a reverted(5)']) 'a reverted(5)'])
@@ -852,7 +852,7 @@ class MultiThreadedEngineTest(EngineTaskTest,
'task1', 'task1 reverted(5)', 'task1', 'task1 reverted(5)',
'task2', 'task2 reverted(5)', 'task2', 'task2 reverted(5)',
'task3', 'task3 reverted(5)', 'task3', 'task3 reverted(5)',
'fail reverted(Failure: exceptions.RuntimeError: Woot!)' 'fail reverted(Failure: RuntimeError: Woot!)'
]) ])
self.assertIsSubset(possible_result, result) self.assertIsSubset(possible_result, result)

View File

@@ -19,6 +19,7 @@
import sys import sys
from taskflow import test from taskflow import test
from taskflow.tests import utils as test_utils
from taskflow.utils import lock_utils from taskflow.utils import lock_utils
from taskflow.utils import misc from taskflow.utils import misc
from taskflow.utils import reflection from taskflow.utils import reflection
@@ -149,9 +150,13 @@ class AcceptsKwargsTest(test.TestCase):
class GetClassNameTest(test.TestCase): class GetClassNameTest(test.TestCase):
def test_std_class(self): def test_std_exception(self):
name = reflection.get_class_name(RuntimeError) name = reflection.get_class_name(RuntimeError)
self.assertEquals(name, 'exceptions.RuntimeError') self.assertEquals(name, 'RuntimeError')
def test_global_class(self):
name = reflection.get_class_name(misc.Failure)
self.assertEquals(name, 'taskflow.utils.misc.Failure')
def test_class(self): def test_class(self):
name = reflection.get_class_name(Class) name = reflection.get_class_name(Class)
@@ -163,27 +168,19 @@ class GetClassNameTest(test.TestCase):
def test_int(self): def test_int(self):
name = reflection.get_class_name(42) name = reflection.get_class_name(42)
self.assertEquals(name, '__builtin__.int') self.assertEquals(name, 'int')
class GetAllClassNamesTest(test.TestCase): class GetAllClassNamesTest(test.TestCase):
def test_std_class(self): def test_std_class(self):
names = list(reflection.get_all_class_names(RuntimeError)) names = list(reflection.get_all_class_names(RuntimeError))
self.assertEquals(names, [ self.assertEquals(names, test_utils.RUNTIME_ERROR_CLASSES)
'exceptions.RuntimeError',
'exceptions.StandardError',
'exceptions.Exception',
'exceptions.BaseException',
'__builtin__.object'])
def test_std_class_up_to(self): def test_std_class_up_to(self):
names = list(reflection.get_all_class_names(RuntimeError, names = list(reflection.get_all_class_names(RuntimeError,
up_to=Exception)) up_to=Exception))
self.assertEquals(names, [ self.assertEquals(names, test_utils.RUNTIME_ERROR_CLASSES[:-2])
'exceptions.RuntimeError',
'exceptions.StandardError',
'exceptions.Exception'])
class ExcInfoUtilsTest(test.TestCase): class ExcInfoUtilsTest(test.TestCase):

View File

@@ -19,6 +19,7 @@
from taskflow import exceptions from taskflow import exceptions
from taskflow import test from taskflow import test
from taskflow.tests import utils as test_utils
from taskflow.utils import misc from taskflow.utils import misc
@@ -37,20 +38,18 @@ class GeneralFailureObjTestsMixin(object):
def test_str(self): def test_str(self):
self.assertEquals(str(self.fail_obj), self.assertEquals(str(self.fail_obj),
'Failure: exceptions.RuntimeError: Woot!') 'Failure: RuntimeError: Woot!')
def test_exception_types(self): def test_exception_types(self):
self.assertEquals(list(self.fail_obj), self.assertEquals(list(self.fail_obj),
['exceptions.RuntimeError', test_utils.RUNTIME_ERROR_CLASSES[:-2])
'exceptions.StandardError',
'exceptions.Exception'])
def test_check_str(self): def test_check_str(self):
val = 'exceptions.StandardError' val = 'Exception'
self.assertEquals(self.fail_obj.check(val), val) self.assertEquals(self.fail_obj.check(val), val)
def test_check_str_not_there(self): def test_check_str_not_there(self):
val = 'exceptions.ValueError' val = 'ValueError'
self.assertEquals(self.fail_obj.check(val), None) self.assertEquals(self.fail_obj.check(val), None)
def test_check_type(self): def test_check_type(self):
@@ -115,7 +114,7 @@ class FailureObjectTestCase(test.TestCase):
misc.Failure( misc.Failure(
exception_str='Woot!', exception_str='Woot!',
traceback_str=None, traceback_str=None,
exc_type_names=['exceptions.Exception'], exc_type_names=['Exception'],
hi='hi there') hi='hi there')
expected = "Failure.__init__ got unexpected keyword argument: 'hi'" expected = "Failure.__init__ got unexpected keyword argument: 'hi'"
self.assertEquals(str(ctx.exception), expected) self.assertEquals(str(ctx.exception), expected)

View File

@@ -16,6 +16,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import six
from taskflow import task from taskflow import task
ARGS_KEY = '__args__' ARGS_KEY = '__args__'
@@ -75,17 +77,19 @@ class ProvidesRequiresTask(task.Task):
ARGS_KEY: args, ARGS_KEY: args,
}) })
if self.return_tuple: if self.return_tuple:
outs = [] return tuple(range(len(self.provides)))
for i in xrange(0, len(self.provides)):
outs.append(i)
return tuple(outs)
else: else:
outs = {} return dict((k, k) for k in self.provides)
for k in self.provides:
outs[k] = k
return outs
class DummyTask(task.Task): class DummyTask(task.Task):
def execute(self, context, *args, **kwargs): def execute(self, context, *args, **kwargs):
pass pass
if six.PY3:
RUNTIME_ERROR_CLASSES = ['RuntimeError', 'Exception',
'BaseException', 'object']
else:
RUNTIME_ERROR_CLASSES = ['RuntimeError', 'StandardError', 'Exception',
'BaseException', 'object']

View File

@@ -17,6 +17,7 @@
# under the License. # under the License.
import inspect import inspect
import six
import types import types
@@ -25,9 +26,12 @@ def get_class_name(obj):
If object is a type, fully qualified name of the type is returned. If object is a type, fully qualified name of the type is returned.
Else, fully qualified name of the type of the object is returned. Else, fully qualified name of the type of the object is returned.
For builtin types, just name is returned.
""" """
if not isinstance(obj, type): if not isinstance(obj, six.class_types):
obj = type(obj) obj = type(obj)
if obj.__module__ in ('builtins', '__builtin__', 'exceptions'):
return obj.__name__
return '.'.join((obj.__module__, obj.__name__)) return '.'.join((obj.__module__, obj.__name__))