diff --git a/.gitignore b/.gitignore index e5d2aa8..97b6fa0 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/README.packit b/README.packit deleted file mode 100644 index 2511bf4..0000000 --- a/README.packit +++ /dev/null @@ -1,3 +0,0 @@ -This repository is maintained by packit. -https://packit.dev/ -The file was generated using packit 1.12.0. 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 +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 @@ + ++ {% 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 +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 +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/packit.yaml b/packit.yaml deleted file mode 100644 index fdf84eb..0000000 --- a/packit.yaml +++ /dev/null @@ -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 diff --git a/python-django-compressor.spec b/python-django-compressor.spec index fa81435..22e8813 100644 --- a/python-django-compressor.spec +++ b/python-django-compressor.spec @@ -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 diff --git a/rdep-version.patch b/rdep-version.patch new file mode 100644 index 0000000..16a9fe2 --- /dev/null +++ b/rdep-version.patch @@ -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', + ], + ) diff --git a/setup.py b/setup.py deleted file mode 100644 index be846ae..0000000 --- a/setup.py +++ /dev/null @@ -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", - ], -) diff --git a/sources b/sources index dec55a4..f9d77cb 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (django_compressor-4.6.0.tar.gz) = 5bb5fc01b3beb022623b6409f710640eb51196349c0268c1d85239ce2c6a8889761c3efb16e9cc4e7b1d6bdd7f3a16ea8abf4ba9083a03500bcd10344457e0a2 +SHA512 (django-compressor-4.1.tar.gz) = eb1e4fc5d9ada8fb32a1059c87b447735cf0e1c40853b2313b5f7f5d1c9cf3c66d96ebf40a721175db5fe721c44b077bc026270d59e90890e1807125a38a33a1