Пример #1
0
    def setUp(self):
        super(Html5LibParserTests, self).setUp()
        # special version of the css since the parser sucks
        self.css = """\
<link href="/media/css/one.css" rel="stylesheet" type="text/css">
<style type="text/css">p { border:5px solid green;}</style>
<link href="/media/css/two.css" rel="stylesheet" type="text/css">"""
        self.css_node = CssCompressor(self.css)
Пример #2
0
 def setUp(self):
     self.css = """
     <link rel="stylesheet" href="/media/css/one.css" type="text/css" media="screen" charset="utf-8">
     <style type="text/css" media="print">p { border:5px solid green;}</style>
     <link rel="stylesheet" href="/media/css/two.css" type="text/css" charset="utf-8" media="all">
     <style type="text/css">h1 { border:5px solid green;}</style>
     """
     self.css_node = CssCompressor(self.css)
    def helper(self, enabled, use_precompiler, use_absolute_filter, expected_output):
        precompiler = (('text/css', 'compressor.tests.test_base.PassthroughPrecompiler'),) if use_precompiler else ()
        filters = ('compressor.filters.css_default.CssAbsoluteFilter',) if use_absolute_filter else ()

        with self.settings(COMPRESS_ENABLED=enabled, COMPRESS_PRECOMPILERS=precompiler, COMPRESS_CSS_FILTERS=filters):
            css_node = CssCompressor(self.html_orig)
            output = list(css_node.hunks())[0]
            self.assertEqual(output, expected_output)
Пример #4
0
 def setUp(self):
     self.old_hashing_method = settings.COMPRESS_CSS_HASHING_METHOD
     settings.COMPRESS_CSS_HASHING_METHOD = self.hashing_method
     self.css = """
     <link rel="stylesheet" href="/static/css/url/url1.css" type="text/css">
     <link rel="stylesheet" href="/static/css/url/2/url2.css" type="text/css">
     """
     self.css_node = CssCompressor(self.css)
Пример #5
0
 def setUp(self):
     settings.COMPRESS_ENABLED = True
     settings.COMPRESS_URL = '/media/'
     self.css = """
     <link rel="stylesheet" href="/media/css/url/url1.css" type="text/css" charset="utf-8">
     <link rel="stylesheet" href="/media/css/url/2/url2.css" type="text/css" charset="utf-8">
     """
     self.css_node = CssCompressor(self.css)
Пример #6
0
 def test_avoid_reordering_css(self):
     css = (
         self.css +
         '<style type="text/css" media="print">p { border:10px solid red;}</style>'
     )
     css_node = CssCompressor(css)
     media = ["screen", "print", "all", None, "print"]
     links = make_soup(css_node.output()).find_all("link")
     self.assertEqual(media, [l.get("media", None) for l in links])
Пример #7
0
 def setUp(self):
     settings.COMPRESS_ENABLED = True
     settings.COMPRESS_URL = '/media/'
     settings.COMPRESS_CSS_HASHING_METHOD = 'mtime'
     self.css = """
     <link rel="stylesheet" href="/media/css/url/url1.css" type="text/css">
     <link rel="stylesheet" href="/media/css/url/2/url2.css" type="text/css">
     """
     self.css_node = CssCompressor(self.css)
Пример #8
0
 def test_avoid_reordering_css(self):
     css = self.css + '<style type="text/css" media="print">p { border:10px solid red;}</style>'
     css_node = CssCompressor(css)
     media = ['screen', 'print', 'all', None, 'print']
     if six.PY3:
         links = make_soup(css_node.output()).find_all('link')
     else:
         links = make_soup(css_node.output()).findAll('link')
     self.assertEqual(media, [l.get('media', None) for l in links])
Пример #9
0
 def test_css_output(self):
     css_node = CssCompressor(self.css)
     if six.PY3:
         links = make_soup(css_node.output()).find_all('link')
     else:
         links = make_soup(css_node.output()).findAll('link')
     media = ['screen', 'print', 'all', None]
     self.assertEqual(len(links), 4)
     self.assertEqual(media, [l.get('media', None) for l in links])
