diff --git a/compressor/contrib/jinja2ext.py b/compressor/contrib/jinja2ext.py
index ffd3f53..a0ddbac 100644
--- a/compressor/contrib/jinja2ext.py
+++ b/compressor/contrib/jinja2ext.py
@@ -4,7 +4,7 @@ from jinja2.exceptions import TemplateSyntaxError
from django.core.exceptions import ImproperlyConfigured
from compressor.conf import settings
from compressor.utils import get_class
-from compressor.templatetags.compress import COMPRESSORS, OUTPUT_FILE
+from compressor.templatetags.compress import OUTPUT_FILE
from compressor.cache import (cache_get, cache_set,
get_templatetag_cachekey)
@@ -13,6 +13,13 @@ class CompressorExtension(Extension):
tags = set(['compress'])
+ @property
+ def compressors(self):
+ return {
+ 'js': settings.COMPRESS_JS_COMPRESSOR,
+ 'css': settings.COMPRESS_CSS_COMPRESSOR,
+ }
+
def parse(self, parser):
lineno = parser.stream.next().lineno
kindarg = parser.parse_expression()
@@ -20,9 +27,9 @@ class CompressorExtension(Extension):
if isinstance(kindarg, nodes.Name):
kindarg = nodes.Const(kindarg.name)
args = [kindarg]
- if args[0].value not in COMPRESSORS:
- raise TemplateSyntaxError('compress kind may be "css" or "js"',
- lineno)
+ if args[0].value not in self.compressors:
+ raise TemplateSyntaxError('compress kind may be one of: %s'
+ % (', '.join(self.compressors.keys())), lineno)
if parser.stream.skip_if('comma'):
modearg = parser.parse_expression()
# Allow mode to be defined as jinja2 name node
@@ -37,7 +44,7 @@ class CompressorExtension(Extension):
def _compress(self, kind, mode, caller):
mode = mode or OUTPUT_FILE
- Compressor = get_class(COMPRESSORS.get(kind),
+ Compressor = get_class(self.compressors.get(kind),
exception=ImproperlyConfigured)
original_content = caller()
compressor = Compressor(original_content)
diff --git a/tests/tests/__init__.py b/tests/tests/__init__.py
index b77ee0a..d800c50 100644
--- a/tests/tests/__init__.py
+++ b/tests/tests/__init__.py
@@ -1,5 +1,6 @@
from .base import CompressorTestCase, CssMediaTestCase, VerboseTestCase, CacheBackendTestCase
from .filters import CssTidyTestCase, PrecompilerTestCase, CssMinTestCase, CssAbsolutizingTestCase, CssDataUriTestCase
+from .jinja2ext import TestJinja2CompressorExtension
from .offline import OfflineGenerationTestCase
from .parsers import LxmlParserTests, Html5LibParserTests, BeautifulSoupParserTests, HtmlParserTests
from .signals import PostCompressSignalTestCase
diff --git a/tests/tests/jinja2ext.py b/tests/tests/jinja2ext.py
new file mode 100644
index 0000000..2abd5a1
--- /dev/null
+++ b/tests/tests/jinja2ext.py
@@ -0,0 +1,133 @@
+from django.test import TestCase
+from compressor.conf import settings
+from unittest2 import skipIf
+from .base import css_tag
+
+
+try:
+ import jinja2
+except ImportError:
+ jinja2 = None
+
+
+class TestJinja2CompressorExtension(TestCase):
+ """
+ Test case for jinja2 extension.
+
+ .. note::
+ At tests we need to make some extra care about whitespace. Please note
+ that we use jinja2 specific controls (*minus* character at block's
+ beginning or end). For more information see jinja2 documentation.
+ """
+
+ def assertStrippedEqual(self, result, expected):
+ self.assertEqual(result.strip(), expected.strip(), "%r != %r" % (
+ result.strip(), expected.strip()))
+
+ def setUp(self):
+ from compressor.contrib.jinja2ext import CompressorExtension
+ self.env = jinja2.Environment(extensions=[CompressorExtension])
+
+ def test_error_raised_if_no_arguments_given(self):
+ with self.assertRaises(jinja2.exceptions.TemplateSyntaxError):
+ self.env.from_string('{% compress %}Foobar{% endcompress %}')
+
+ def test_error_raised_if_wrong_kind_given(self):
+ with self.assertRaises(jinja2.exceptions.TemplateSyntaxError):
+ self.env.from_string('{% compress foo %}Foobar{% endcompress %}'
+ ).render()
+
+ def test_error_raised_if_wrong_mode_given(self):
+ with self.assertRaises(jinja2.exceptions.TemplateSyntaxError):
+ self.env.from_string('{% compress css foo %}Foobar{% endcompress %}'
+ ).render()
+
+ def test_compress_is_disabled(self):
+ org_COMPRESS_ENABLED = settings.COMPRESS_ENABLED
+ settings.COMPRESS_ENABLED = False
+ tag_body = '\n'.join([
+ '',
+ '',
+ '',
+ ])
+ template_string = '{% compress css %}' + tag_body + '{% endcompress %}'
+ template = self.env.from_string(template_string)
+ self.assertEqual(tag_body, template.render())
+ settings.COMPRESS_ENABLED = org_COMPRESS_ENABLED
+
+ def test_empty_tag(self):
+ template = self.env.from_string(u"""{% compress js %}{% block js %}
+ {% endblock %}{% endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ self.assertEqual(u'', template.render(context))
+
+ def test_css_tag(self):
+ template = self.env.from_string(u"""{% compress css -%}
+
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = css_tag("/media/CACHE/css/e41ba2cc6982.css")
+ self.assertEqual(out, template.render(context))
+
+ def test_nonascii_css_tag(self):
+ template = self.env.from_string(u"""{% compress css -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = css_tag("/media/CACHE/css/799f6defe43c.css")
+ self.assertEqual(out, template.render(context))
+
+ def test_js_tag(self):
+ template = self.env.from_string(u"""{% compress js -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = u''
+ self.assertEqual(out, template.render(context))
+
+ def test_nonascii_js_tag(self):
+ template = self.env.from_string(u"""{% compress js -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = u''
+ self.assertEqual(out, template.render(context))
+
+ def test_nonascii_latin1_js_tag(self):
+ template = self.env.from_string(u"""{% compress js -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = u''
+ self.assertEqual(out, template.render(context))
+
+ def test_css_inline(self):
+ template = self.env.from_string(u"""{% compress css, inline -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = '\n'.join([
+ '',
+ ])
+ self.assertEqual(out, template.render(context))
+
+ def test_js_inline(self):
+ template = self.env.from_string(u"""{% compress js, inline -%}
+
+
+ {%- endcompress %}""")
+ context = {'MEDIA_URL': settings.COMPRESS_URL }
+ out = ''
+ self.assertEqual(out, template.render(context))
+
+TestJinja2CompressorExtension = skipIf(jinja2 is None, 'jinja2 not found')(
+ TestJinja2CompressorExtension)
+