From 9a1738f05e79cced20f1a6a847cdd5b392d031d7 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 15 Oct 2014 20:03:14 +0200 Subject: [PATCH] Handle TypeError from import_module Fixes #569 --- compressor/base.py | 2 +- compressor/cache.py | 2 +- compressor/filters/base.py | 2 +- compressor/management/commands/compress.py | 2 +- compressor/parser/__init__.py | 2 +- compressor/tests/test_base.py | 31 ++++++++++++++++++++-- 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/compressor/base.py b/compressor/base.py index 528b602..54b16f3 100644 --- a/compressor/base.py +++ b/compressor/base.py @@ -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) diff --git a/compressor/cache.py b/compressor/cache.py index 94a64fd..f80bf54 100644 --- a/compressor/cache.py +++ b/compressor/cache.py @@ -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) diff --git a/compressor/filters/base.py b/compressor/filters/base.py index c101347..ee14b82 100644 --- a/compressor/filters/base.py +++ b/compressor/filters/base.py @@ -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] diff --git a/compressor/management/commands/compress.py b/compressor/management/commands/compress.py index 6be215e..f60994f 100644 --- a/compressor/management/commands/compress.py +++ b/compressor/management/commands/compress.py @@ -130,7 +130,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: diff --git a/compressor/parser/__init__.py b/compressor/parser/__init__.py index e935658..19beb01 100644 --- a/compressor/parser/__init__.py +++ b/compressor/parser/__init__.py @@ -33,5 +33,5 @@ class AutoSelectParser(LazyObject): import_module(dependency) self._wrapped = parser(content) break - except ImportError: + except (ImportError, TypeError): continue diff --git a/compressor/tests/test_base.py b/compressor/tests/test_base.py index 67dab7c..e8255db 100644 --- a/compressor/tests/test_base.py +++ b/compressor/tests/test_base.py @@ -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 = '' + 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"))