Merge pull request #571 from blueyed/handle-typerror-from-import_module

Handle TypeError from import_module
This commit is contained in:
Mathieu Pillard
2015-03-19 17:24:02 +01:00
6 changed files with 34 additions and 7 deletions

View File

@@ -253,7 +253,7 @@ class Compressor(object):
mod_name, cls_name = get_mod_func(filter_or_command) mod_name, cls_name = get_mod_func(filter_or_command)
try: try:
mod = import_module(mod_name) mod = import_module(mod_name)
except ImportError: except (ImportError, TypeError):
filter = CompilerFilter( filter = CompilerFilter(
content, filter_type=self.type, filename=filename, content, filter_type=self.type, filename=filename,
charset=charset, command=filter_or_command) charset=charset, command=filter_or_command)

View File

@@ -49,7 +49,7 @@ def get_cachekey(*args, **kwargs):
mod_name, func_name = get_mod_func( mod_name, func_name = get_mod_func(
settings.COMPRESS_CACHE_KEY_FUNCTION) settings.COMPRESS_CACHE_KEY_FUNCTION)
_cachekey_func = getattr(import_module(mod_name), func_name) _cachekey_func = getattr(import_module(mod_name), func_name)
except (AttributeError, ImportError) as e: except (AttributeError, ImportError, TypeError) as e:
raise ImportError("Couldn't import cache key function %s: %s" % raise ImportError("Couldn't import cache key function %s: %s" %
(settings.COMPRESS_CACHE_KEY_FUNCTION, e)) (settings.COMPRESS_CACHE_KEY_FUNCTION, e))
return _cachekey_func(*args, **kwargs) return _cachekey_func(*args, **kwargs)

View File

@@ -83,7 +83,7 @@ class CallbackOutputFilter(FilterBase):
try: try:
mod_name, func_name = get_mod_func(self.callback) mod_name, func_name = get_mod_func(self.callback)
func = getattr(import_module(mod_name), func_name) func = getattr(import_module(mod_name), func_name)
except ImportError: except (ImportError, TypeError):
if self.dependencies: if self.dependencies:
if len(self.dependencies) == 1: if len(self.dependencies) == 1:
warning = "dependency (%s) is" % self.dependencies[0] warning = "dependency (%s) is" % self.dependencies[0]

View File

@@ -137,7 +137,7 @@ class Command(NoArgsCommand):
if get_template_sources is None: if get_template_sources is None:
get_template_sources = loader.get_template_sources get_template_sources = loader.get_template_sources
paths.update(list(get_template_sources(''))) paths.update(list(get_template_sources('')))
except (ImportError, AttributeError): except (ImportError, AttributeError, TypeError):
# Yeah, this didn't work out so well, let's move on # Yeah, this didn't work out so well, let's move on
pass pass
if not paths: if not paths:

View File

@@ -33,5 +33,5 @@ class AutoSelectParser(LazyObject):
import_module(dependency) import_module(dependency)
self._wrapped = parser(content) self._wrapped = parser(content)
break break
except ImportError: except (ImportError, TypeError):
continue continue

View File

@@ -12,11 +12,13 @@ from django.core.cache.backends import locmem
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from compressor.base import SOURCE_HUNK, SOURCE_FILE from compressor import cache as cachemod
from compressor.base import SOURCE_FILE, SOURCE_HUNK
from compressor.cache import get_cachekey
from compressor.conf import settings from compressor.conf import settings
from compressor.css import CssCompressor from compressor.css import CssCompressor
from compressor.exceptions import FilterDoesNotExist, FilterError
from compressor.js import JsCompressor from compressor.js import JsCompressor
from compressor.exceptions import FilterDoesNotExist
def make_soup(markup): def make_soup(markup):
@@ -216,6 +218,14 @@ class CompressorTestCase(SimpleTestCase):
css_node = CssCompressor(css) css_node = CssCompressor(css)
self.assertRaises(FilterDoesNotExist, css_node.output, 'inline') self.assertRaises(FilterDoesNotExist, css_node.output, 'inline')
@override_settings(COMPRESS_PRECOMPILERS=(
('text/foobar', './foo -I ./bar/baz'),
), COMPRESS_ENABLED=True)
def test_command_with_dot_precompiler(self):
css = '<style type="text/foobar">p { border:10px solid red;}</style>'
css_node = CssCompressor(css)
self.assertRaises(FilterError, css_node.output, 'inline')
class CssMediaTestCase(SimpleTestCase): class CssMediaTestCase(SimpleTestCase):
def setUp(self): def setUp(self):
@@ -304,3 +314,20 @@ class JsAsyncDeferTestCase(SimpleTestCase):
scripts = make_soup(js_node.output()).findAll('script') scripts = make_soup(js_node.output()).findAll('script')
attrs = [s.get('async') or s.get('defer') for s in scripts] attrs = [s.get('async') or s.get('defer') for s in scripts]
self.assertEqual(output, attrs) self.assertEqual(output, attrs)
class CacheTestCase(SimpleTestCase):
def setUp(self):
cachemod._cachekey_func = None
def test_get_cachekey_basic(self):
self.assertEqual(get_cachekey("foo"), "django_compressor.foo")
@override_settings(COMPRESS_CACHE_KEY_FUNCTION='.leading.dot')
def test_get_cachekey_leading_dot(self):
self.assertRaises(ImportError, lambda: get_cachekey("foo"))
@override_settings(COMPRESS_CACHE_KEY_FUNCTION='invalid.module')
def test_get_cachekey_invalid_mod(self):
self.assertRaises(ImportError, lambda: get_cachekey("foo"))