mrunge pushed to python-django-compressor (master). "Make compressor work with django-1.8"

notifications at fedoraproject.org notifications at fedoraproject.org
Wed Apr 15 07:26:42 UTC 2015


>From cf9cb06670652f03bfeb9a9dd624e66aa8a250a8 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge at redhat.com>
Date: Wed, 15 Apr 2015 09:23:40 +0200
Subject: Make compressor work with django-1.8


diff --git a/django-compressor-fix-attributeerror-in-offline.patch b/django-compressor-fix-attributeerror-in-offline.patch
new file mode 100644
index 0000000..75a1dc7
--- /dev/null
+++ b/django-compressor-fix-attributeerror-in-offline.patch
@@ -0,0 +1,37 @@
+From ac70fbfb7f8349e5c1150f40bf1d21ba635d0cb8 Mon Sep 17 00:00:00 2001
+From: Chirag Jadwani <cbjadwani at elance-odesk.com>
+Date: Fri, 29 Aug 2014 13:15:35 +0530
+Subject: [PATCH] Fix AttributeError in offline compression
+
+---
+ compressor/offline/django.py                                         | 2 ++
+ .../test_block_super_base_compressed/test_compressor_offline.html    | 5 +++++
+ 2 files changed, 7 insertions(+)
+
+diff --git a/compressor/offline/django.py b/compressor/offline/django.py
+index 3986562..b326093 100644
+--- a/compressor/offline/django.py
++++ b/compressor/offline/django.py
+@@ -54,6 +54,8 @@ def remove_block_nodes(nodelist, block_stack, block_context):
+                 if not block_stack:
+                     continue
+                 node = block_context.get_block(block_stack[-1].name)
++                if not node:
++                    continue
+         if isinstance(node, BlockNode):
+             expanded_block = expand_blocknode(node, block_stack, block_context)
+             new_nodelist.extend(expanded_block)
+diff --git a/compressor/tests/test_templates/test_block_super_base_compressed/test_compressor_offline.html b/compressor/tests/test_templates/test_block_super_base_compressed/test_compressor_offline.html
+index 01382ec..10097c1 100644
+--- a/compressor/tests/test_templates/test_block_super_base_compressed/test_compressor_offline.html
++++ b/compressor/tests/test_templates/test_block_super_base_compressed/test_compressor_offline.html
+@@ -5,4 +5,9 @@
+     <script type="text/javascript">
+         alert("this alert shouldn't be alone!");
+     </script>
++    {% block orphan %}
++        {{ block.super }}
++        An 'orphan' block that refers to a non-existent super block.
++        Contents of this block are ignored.
++    {% endblock %}
+ {% endspaceless %}{% endblock %}
diff --git a/django-compressor-make-compress-run-through.patch b/django-compressor-make-compress-run-through.patch
new file mode 100644
index 0000000..4252405
--- /dev/null
+++ b/django-compressor-make-compress-run-through.patch
@@ -0,0 +1,162 @@
+From 72b33ddbcdc41eb5af42b86329d81d96894a9d10 Mon Sep 17 00:00:00 2001
+From: Carlton Gibson <carlton.gibson at noumenal.co.uk>
+Date: Tue, 10 Mar 2015 20:04:07 +0100
+Subject: [PATCH] Make `compress` command (at least) run through on 1.8
+
+FAILED (failures=15, errors=15, skipped=1)
+
+AssertionError: 2 != 12
+OfflineGenerationError: ... key "XYZ" missing ...
+---
+ compressor/management/commands/compress.py | 41 +++++++++++++++++-------------
+ compressor/offline/django.py               | 27 ++++++++++++++------
+ 2 files changed, 43 insertions(+), 25 deletions(-)
+
+diff --git a/compressor/management/commands/compress.py b/compressor/management/commands/compress.py
+index 6be215e..0bc436a 100644
+--- a/compressor/management/commands/compress.py
++++ b/compressor/management/commands/compress.py
+@@ -5,6 +5,7 @@
+ from fnmatch import fnmatch
+ from optparse import make_option
+ 
++import django
+ from django.core.management.base import NoArgsCommand, CommandError
+ import django.template
+ from django.template import Context
+@@ -53,24 +54,30 @@ class Command(NoArgsCommand):
+     requires_model_validation = False
+ 
+     def get_loaders(self):
+-        from django.template.loader import template_source_loaders
+-        if template_source_loaders is None:
+-            try:
+-                from django.template.loader import (
+-                    find_template as finder_func)
+-            except ImportError:
+-                from django.template.loader import (
+-                    find_template_source as finder_func)  # noqa
+-            try:
+-                # Force django to calculate template_source_loaders from
+-                # TEMPLATE_LOADERS settings, by asking to find a dummy template
+-                source, name = finder_func('test')
+-            except django.template.TemplateDoesNotExist:
+-                pass
+-            # Reload template_source_loaders now that it has been calculated ;
+-            # it should contain the list of valid, instanciated template loaders
+-            # to use.
++        if django.VERSION < (1, 8):
+             from django.template.loader import template_source_loaders
++            if template_source_loaders is None:
++                try:
++                    from django.template.loader import (
++                        find_template as finder_func)
++                except ImportError:
++                    from django.template.loader import (
++                        find_template_source as finder_func)  # noqa
++                try:
++                    # Force django to calculate template_source_loaders from
++                    # TEMPLATE_LOADERS settings, by asking to find a dummy template
++                    source, name = finder_func('test')
++                except django.template.TemplateDoesNotExist:
++                    pass
++                # Reload template_source_loaders now that it has been calculated ;
++                # it should contain the list of valid, instanciated template loaders
++                # to use.
++                from django.template.loader import template_source_loaders
++        else:
++            from django.template import engines
++            template_source_loaders = []
++            for e in engines.all():
++                template_source_loaders.extend(e.engine.get_template_loaders(e.engine.loaders))
+         loaders = []
+         # If template loader is CachedTemplateLoader, return the loaders
+         # that it wraps around. So if we have
+diff --git a/compressor/offline/django.py b/compressor/offline/django.py
+index b326093..107c6e4 100644
+--- a/compressor/offline/django.py
++++ b/compressor/offline/django.py
+@@ -1,6 +1,7 @@
+ from __future__ import absolute_import
+ from copy import copy
+ 
++import django
+ from django import template
+ from django.conf import settings
+ from django.template import Context
+@@ -14,7 +15,7 @@
+ from compressor.templatetags.compress import CompressorNode
+ 
+ 
+-def handle_extendsnode(extendsnode, block_context=None):
++def handle_extendsnode(extendsnode, block_context=None, original=None):
+     """Create a copy of Node tree of a derived template replacing
+     all blocks tags with the nodes of appropriate blocks.
+     Also handles {{ block.super }} tags.
+@@ -26,6 +27,9 @@ def handle_extendsnode(extendsnode, block_context=None):
+     block_context.add_blocks(blocks)
+ 
+     context = Context(settings.COMPRESS_OFFLINE_CONTEXT)
++    if original is not None:
++        context.template = original
++
+     compiled_parent = extendsnode.get_parent(context)
+     parent_nodelist = compiled_parent.nodelist
+     # If the parent template has an ExtendsNode it is not the root.
+@@ -33,7 +37,7 @@ def handle_extendsnode(extendsnode, block_context=None):
+         # The ExtendsNode has to be the first non-text node.
+         if not isinstance(node, TextNode):
+             if isinstance(node, ExtendsNode):
+-                return handle_extendsnode(node, block_context)
++                return handle_extendsnode(node, block_context, original)
+             break
+     # Add blocks of the root template to block context.
+     blocks = dict((n.name, n) for n in
+@@ -95,7 +99,10 @@ def __init__(self, charset):
+ 
+     def parse(self, template_name):
+         try:
+-            return get_template(template_name)
++            if django.VERSION < (1, 8):
++                return get_template(template_name)
++            else:
++                return get_template(template_name).template
+         except template.TemplateSyntaxError as e:
+             raise TemplateSyntaxError(str(e))
+         except template.TemplateDoesNotExist as e:
+@@ -111,15 +118,17 @@ def process_node(self, template, context, node):
+         pass
+ 
+     def render_nodelist(self, template, context, node):
++        if django.VERSION >= (1, 8):
++            context.template = template
+         return node.nodelist.render(context)
+ 
+     def render_node(self, template, context, node):
+         return node.render(context, forced=True)
+ 
+-    def get_nodelist(self, node):
++    def get_nodelist(self, node, original=None):
+         if isinstance(node, ExtendsNode):
+             try:
+-                return handle_extendsnode(node)
++                return handle_extendsnode(node, block_context=None, original=original)
+             except template.TemplateSyntaxError as e:
+                 raise TemplateSyntaxError(str(e))
+             except template.TemplateDoesNotExist as e:
+@@ -134,10 +143,12 @@ def get_nodelist(self, node):
+             nodelist = getattr(node, 'nodelist', [])
+         return nodelist
+ 
+-    def walk_nodes(self, node):
+-        for node in self.get_nodelist(node):
++    def walk_nodes(self, node, original=None):
++        if django.VERSION >= (1, 8) and original is None:
++            original = node
++        for node in self.get_nodelist(node, original):
+             if isinstance(node, CompressorNode) and node.is_offline_compression_enabled(forced=True):
+                 yield node
+             else:
+-                for node in self.walk_nodes(node):
++                for node in self.walk_nodes(node, original):
+                     yield node
diff --git a/django-compressor-use-get_template.patch b/django-compressor-use-get_template.patch
new file mode 100644
index 0000000..b890d49
--- /dev/null
+++ b/django-compressor-use-get_template.patch
@@ -0,0 +1,48 @@
+From c8495264b503a595fbc89e6c8a83a402eff445c6 Mon Sep 17 00:00:00 2001
+From: Mathieu Pillard <m at virgule.net>
+Date: Sun, 25 May 2014 14:09:33 +0200
+Subject: [PATCH] Use get_template() when dealing with django templates
+
+---
+ compressor/offline/django.py | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/compressor/offline/django.py b/compressor/offline/django.py
+index 6541471..3986562 100644
+--- a/compressor/offline/django.py
++++ b/compressor/offline/django.py
+@@ -1,13 +1,12 @@
+ from __future__ import absolute_import
+-import io
+ from copy import copy
+ 
+ from django import template
+ from django.conf import settings
+-from django.template import Template
+ from django.template import Context
+ from django.template.base import Node, VariableNode, TextNode, NodeList
+ from django.template.defaulttags import IfNode
++from django.template.loader import get_template
+ from django.template.loader_tags import ExtendsNode, BlockNode, BlockContext
+ 
+ 
+@@ -93,13 +92,12 @@ def __init__(self, charset):
+         self.charset = charset
+ 
+     def parse(self, template_name):
+-        with io.open(template_name, mode='rb') as file:
+-            try:
+-                return Template(file.read().decode(self.charset))
+-            except template.TemplateSyntaxError as e:
+-                raise TemplateSyntaxError(str(e))
+-            except template.TemplateDoesNotExist as e:
+-                raise TemplateDoesNotExist(str(e))
++        try:
++            return get_template(template_name)
++        except template.TemplateSyntaxError as e:
++            raise TemplateSyntaxError(str(e))
++        except template.TemplateDoesNotExist as e:
++            raise TemplateDoesNotExist(str(e))
+ 
+     def process_template(self, template, context):
+         return True
diff --git a/python-django-compressor.spec b/python-django-compressor.spec
index d0cfa09..62d9406 100644
--- a/python-django-compressor.spec
+++ b/python-django-compressor.spec
@@ -2,17 +2,30 @@
 
 Name:           python-django-compressor
 Version:        1.4
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        Compresses linked and inline JavaScript or CSS into single cached files
 
 License:        MIT
 URL:            http://pypi.python.org/pypi/django_compressor/%{version}
 Source0:        http://pypi.python.org/packages/source/d/%{pypi_name}/%{pypi_name}-%{version}.tar.gz
+
+# All patches are directly connected to Django-1.8
+#
+# cherry-pick from upstream
+# https://github.com/django-compressor/django-compressor/commit/c8495264b503a595fbc89e6c8a83a402eff445c6.patch
+Patch0001: django-compressor-use-get_template.patch
+# cherry-pick from upstream
+# https://github.com/django-compressor/django-compressor/commit/ac70fbfb7f8349e5c1150f40bf1d21ba635d0cb8.patch
+Patch0002:      django-compressor-fix-attributeerror-in-offline.patch
+# cherry-pick from upstream
+# https://github.com/django-compressor/django-compressor/commit/72b33ddbcdc41eb5af42b86329d81d96894a9d10.patch
+Patch0003:      django-compressor-make-compress-run-through.patch
+
 BuildArch:      noarch
- 
+
 BuildRequires:  python2-devel
 BuildRequires:  python-setuptools
- 
+
 Requires:       python-django-appconf >= 0.4
 Requires:       python-versiontools
 
@@ -33,6 +46,10 @@ processed with optional, configurable compilers and filters.
 
 %prep
 %setup -q -n %{pypi_name}-%{version}
+%patch0001 -p1
+%patch0002 -p1
+%patch0003 -p1
+
 # Remove bundled egg-info
 rm -rf %{pypi_name}.egg-info
 
@@ -59,6 +76,9 @@ rm -rf %{pypi_name}.egg-info
 %{python_sitelib}/%{pypi_name}-%{version}-py?.?.egg-info
 
 %changelog
+* Wed Apr 15 2015 Matthias Runge <mrunge at redhat.com> - 1.4-2
+- make compress command work on django-1.8
+
 * Mon May 26 2014 Matthias Runge <mrunge at redhat.com> - 1.4-1
 - update to 1.4 (rhbz#1100732)
 
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/python-django-compressor.git/commit/?h=master&id=cf9cb06670652f03bfeb9a9dd624e66aa8a250a8


More information about the scm-commits mailing list