2 new revisions:
Revision: 580a0b70245f
Author: Pekka Klärck
Date: Mon Jan 2 06:30:01 2012
Log: it seems modules can have None as __name__
http://code.google.com/p/robotframework/source/detail?r=580a0b70245f
Revision: 4b5ea3acf3a9
Author: Pekka Klärck
Date: Mon Jan 2 06:32:09 2012
Log: tests for traceback in import error messages
http://code.google.com/p/robotframework/source/detail?r=4b5ea3acf3a9
==============================================================================
Revision: 580a0b70245f
Author: Pekka Klärck
Date: Mon Jan 2 06:30:01 2012
Log: it seems modules can have None as __name__
http://code.google.com/p/robotframework/source/detail?r=580a0b70245f
Modified:
/src/robot/utils/error.py
=======================================
--- /src/robot/utils/error.py Mon Jan 2 05:49:37 2012
+++ /src/robot/utils/error.py Mon Jan 2 06:30:01 2012
@@ -132,8 +132,8 @@
return ''.join(traceback.format_tb(tb)).rstrip() or ' None'
def _is_excluded_traceback(self, traceback):
- module = traceback.tb_frame.f_globals['__name__']
- return module.startswith('robot.')
+ module = traceback.tb_frame.f_globals.get('__name__')
+ return module and module.startswith('robot.')
class JavaErrorDetails(_ErrorDetails):
==============================================================================
Revision: 4b5ea3acf3a9
Author: Pekka Klärck
Date: Mon Jan 2 06:32:09 2012
Log: tests for traceback in import error messages
http://code.google.com/p/robotframework/source/detail?r=4b5ea3acf3a9
Modified:
/src/robot/utils/importer.py
/utest/utils/test_importer_util.py
=======================================
--- /src/robot/utils/importer.py Mon Jan 2 04:08:53 2012
+++ /src/robot/utils/importer.py Mon Jan 2 06:32:09 2012
@@ -26,7 +26,6 @@
# TODO:
-# - test and possibly prune tracebacks
# - test PYTHONPATH and CLASSPATH
# - acceptance tests for issue 979
# - test can variable files be implemented with java/python classes
nowadays
@@ -100,6 +99,11 @@
msg.extend(self._get_items_in('CLASSPATH', classpath))
raise DataError('\n'.join(msg))
+ def _get_items_in(self, type, items):
+ yield '%s:' % type
+ for item in items:
+ yield ' %s' % item
+
def _log_import_succeeded(self, item, name, source):
if self._logger:
import_type = '%s ' % self._type if self._type else ''
@@ -108,11 +112,6 @@
self._logger.info("Imported %s%s '%s' from %s."
% (import_type, item_type, name, location))
- def _get_items_in(self, type, items):
- yield '%s:' % type
- for item in items:
- yield ' %s' % item
-
class _Importer(object):
=======================================
--- /utest/utils/test_importer_util.py Sun Jan 1 15:10:26 2012
+++ /utest/utils/test_importer_util.py Mon Jan 2 06:32:09 2012
@@ -23,6 +23,15 @@
prefix = ':'.join(unicode(error).split(':')[:2]) + ':'
assert_equals(prefix, expected)
+def create_temp_file(name, attr=42, extra_content=''):
+ if not exists(TESTDIR):
+ os.mkdir(TESTDIR)
+ path = join(TESTDIR, name)
+ with open(path, 'w') as file:
+ file.write('attr = %r\n' % attr)
+ file.write('def func():\n return attr\n')
+ file.write(extra_content)
+ return path
class LoggerStub(object):
@@ -44,39 +53,38 @@
def setUp(self):
self.tearDown()
- os.mkdir(TESTDIR)
def tearDown(self):
if exists(TESTDIR):
shutil.rmtree(TESTDIR)
def test_python_file(self):
- path = self._create_file('test.py')
+ path = create_temp_file('test.py')
self._import_and_verify(path)
def test_python_directory(self):
- self._create_file('__init__.py')
+ create_temp_file('__init__.py')
self._import_and_verify(TESTDIR + os.sep)
def test_import_different_file_with_same_name(self):
- path1 = self._create_file('test.py', attr=1)
+ path1 = create_temp_file('test.py', attr=1)
self._import_and_verify(path1, attr=1)
path2 = join(TESTDIR, 'test')
os.mkdir(path2)
- self._create_file(join(path2, '__init__.py'), attr=2)
+ create_temp_file(join(path2, '__init__.py'), attr=2)
self._import_and_verify(path2 + '/', attr=2, directory=path2)
- path3 = self._create_file(join(path2, 'test.py'), attr=3)
+ path3 = create_temp_file(join(path2, 'test.py'), attr=3)
self._import_and_verify(path3, attr=3, directory=path2)
def test_import_class_from_file(self):
- path = self._create_file('test.py', extra_content='class test:\n
def m(s): return 1')
+ path = create_temp_file('test.py', extra_content='class test:\n
def m(s): return 1')
klass = Importer().import_class_or_module_by_path(path)
assert_true(inspect.isclass(klass))
assert_equals(klass.__name__, 'test')
assert_equals(klass().m(), 1)
def test_invalid_python_file(self):
- path = self._create_file('test.py', extra_content='invalid
content')
+ path = create_temp_file('test.py', extra_content='invalid content')
error = assert_raises(DataError, self._import_and_verify, path)
assert_prefix(error, "Importing '%s' failed: SyntaxError:" % path)
@@ -111,14 +119,6 @@
Importer('java', logger).import_class_or_module_by_path(path)
logger.assert_message("Imported java class 'ImportByPath'
from '%s'." % path)
- def _create_file(self, name, attr=42, extra_content=''):
- path = join(TESTDIR, name)
- with open(path, 'w') as file:
- file.write('attr = %r\n' % attr)
- file.write('def func():\n return attr\n')
- file.write(extra_content)
- return path
-
def _import_and_verify(self, path, attr=42, directory=TESTDIR):
module = self._import(path)
assert_equals(module.attr, attr)
@@ -288,5 +288,38 @@
return Importer(type, logger).import_class_or_module(name)
+class TestTraceback(unittest.TestCase):
+
+ def test_no_traceback(self):
+ error = self._failing_import('NoneExisting')
+ traceback = '\n'.join(self._yield_traceback_lines(unicode(error)))
+ assert_equals(traceback, 'Traceback (most recent call last):\n
None')
+
+ def test_traceback(self):
+ path = create_temp_file('tb.py', extra_content='import nonex')
+ try:
+ error = self._failing_import(path)
+ finally:
+ shutil.rmtree(TESTDIR)
+ traceback = '\n'.join(self._yield_traceback_lines(unicode(error)))
+ assert_equals(traceback, 'Traceback (most recent call last):\n'
+ ' File "%s", line 4, in <module>\n'
+ ' import nonex' % path)
+
+ def _failing_import(self, name):
+ importer = Importer().import_class_or_module
+ return assert_raises(DataError, importer, name)
+
+ def _yield_traceback_lines(self, message):
+ include = False
+ for line in message.splitlines():
+ if line == 'PYTHONPATH:':
+ return
+ if line == 'Traceback (most recent call last):':
+ include = True
+ if include:
+ yield line
+
+
if __name__ == '__main__':
unittest.main()