Changelog

v1.3 (03/18/2013)

  • Backward incompatible changes
    • Dropped support for Python 2.5. Removed any and walk compatibility functions in compressor.utils.
    • Removed compatibility with Django 1.2 for default values of some settings:
      • COMPRESS_ROOT no longer uses MEDIA_ROOT if STATIC_ROOT is not defined. It expects STATIC_ROOT to be defined instead.
      • COMPRESS_URL no longer uses MEDIA_URL if STATIC_URL is not defined. It expects STATIC_URL to be defined instead.
      • COMPRESS_CACHE_BACKEND no longer uses CACHE_BACKEND and simply defaults to default.
  • Added precompiler class support. This enables you to write custom precompilers with Python logic in them instead of just relying on executables.
  • Made CssAbsoluteFilter smarter: it now handles URLs with hash fragments or querystring correctly. In addition, it now leaves alone fragment-only URLs.
  • Removed a fsync() call in CompilerFilter to improve performance. We already called self.infile.flush() so that call was not necessary.
  • Added an extension to provide django-sekizai support. See django-sekizai Support for more information.
  • Fixed a DeprecationWarning regarding the use of django.utils.hashcompat
  • Updated bundled rjsmin.py to fix some JavaScript compression errors.

v1.2

  • Added compatibility with Django 1.4 and dropped support for Django 1.2.X.

  • Added contributing docs. Be sure to check them out and start contributing!

  • Moved CI to Travis: http://travis-ci.org/jezdez/django_compressor

  • Introduced a new compressed context dictionary that is passed to the templates that are responsible for rendering the compressed snippets.

    This is a backwards-incompatible change if you’ve overridden any of the included templates:

    • compressor/css_file.html
    • compressor/css_inline.html
    • compressor/js_file.html
    • compressor/js_inline.html

    The variables passed to those templates have been namespaced in a dictionary, so it’s easy to fix your own templates.

    For example, the old compressor/js_file.html:

    <script type="text/javascript" src="{{ url }}"></script>
    

    The new compressor/js_file.html:

    <script type="text/javascript" src="{{ compressed.url }}"></script>
    
  • Removed old templates named compressor/css.html and compressor/js.html that were originally left for backwards compatibility. If you’ve overridden them, just rename them to compressor/css_file.html or compressor/js_file.html and make sure you’ve accounted for the backwards incompatible change of the template context mentioned above.

  • Reverted an unfortunate change to the YUI filter that prepended 'java -jar' to the binary name, which doesn’t alway work, e.g. if the YUI compressor is shipped as a script like /usr/bin/yui-compressor.

  • Changed the sender parameter of the post_compress() signal to be either compressor.css.CssCompressor or compressor.js.JsCompressor for easier customization.

  • Correctly handle offline compressing files that are found in {% if %} template blocks.

  • Renamed the second option for the COMPRESS_CSS_HASHING_METHOD setting from 'hash' to 'content' to better describe what it does. The old name is also supported, as well as the default being 'mtime'.

  • Fixed CssAbsoluteFilter, src attributes in includes now get transformed.

  • Added a new hook to allow developers to completely bypass offline compression in CompressorNode subclasses: is_offline_compression_enabled.

  • Dropped versiontools from required dependencies again.

v1.1.2

  • Fixed an installation issue related to versiontools.

v1.1.1

  • Fixed a stupid ImportError bug introduced in 1.1.

  • Fixed Jinja2 docs of since JINJA2_EXTENSIONS expects a class, not a module.

  • Fixed a Windows bug with regard to file resolving with staticfiles finders.

  • Stopped a potential memory leak when memoizing the rendered output.

  • Fixed the integration between staticfiles (e.g. in Django <= 1.3.1) and compressor which prevents the collectstatic management command to work.

    Warning

    Make sure to remove the path method of your custom remote storage class!

v1.1

  • Made offline compression completely independent from cache (by writing a manifest.json file).

    You can now easily run the compress management command locally and transfer the COMPRESS_ROOT dir to your server.

  • Updated installation instructions to properly mention all dependencies, even those internally used.

  • Fixed a bug introduced in 1.0 which would prevent the proper deactivation of the compression in production.

  • Added a Jinja2 contrib extension.

  • Made sure the rel attribute of link tags can be mixed case.

  • Avoid overwriting context variables needed for compressor to work.

  • Stopped the compress management command to require model validation.

  • Added missing imports and fixed a few PEP 8 issues.

v1.0.1

  • Fixed regression in compressor.utils.staticfiles compatibility module.

