facets 1.1.0
Asset manager for Django.
License: MIT License
Keywords: django assets css javascript compression

=============
Django Facets
=============

Features
========

Django facets is an assets manager providing a cache manager for static files, CSS, Javascript,
images compression and a collection (concatenation) system for CSS and JavaScript.

This new version uses Django static storage system.


Installation
============

- Download the package and type ``python setup.py install``
- Add ``django.contrib.staticfiles`` and ``facets`` to your ``INSTALLED_APPS``
- Set ``STATICFILES_STORAGE`` setting to ``facets.storages.FacetsFilesStorage``
- Add, **in first position** ``facets.finders.FacetsFinder`` to ``STATICFILES_FINDERS`` setting


Configuration
=============

Django facets needs some configuration settings.

FACETS_ENABLED
--------------

This setting enables cache. Its default value is the negation of ``DEBUG`` setting. You can set
it manualy if you want to test your cache in debug mode.

CACHES
------

Django Facets keeps track of cached files using Django cache system. It tries to use the cache
named "facets" and falls back to default. Here a configuration example::

  CACHES = CACHES = {
    'default': {
        # Whatever you want
    },
    'facets': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/path/to/directory'
    }
}

FACETS_HANDLERS
---------------

A list of handlers. The default value is::

  (
      'facets.processors.css.CssUrlsProcessor',
  )

These handlers are called during static files collect and/or while compiling some files. Order does not matter.

See handlers_ section.


Usage
=====

All static files should be handled as with `Django staticfiles
<https://docs.djangoproject.com/en/1.6/ref/contrib/staticfiles/>`_.

Collections
-----------

Collections are files you want to concatenate while in production. To create
a collection, you should use the ``mediacollection`` template tag. Here's an
example::

  {% load static from staticfiles %}
  {% load facets %}

  {% mediacollection "css/main.css" %}
    <link rel="stylesheet" href="{% static "css/reset.css" %}" />
    <link rel="stylesheet" href="{% static "css/screen.css" %}" />
  {% endmediacollection %}

The argument of the tag is the collection's final name.

Collections follow some rules:

* Only for ``link`` and ``script`` HTML tags.
* You can't mix ``link`` and ``script`` tags together.
* With ``link`` tags, the following attributes must have the same values on
  each tag: ``rel``, ``type``, ``media``
* With ``script`` tags, the following attributes must have the same values on
  each tag: ``type``

Collect
-------

Before using the cache, you should run ``./manage.py collectstatic``. This
command generates cached files.

You could run this command during project deployment. Please note that you MUST restart your
project server after running collectstatic.

.. _handlers:

Handlers
========

Handlers are classes that take responsibility to transform an input file. There are two types of handlers: compilers and processors.

Compilers
---------

Compilers create final files for some preprocessors languages (Less, Sass, CoffeeScript, etc.).
A compiler will be called during *collectstatic* and while serving static files if setting ``FACETS_ENABLED`` is set to ``False`` (usually during development).

Please note that there can be only one compiler by file extension.

facets.compilers.css.LessCompiler
+++++++++++++++++++++++++++++++++

:Extensions: ``less``
:Options:

  | **new_name**: ``{base}.css``
  | **program**: ``/usr/bin/env lessc``
  | **command**: ``{program} - {outfile}``

This compiler compiles Less files using `Less <http://lesscss.org/>`_ preprocessor.

facets.compilers.css.SasscCompiler
++++++++++++++++++++++++++++++++++

:Extensions: ``scss``, ``sass``
:Options:

  | **new_name**: ``{base}.css``
  | **program**: ``/usr/bin/env sassc``
  | **command**: ``{program} -``

This compiler compiles Sass files using `SassC <http://libsass.org/#sassc>`_ preprocessor.

facets.compilers.css.LibSassCompiler
++++++++++++++++++++++++++++++++++++

:Extensions: ``scss``, ``sass``

This compiler compiles Sass files using `libsass-python <http://dahlia.kr/libsass-python/>`_ preprocessor.

facets.compilers.js.CoffeScriptCompiler
+++++++++++++++++++++++++++++++++++++++

:Extensions: ``coffee``
:Options:

  | **new_name**: ``{base}.js``
  | **program**: ``/usr/bin/env coffee``
  | **command**: ``{program} -c --print {infile}``

This compiler compiles CoffeeScript files using `CoffeeScript <http://coffeescript.org/>`_ command.

facets.compilers.js.LiveScriptCompiler
++++++++++++++++++++++++++++++++++++++

:Extensions: ``ls``
:Options:

  | **new_name**: ``{base}.js``
  | **program**: ``/usr/bin/env lsc``
  | **command**: ``{program} -c --print {infile}``

This compiler compiles LiveScript files using `LiveScript <http://livescript.net/>`_ command.

facets.compilers.js.DartCompiler
++++++++++++++++++++++++++++++++

:Extensions: ``dart``
:Options:

  | **new_name**: ``{base}.js``
  | **program**: ``/usr/bin/env dart2js``
  | **command**: ``{program} -o {outfile} {infile}``

