From c736b80290dfd650bee0fa3c530da65792dcde32 Mon Sep 17 00:00:00 2001 From: Marc Tamlyn Date: Mon, 7 Jan 2013 12:52:20 +0000 Subject: [PATCH] Be more informative when reporting import errors. --- rest_framework/settings.py | 4 ++-- rest_framework/tests/extras/__init__.py | 0 rest_framework/tests/extras/bad_import.py | 1 + rest_framework/tests/settings.py | 21 +++++++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 rest_framework/tests/extras/__init__.py create mode 100644 rest_framework/tests/extras/bad_import.py create mode 100644 rest_framework/tests/settings.py diff --git a/rest_framework/settings.py b/rest_framework/settings.py index ee24a4ad9..5c77c55cd 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -115,8 +115,8 @@ def import_from_string(val, setting_name): module_path, class_name = '.'.join(parts[:-1]), parts[-1] module = importlib.import_module(module_path) return getattr(module, class_name) - except: - msg = "Could not import '%s' for API setting '%s'" % (val, setting_name) + except ImportError as e: + msg = "Could not import '%s' for API setting '%s'. %s: %s." % (val, setting_name, e.__class__.__name__, e) raise ImportError(msg) diff --git a/rest_framework/tests/extras/__init__.py b/rest_framework/tests/extras/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/rest_framework/tests/extras/bad_import.py b/rest_framework/tests/extras/bad_import.py new file mode 100644 index 000000000..68263d947 --- /dev/null +++ b/rest_framework/tests/extras/bad_import.py @@ -0,0 +1 @@ +raise ValueError diff --git a/rest_framework/tests/settings.py b/rest_framework/tests/settings.py new file mode 100644 index 000000000..0293fdc3e --- /dev/null +++ b/rest_framework/tests/settings.py @@ -0,0 +1,21 @@ +"""Tests for the settings module""" +from django.test import TestCase + +from rest_framework.settings import APISettings, DEFAULTS, IMPORT_STRINGS + + +class TestSettings(TestCase): + """Tests relating to the api settings""" + + def test_non_import_errors(self): + """Make sure other errors aren't suppressed.""" + settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.bad_import.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) + with self.assertRaises(ValueError): + settings.DEFAULT_MODEL_SERIALIZER_CLASS + + def test_import_error_message_maintained(self): + """Make sure real import errors are captured and raised sensibly.""" + settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.not_here.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) + with self.assertRaises(ImportError) as cm: + settings.DEFAULT_MODEL_SERIALIZER_CLASS + self.assertTrue('ImportError' in str(cm.exception))