Пример #10
0
 def test_css_output_with_bom_input(self):
     out = 'body { background:#990; }\n.compress-test {color: red;}'
     css = (
         """<link rel="stylesheet" href="/static/css/one.css" type="text/css" />
     <link rel="stylesheet" href="/static/css/utf-8_with-BOM.css" type="text/css" />"""
     )
     css_node_with_bom = CssCompressor('css', css)
     hunks = '\n'.join([h for h in css_node_with_bom.hunks()])
     self.assertEqual(out, hunks)
Пример #11
0
    def setUp(self):
        self.override_settings = self.settings(
            COMPRESS_CSS_HASHING_METHOD=self.hashing_method)
        self.override_settings.__enter__()

        self.css = """
        <link rel="stylesheet" href="/static/css/url/url1.css" type="text/css">
        <link rel="stylesheet" href="/static/css/url/2/url2.css" type="text/css">
        """
        self.css_node = CssCompressor(self.css)
Пример #12
0
    def test_passthough_when_compress_disabled(self):
        css = """\
<link rel="stylesheet" href="/static/css/one.css" type="text/css" media="screen">
<link rel="stylesheet" href="/static/css/two.css" type="text/css" media="screen">
<style type="text/foobar" media="screen">h1 { border:5px solid green;}</style>"""
        css_node = CssCompressor(css)
        output = make_soup(css_node.output()).find_all(['link', 'style'])
        self.assertEqual(['/static/css/one.css', '/static/css/two.css', None],
                         [l.get('href', None) for l in output])
        self.assertEqual(['screen', 'screen', 'screen'],
                         [l.get('media', None) for l in output])
Пример #13
0
    def setUp(self):
        self.css = """\
<link rel="stylesheet" href="/static/css/one.css" type="text/css" />
<style type="text/css">p { border:5px solid green;}</style>
<link rel="stylesheet" href="/static/css/two.css" type="text/css" />"""
        self.css_node = CssCompressor(self.css)

        self.js = """\
<script src="/static/js/one.js" type="text/javascript"></script>
<script type="text/javascript">obj.value = "value";</script>"""
        self.js_node = JsCompressor(self.js)
Пример #14
0
 def setUp(self):
     settings.COMPRESS_ENABLED = True
     settings.COMPRESS_CSS_FILTERS = [
         'compressor.filters.css_default.CssAbsoluteFilter',
         'compressor.filters.datauri.CssDataUriFilter',
     ]
     settings.COMPRESS_URL = '/media/'
     self.css = """
     <link rel="stylesheet" href="/media/css/datauri.css" type="text/css" charset="utf-8">
     """
     self.css_node = CssCompressor(self.css)
Пример #15
0
 def test_nonexistent_precompiler_class_error(self):
     try:
         original_precompilers = settings.COMPRESS_PRECOMPILERS
         settings.COMPRESS_ENABLED = True
         settings.COMPRESS_PRECOMPILERS = (
             ('text/foobar', 'compressor.tests.test_base.NonexistentFilter'),
         )
         css = '<style type="text/foobar">p { border:10px solid red;}</style>'
         css_node = CssCompressor(css)
         self.assertRaises(FilterDoesNotExist, css_node.output, 'inline')
     finally:
         settings.COMPRESS_PRECOMPILERS = original_precompilers
Пример #16
0
 def setUp(self):
     settings.COMPRESS_ENABLED = True
     settings.COMPRESS_CSS_FILTERS = [
         'compressor.filters.css_default.CssAbsoluteFilter',
         'compressor.filters.datauri.CssDataUriFilter',
     ]
     settings.COMPRESS_URL = '/static/'
     settings.COMPRESS_CSS_HASHING_METHOD = 'mtime'
     self.css = """
     <link rel="stylesheet" href="/static/css/datauri.css" type="text/css">
     """
     self.css_node = CssCompressor(self.css)
