Compare commits

..

No commits in common. "rawhide" and "f37" have entirely different histories.

10 changed files with 269 additions and 215 deletions

3
.gitignore vendored
View file

@ -1,5 +1,2 @@
/python-django-compressor-*.tar.gz
/django-compressor-*.tar.gz
/django_compressor-4.4.tar.gz
/django_compressor-4.5.1.tar.gz
/django_compressor-4.6.0.tar.gz

View file

@ -1,3 +0,0 @@
This repository is maintained by packit.
https://packit.dev/
The file was generated using packit 1.12.0.

View file

@ -0,0 +1,37 @@
From ac70fbfb7f8349e5c1150f40bf1d21ba635d0cb8 Mon Sep 17 00:00:00 2001
From: Chirag Jadwani <cbjadwani@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 %}

View file

@ -0,0 +1,162 @@
From 72b33ddbcdc41eb5af42b86329d81d96894a9d10 Mon Sep 17 00:00:00 2001
From: Carlton Gibson <carlton.gibson@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

View file

@ -0,0 +1,48 @@
From c8495264b503a595fbc89e6c8a83a402eff445c6 Mon Sep 17 00:00:00 2001
From: Mathieu Pillard <m@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

View file

@ -1,16 +0,0 @@
# See the documentation for more information:
# https://packit.dev/docs/configuration/
copy_upstream_release_description: false
jobs:
- job: pull_from_upstream
trigger: release
dist_git_branches:
- fedora-rawhide
- job: koji_build
trigger: commit
allowed_committers: ['packit']
dist_git_branches:
- fedora-rawhide

View file

@ -1,5 +1,4 @@
%global srcname django-compressor
%global pypi_name django_compressor
%global _desc\
Django Compressor combines and compresses linked and inline Javascript\
or CSS in a Django templates into cacheable static files by using the\
@ -8,23 +7,16 @@ or CSS in a Django templates into cacheable static files by using the\
parsed and searched for CSS or JS. These styles and scripts are subsequently\
processed with optional, configurable compilers and filters.
# setuptools < 77.0.3
%if (%{defined fedora} && 0%{?fedora} <= 42) || (%{defined rhel} && 0%{?rhel} <= 10)
%bcond old_setuptools 1
%else
%bcond old_setuptools 0
%endif
Name: python-django-compressor
Version: 4.6.0
Version: 4.1
Release: %autorelease
Summary: Compresses linked and inline JavaScript or CSS into single cached files
License: MIT
URL: https://github.com/django-compressor/django-compressor
Source0: %{pypi_source django_compressor}
# deleted in 4e543307 - migration to pyproject.toml
Source1: setup.py
Source0: %{url}/archive/%{version}/%{srcname}-%{version}.tar.gz
Patch0: rdep-version.patch
BuildArch: noarch
@ -35,19 +27,16 @@ BuildRequires: python3-devel
%package -n python3-%{srcname}
Summary: %{summary}
%description -n python3-%{srcname}
%_desc
# Added in f28 cycle.
Obsoletes: python2-%{srcname} < 2.1-6
Obsoletes: python-%{srcname} < 2.1-6
%description -n python3-%{srcname} %_desc
%prep
%autosetup -p1 -n %{pypi_name}-%{version}
%if %{with old_setuptools}
rm pyproject.toml
cp -p %{SOURCE1} setup.py
%endif
%autosetup -p1 -n %{srcname}-%{version}
%generate_buildrequires
%pyproject_buildrequires

12
rdep-version.patch Normal file
View file

@ -0,0 +1,12 @@
--- a/setup.py 2022-08-17 14:46:30.186903576 +0300
+++ b/setup.py 2022-08-17 14:46:42.507861281 +0300
@@ -149,7 +149,7 @@
zip_safe=False,
install_requires=[
'django-appconf >= 1.0.3',
- 'rcssmin == 1.1.0',
- 'rjsmin == 1.2.0',
+ 'rcssmin >= 1.1.0',
+ 'rjsmin >= 1.2.0',
],
)

172
setup.py
View file

