diff --git a/raven/utils/imports.py b/raven/utils/imports.py index 0b1a009b..56ef18a7 100644 --- a/raven/utils/imports.py +++ b/raven/utils/imports.py @@ -1,10 +1,16 @@ from __future__ import absolute_import +from . import six + def import_string(key): + # HACK(dcramer): Ensure a unicode key is still importable + if not six.PY3: + key = str(key) + if '.' not in key: return __import__(key) module_name, class_name = key.rsplit('.', 1) - module = __import__(module_name, {}, {}, [class_name]) + module = __import__(module_name, {}, {}, [class_name], 0) return getattr(module, class_name) diff --git a/tests/utils/test_imports.py b/tests/utils/test_imports.py new file mode 100644 index 00000000..e131abc6 --- /dev/null +++ b/tests/utils/test_imports.py @@ -0,0 +1,22 @@ +from __future__ import absolute_import + +import raven + +from raven.utils import six +from raven.utils.imports import import_string + + +def test_import_string(): + new_raven = import_string('raven') + assert new_raven is raven + + # this will test unicode on python2 + new_raven = import_string(six.text_type('raven')) + assert new_raven is raven + + new_client = import_string('raven.Client') + assert new_client is raven.Client + + # this will test unicode on python2 + new_client = import_string(six.text_type('raven.Client')) + assert new_client is raven.Client