Пример #17
0
    def test_css_signal_multiple_media_attributes(self):
        css = """\
<link rel="stylesheet" href="/static/css/one.css" media="handheld" type="text/css" />
<style type="text/css" media="print">p { border:5px solid green;}</style>
<link rel="stylesheet" href="/static/css/two.css" type="text/css">"""
        css_node = CssCompressor('css', css)

        def listener(sender, **kwargs):
            pass
        callback = Mock(wraps=listener)
        post_compress.connect(callback)
        css_node.output()
        self.assertEqual(3, callback.call_count)
Пример #18
0
 def test_precompiler_class_used(self):
     try:
         original_precompilers = settings.COMPRESS_PRECOMPILERS
         settings.COMPRESS_ENABLED = True
         settings.COMPRESS_PRECOMPILERS = (
             ('text/foobar', 'compressor.tests.test_base.TestPrecompiler'),
         )
         css = '<style type="text/foobar">p { border:10px solid red;}</style>'
         css_node = CssCompressor(css)
         output = BeautifulSoup(css_node.output('inline'))
         self.assertEqual(output.text, 'OUTPUT')
     finally:
         settings.COMPRESS_PRECOMPILERS = original_precompilers
Пример #19
0
    def setUp(self):
        settings.COMPRESS_ENABLED = True
        settings.COMPRESS_PRECOMPILERS = {}
        settings.COMPRESS_DEBUG_TOGGLE = 'nocompress'
        self.css = """\
<link rel="stylesheet" href="/media/css/one.css" type="text/css" />
<style type="text/css">p { border:5px solid green;}</style>
<link rel="stylesheet" href="/media/css/two.css" type="text/css" />"""
        self.css_node = CssCompressor(self.css)

        self.js = """\
<script src="/media/js/one.js" type="text/javascript"></script>
<script type="text/javascript">obj.value = "value";</script>"""
        self.js_node = JsCompressor(self.js)
Пример #20
0
    def setUp(self):
        settings.COMPRESS_ENABLED = True
        self.css = """
        <link rel="stylesheet" href="/media/css/one.css" type="text/css" charset="utf-8">
        <style type="text/css">p { border:5px solid green;}</style>
        <link rel="stylesheet" href="/media/css/two.css" type="text/css" charset="utf-8">
        """
        self.css_node = CssCompressor(self.css)

        self.js = """
        <script src="/media/js/one.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript" charset="utf-8">obj.value = "value";</script>
        """
        self.js_node = JsCompressor(self.js)
Пример #21
0
    def test_passthough_when_compress_disabled(self):
        original_precompilers = settings.COMPRESS_PRECOMPILERS
        settings.COMPRESS_ENABLED = False
        settings.COMPRESS_PRECOMPILERS = (
            ('text/foobar', 'python %s {infile} {outfile}' %
             os.path.join(test_dir, 'precompiler.py')), )
        css = """\
<link rel="stylesheet" href="/media/css/one.css" type="text/css" media="screen">
<link rel="stylesheet" href="/media/css/two.css" type="text/css" media="screen">
<style type="text/foobar" media="screen">h1 { border:5px solid green;}</style>"""
        css_node = CssCompressor(css)
        output = BeautifulSoup(css_node.output()).findAll(['link', 'style'])
        self.assertEqual([u'/media/css/one.css', u'/media/css/two.css', None],
                         [l.get('href', None) for l in output])
        self.assertEqual([u'screen', u'screen', u'screen'],
                         [l.get('media', None) for l in output])
        settings.COMPRESS_PRECOMPILERS = original_precompilers
Пример #22
0
    def setUp(self):
        settings.COMPRESS_ENABLED = True
        settings.COMPRESS_PRECOMPILERS = {}
        self.css = """\
<link rel="stylesheet" href="/media/css/one.css" type="text/css" />
<style type="text/css">p { border:5px solid green;}</style>
<link rel="stylesheet" href="/media/css/one.less" type="text/less" />
<link rel="stylesheet" href="/media/css/two.less" type="text/less" />"""
        self.css_node = CssCompressor(self.css)
        self.css_node.opts = {'group_first': 'true'}

        self.js = """\
<script src="/media/js/one.js" type="text/javascript"></script>
<script type="text/javascript">obj.value = "value";</script>
<script src="/media/js/one.coffee" type="text/coffeescript"></script>
<script src="/media/js/two.coffee" type="text/coffeescript"></script>"""
        self.js_node = JsCompressor(self.js)