This compiler compiles Dart files using `Dart <https://www.dartlang.org/>`_ dart2js.


Processors
----------

Processors are called during *collectstatic*. Their job is usually to optimize files.

facets.processors.css.CssUrlsProcessor
++++++++++++++++++++++++++++++++++++++

:Scope: ``*.css``
:Options: **priority**: -1000 (please don't change it)

This processor transforms every URL found in CSS files to point to cached files version. For
example, this rule::

  h1 {
      background: url(../img/title.png);
  }

would become::

  h1 {
      background: url("/static/img/title-e221e1b36656.png");
  }

**Note**: It is recommended to always have this processor set.

facets.processors.css.CssMinProcessor
+++++++++++++++++++++++++++++++++++++

:Scope: ``*.css``

This processor minifies CSS files using `cssmin <https://github.com/zacharyvoase/cssmin>`_.

facets.processors.js.JsMinProcessor
+++++++++++++++++++++++++++++++++++

:Scope: ``*.js``

This processor minifies JavaScript files using `jsmin <http://pypi.python.org/pypi/jsmin>`_.

facets.processors.js.UglifyJsProcessor
++++++++++++++++++++++++++++++++++++++

:Scope: ``*.js``
:Options:

  | **program**: ``/usr/bin/env uglifyjs``
  | **command**: ``{program} {infile} --ascii -m -c -o {outfile}``

This processor minifies JavaScript files using `UglifyJs 2 <https://github.com/mishoo/UglifyJS2>`_.

facets.processors.js.GoogleClosureProcessor
+++++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.js``
:Options:

  | **program**: ``/usr/bin/env java -jar /path/to/compiler.jar`` (you'll have to change that)
  | **command**: ``{program} {infile}``

This processor minifies JavaScript files using `Google Closure Compiler
<https://developers.google.com/closure/compiler/>`_.

facets.processors.js.YuiJsProcessor
+++++++++++++++++++++++++++++++++++

:Scope: ``*.js``
:Options:

  | **program**: ``/usr/bin/env java -jar /path/to/yuicompressor-xxx.jar`` (you'll have to change that)
  | **command**: ``{program} {infile}``

This processor minifies JavaScript files using `Yahoo UI Compressor
<http://developer.yahoo.com/yui/compressor/>`_.

facets.processors.css.YuiCssProcessor
+++++++++++++++++++++++++++++++++++++

:Scope: ``*.css``
:Options:

  | **program**: ``/usr/bin/env java -jar /path/to/yuicompressor-xxx.jar`` (you'll have to change that)
  | **command**: ``{program} {infile}``

This processor minifies CSS files using `Yahoo UI Compressor
<http://developer.yahoo.com/yui/compressor/>`_.

facets.processors.images.OptiPngProcessor
+++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.png``
:Options:

  | **program**: ``/usr/bin/env optipng``
  | **command**: ``{program} -o7 -nc {infile}``

This processor optimizes PNG files using `OptiPNG <http://optipng.sourceforge.net/>`_.

facets.processors.images.AdvPngProcessor
++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.png``
:Options:

  | **program**: ``/usr/bin/env advpng``
  | **command**: ``{program} -z -4 {infile}``

This processor optimizes PNG files using `AdvanceCOMP advpng
<http://advancemame.sourceforge.net/doc-advpng.html>`_.

facets.processors.images.JpegtranProcessor
++++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.jpg, *.jpeg``
:Options:

  | **program**: ``/usr/bin/env jpegtran``
  | **command**: ``{program} -copy none -optimize {infile}``

This processor optimizes JPEG files using `jpegtran <http://jpegclub.org/jpegtran/>`_.

facets.processors.images.JpegoptimProcessor
+++++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.jpg, *.jpeg``
:Options:

  | **program**: ``/usr/bin/env jpegoptim``
  | **command**: ``{program} -q --strip-all {infile}``

This processor optimizes JPEG files using `jpegoptim <http://freshmeat.net/projects/jpegoptim>`_.

facets.processors.images.GifsicleProcessor
++++++++++++++++++++++++++++++++++++++++++

:Scope: ``*.gif``
:Options:

  | **program**: ``/usr/bin/env gifsicle``
  | **command**: ``{program} --batch -O3 {infile}``

This processor optimizes GIF files using `Gifsicle <http://www.lcdf.org/gifsicle/>`_.

facets.processors.gz.GZipProcessor
++++++++++++++++++++++++++++++++++

:Scope: ``*.htm, *.html, *js, *.css, *.txt, *.eot, *.ttf, *.woff, *.svg``
:Options:

  | **priority**: 1000 (please don't change it)
  | **compresslevel**: A compression level (0-9). Default to 5.

This processor is a bit special. Instead of updating existing cached file, it creates a gziped copy. It could be very useful if you configured Nginx with `Gzip Static Module
<http://wiki.nginx.org/HttpGzipStaticModule>`_.


License
=======

Django facets is released under the BSD license. See the LICENSE
file for the complete license.