v1.0

  • BACKWARDS-INCOMPATIBLE Stopped swallowing exceptions raised by rendering the template tag in production (DEBUG = False). This has the potential to breaking lots of apps but on the other hand will help find bugs.

  • BACKWARDS-INCOMPATIBLE The default function to create the cache key stopped containing the server hostname. Instead the cache key now only has the form 'django_compressor.<KEY>'.

    To revert to the previous way simply set the COMPRESS_CACHE_KEY_FUNCTION to 'compressor.cache.socket_cachekey'.

  • BACKWARDS-INCOMPATIBLE Renamed ambigously named COMPRESS_DATA_URI_MAX_SIZE setting to COMPRESS_DATA_URI_MAX_SIZE. It’s the maximum size the compressor.filters.datauri.DataUriFilter filter will embed files as data: URIs.

  • Added COMPRESS_CSS_HASHING_METHOD setting with the options 'mtime' (default) and 'hash' for the CssAbsoluteFilter filter. The latter uses the content of the file to calculate the cache-busting hash.

  • Added support for {{ block.super }} to compress management command.

  • Dropped Django 1.1.X support.

  • Fixed compiler filters on Windows.

  • Handle new-style cached template loaders in the compress management command.

  • Documented included filters.

  • Added Slim It filter.

  • Added new CallbackOutputFilter to ease the implementation of Python-based callback filters that only need to pass the content to a callable.

  • Make use of django-appconf for settings handling and versiontools for versions.

  • Uses the current context when rendering the render templates.

  • Added post_compress signal.

v0.9.2

  • Fixed stdin handling of precompiler filter.

v0.9.1

  • Fixed encoding related issue.
  • Minor cleanups.

v0.9

  • Fixed the precompiler support to also use the full file path instead of a temporarily created file.
  • Enabled test coverage.
  • Refactored caching and other utility code.
  • Switched from SHA1 to MD5 for hash generation to lower the computational impact.

v0.8

  • Replace naive jsmin.py with rJSmin (http://opensource.perlig.de/rjsmin/) and fixed a few problems with JavaScript comments.
  • Fixed converting relative URLs in CSS files when running in debug mode.

Note

If you relied on the split_contents method of Compressor classes, please make sure a fourth item is returned in the iterable that denotes the base name of the file that is compressed.

v0.7.1

  • Fixed import error when using the standalone django-staticfiles app.

v0.7

  • Created new parser, HtmlParser, based on the stdlib HTMLParser module.
  • Added a new default AutoSelectParser, which picks the LxmlParser if lxml is available and falls back to HtmlParser.
  • Use unittest2 for testing goodness.
  • Fixed YUI JavaScript filter argument handling.
  • Updated bundled jsmin to use version by Dave St.Germain that was refactored for speed.

v0.6.4

  • Fixed Closure filter argument handling.

v0.6.3

  • Fixed options mangling in CompilerFilter initialization.
  • Fixed tox configuration.
  • Extended documentation and README.
  • In the compress command ignore hidden files when looking for templates.
  • Restructured utilities and added staticfiles compat layer.
  • Restructered parsers and added a html5lib based parser.

v0.6.2

  • Minor bugfixes that caused the compression not working reliably in development mode (e.g. updated files didn’t trigger a new compression).

v0.6.1

  • Fixed staticfiles support to also use its finder API to find files during developement – when the static files haven’t been collected in STATIC_ROOT.
  • Fixed regression with the COMPRESS setting, pre-compilation and staticfiles.

v0.6

Major improvements and a lot of bugfixes, some of which are:

  • New precompilation support, which allows compilation of files and hunks with easily configurable compilers before calling the actual output filters. See the COMPRESS_PRECOMPILERS for more details.

  • New staticfiles support. With the introduction of the staticfiles app to Django 1.3, compressor officially supports finding the files to compress using the app’s finder API. Have a look at the documentation about remote storages in case you want to use those together with compressor.

  • New compress management command which allows pre-running of what the compress template tag does. See the pre-compression docs for more information.

  • Various perfomance improvements by better caching and mtime cheking.

  • Deprecated COMPRESS_LESSC_BINARY setting because it’s now superseded by the COMPRESS_PRECOMPILERS setting. Just make sure to use the correct mimetype when linking to less files or adding inline code and add the following to your settings:

    COMPRESS_PRECOMPILERS = (
        ('text/less', 'lessc {infile} {outfile}'),
    )
    
  • Added cssmin filter (compressor.filters.CSSMinFilter) based on Zachary Voase’s Python port of the YUI CSS compression algorithm.

  • Reimplemented the dog-piling prevention.

  • Make sure the CssAbsoluteFilter works for relative paths.

  • Added inline render mode. See usage docs.

  • Added mtime_cache management command to add and/or remove all mtimes from the cache.

  • Moved docs to Read The Docs: http://django-compressor.readthedocs.org/en/latest/

  • Added optional compressor.storage.GzipCompressorFileStorage storage backend that gzips of the saved files automatically for easier deployment.

  • Reimplemented a few filters on top of the new compressor.filters.base.CompilerFilter to be a bit more DRY.

  • Added tox based test configuration, testing on Django 1.1-1.3 and Python 2.5-2.7.