Пример #23
0
 def test_css_single(self):
     css_node = CssCompressor(
         """<link rel="stylesheet" href="/media/css/one.css" type="text/css" />"""
     )
     css_node.opts = {'group_first': 'true'}
     out = [
         [
             SOURCE_FILE,
             os.path.join(settings.COMPRESS_ROOT, u'css',
                          u'one.css'), u'css/one.css',
             u'<link rel="stylesheet" href="/media/css/one.css" type="text/css" />'
         ],
     ]
     split = css_node.group_contents()
     split = [[
         x[0], x[1], x[2],
         make_elems_str(self.css_node.parser, x[3])
     ] for x in split]
     self.assertEqual(out, split)
Пример #24
0
 def render_tag(self, context, name, nodelist):
     request = context['request']
     rendered_contents = nodelist.render(context)
     content = request.media_holder[name].render()
     if settings.COMPRESS:
         if name == 'css':
             compressor = CssCompressor(content)
         elif name == 'js':
             compressor = JsCompressor(content)
         output = self.cache_get(compressor.cachekey)
         if output is None:
             try:
                 output = compressor.output()
                 self.cache_set(compressor.cachekey, output)
             except:
                 from traceback import format_exc
                 raise Exception(format_exc())
     else:
         output = content  # no compression
     return '%s\n%s' % (output, rendered_contents)
 def test_filename_in_debug_mode(self):
     # In debug mode, compressor should look for files using staticfiles
     # finders only, and not look into the global static directory, where
     # files can be outdated
     css_filename = os.path.join(settings.COMPRESS_ROOT, "css", "one.css")
     # Store the hash of the original file's content
     css_content = open(css_filename).read()
     hashed = get_hexdigest(css_content, 12)
     # Now modify the file in the STATIC_ROOT
     test_css_content = "p { font-family: 'test' }"
     with open(css_filename, "a") as css:
         css.write("\n")
         css.write(test_css_content)
     # We should generate a link with the hash of the original content, not
     # the modified one
     expected = '<link rel="stylesheet" href="/static/CACHE/css/%s.css" type="text/css" />' % hashed
     compressor = CssCompressor(self.css)
     compressor.storage = DefaultStorage()
     output = compressor.output()
     self.assertEqual(expected, output)
     result = open(os.path.join(settings.COMPRESS_ROOT, "CACHE", "css",
                                "%s.css" % hashed), "r").read()
     self.assertTrue(test_css_content not in result)
Пример #26
0
 def setUp(self):
     self.css = """
     <link rel="stylesheet" href="/static/css/datauri.css" type="text/css">
     """
     self.css_node = CssCompressor('css', self.css)
Пример #27
0
 def test_precompiler_class_used(self):
     css = '<style type="text/foobar">p { border:10px solid red;}</style>'
     css_node = CssCompressor(css)
     output = make_soup(css_node.output('inline'))
     self.assertEqual(output.text, 'OUTPUT')
Пример #28
0
 def test_template_precompiler(self):
     css = '<style type="text/django">p { border:10px solid {% if 1 %}green{% else %}red{% endif %};}</style>'
     css_node = CssCompressor(css)
     output = make_soup(css_node.output('inline'))
     self.assertEqual(output.text, 'p { border:10px solid green;}')
Пример #29
0
 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')
Пример #30
0
 def test_nonexistent_precompiler_class_error(self):
     css = '<style type="text/foobar">p { border:10px solid red;}</style>'
     css_node = CssCompressor(css)
     self.assertRaises(FilterDoesNotExist, css_node.output, 'inline')