@ -1,172 +0,0 @@
import ast
import codecs
import os
import sys
from fnmatch import fnmatchcase
from pathlib import Path
from setuptools import find_packages, setup
class VersionFinder(ast.NodeVisitor):
def __init__(self):
self.version = None
def visit_Assign(self, node):
if node.targets[0].id == "__version__":
self.version = node.value.value
def read(*parts):
filename = os.path.join(os.path.dirname(__file__), *parts)
with codecs.open(filename, encoding="utf-8") as fp:
return fp.read()
def find_version(*parts):
finder = VersionFinder()
finder.visit(ast.parse(read(*parts)))
return finder.version
# Provided as an attribute, so you can append to these instead
# of replicating them:
standard_exclude = ("*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak")
standard_exclude_directories = (
".*",
"CVS",
"_darcs",
"./build",
"./dist",
"EGG-INFO",
"*.egg-info",
)
# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
# Note: you may want to copy this into your setup.py file verbatim, as
# you can't import this from another package, when you don't know if
# that package is installed yet.
def find_package_data(
where=".",
package="",
exclude=standard_exclude,
exclude_directories=standard_exclude_directories,
only_in_packages=True,
show_ignored=False,
):
"""
Return a dictionary suitable for use in ``package_data``
in a distutils ``setup.py`` file.
The dictionary looks like::
{'package': [files]}
Where ``files`` is a list of all the files in that package that
don't match anything in ``exclude``.
If ``only_in_packages`` is true, then top-level directories that
are not packages won't be included (but directories under packages
will).
Directories matching any pattern in ``exclude_directories`` will
be ignored; by default directories with leading ``.``, ``CVS``,
and ``_darcs`` will be ignored.
If ``show_ignored`` is true, then all the files that aren't
included in package data are shown on stderr (for debugging
purposes).
Note patterns use wildcards, or can be exact paths (including
leading ``./``), and all searching is case-insensitive.
"""
out = {}
stack = [(str(Path(where)), "", package, only_in_packages)]
while stack:
where, prefix, package, only_in_packages = stack.pop(0)
for name in os.listdir(where):
fn = os.path.join(where, name)
if os.path.isdir(fn):
bad_name = False
for pattern in exclude_directories:
if fnmatchcase(name, pattern) or fn.lower() == pattern.lower():
bad_name = True
if show_ignored:
print(
"Directory %s ignored by pattern %s" % (fn, pattern),
file=sys.stderr,
)
break
if bad_name:
continue
if os.path.isfile(os.path.join(fn, "__init__.py")) and not prefix:
if not package:
new_package = name
else:
new_package = package + "." + name
stack.append((fn, "", new_package, False))
else:
stack.append((fn, prefix + name + "/", package, only_in_packages))
elif package or not only_in_packages:
# is a file
bad_name = False
for pattern in exclude:
if fnmatchcase(name, pattern) or fn.lower() == pattern.lower():
bad_name = True
if show_ignored:
print(
"File %s ignored by pattern %s" % (fn, pattern),
file=sys.stderr,
)
break
if bad_name:
continue
out.setdefault(package, []).append(prefix + name)
return out
setup(
name="django_compressor",
version=find_version("compressor", "__init__.py"),
url="https://django-compressor.readthedocs.io/en/latest/",
project_urls={
"Source": "https://github.com/django-compressor/django-compressor",
},
license="MIT",
description=(
"Compresses linked and inline JavaScript or CSS into single cached files.",
),
long_description=read("README.rst"),
maintainer="Mathieu Pillard",
packages=find_packages(),
package_data=find_package_data(),
classifiers=[
"Development Status :: 5 - Production/Stable",
"Framework :: Django",
"Framework :: Django :: 4.2",
"Framework :: Django :: 5.0",
"Framework :: Django :: 5.1",
"Framework :: Django :: 5.2",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Internet :: WWW/HTTP",
],
zip_safe=False,
python_requires=">=3.10",
install_requires=[
"Django >= 4.2",
"django-appconf >= 1.0.3",
"rcssmin >= 1.2.1",
"rjsmin >= 1.2.4",
],
)

View file

@ -1 +1 @@
SHA512 (django_compressor-4.6.0.tar.gz) = 5bb5fc01b3beb022623b6409f710640eb51196349c0268c1d85239ce2c6a8889761c3efb16e9cc4e7b1d6bdd7f3a16ea8abf4ba9083a03500bcd10344457e0a2
SHA512 (django-compressor-4.1.tar.gz) = eb1e4fc5d9ada8fb32a1059c87b447735cf0e1c40853b2313b5f7f5d1c9cf3c66d96ebf40a721175db5fe721c44b077bc026270d59e90890e1807125a38a33a1