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)
try:
mod = import_module(mod_name)
except ImportError:
except (ImportError, TypeError):
filter = CompilerFilter(
content, filter_type=self.type, filename=filename,
charset=charset, command=filter_or_command)

View File

@@ -49,7 +49,7 @@ def get_cachekey(*args, **kwargs):
mod_name, func_name = get_mod_func(
settings.COMPRESS_CACHE_KEY_FUNCTION)
_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" %
(settings.COMPRESS_CACHE_KEY_FUNCTION, e))
return _cachekey_func(*args, **kwargs)

View File

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

View File

@@ -137,7 +137,7 @@ class Command(NoArgsCommand):
if get_template_sources is None:
get_template_sources = loader.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
pass
if not paths:

View File

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

View File

@@ -12,11 +12,13 @@ from django.core.cache.backends import locmem
from django.test import SimpleTestCase
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.css import CssCompressor
from compressor.exceptions import FilterDoesNotExist, FilterError
from compressor.js import JsCompressor
from compressor.exceptions import FilterDoesNotExist
def make_soup(markup):
@@ -216,6 +218,14 @@ class CompressorTestCase(SimpleTestCase):
css_node = CssCompressor(css)
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):
def setUp(self):
@@ -304,3 +314,20 @@ class JsAsyncDeferTestCase(SimpleTestCase):
scripts = make_soup(js_node.output()).findAll('script')
attrs = [s.get('async') or s.get('defer') for s in scripts]
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"))