Paste Deployment
================

.. py:module:: fanstatic

Fanstatic has support for `Paste Deployment`_, a system for
configuring WSGI applications and servers. You can configure the
Fanstatic WSGI components using Paste Deploy.

Fanstatic WSGI component
------------------------

If you have configured your application with Paste, you will already
have a configuration ``.ini`` file, say ``deploy.ini``. You can now
wrap your application in the :py:func:`Fanstatic` WSGI component::

  [server:main]
  use = egg:Paste#http

  [app:my_application]
  use = egg:myapplication

  [pipeline:main]
  pipeline = fanstatic my_application

  [filter:fanstatic]
  use = egg:fanstatic#fanstatic

The :py:func:`Fanstatic` WSGI framework component actually itself
combines three separate WSGI components - the :py:class:`Injector`,
the :py:class:`Delegator` and the :py:class:`Publisher` - into one
convenient component.

The ``[filter:fanstatic]`` section accepts several configuration
directives (see also the :doc:`configuration documentation
<configuration>`):

Turn recomputing of hashes on or off with "true" or "false"::

  recompute_hashes = true

To turn versioning on or off with "true" or "false"::

  versioning = true

You can also configure the URL segment that is used in generating URLs
to resources and to recognize "serve-able" resource URLs::

  publisher_signature = foo

To allow for bottom inclusion of resources::

  bottom = true

To force *all* Javascript to be included at the bottom::

  force_bottom = true

To serve ``minified`` resources where available::

  minified = True

To serve ``debug`` resources where available::

  debug = True

Use rolled up resources where possible and where they are available::

  rollup = true

Use bundling of resources::

  bundle = true

Use compilation or resources::

  compile = true

Configure an injector plugin, by name::

  injector = foo

A complete ``[filter:fanstatic]`` section could look like this::

  [filter:fanstatic]
  use = egg:fanstatic#fanstatic
  recompute_hashes = false
  versioning = true
  bottom = true
  minified = true

The Fanstatic WSGI component is all you should need for normal use
cases. Next, we will go into the details of what the sub-components
that this component consists of. These should only be useful in
particular use cases when you want to take over some of the task of
Fanstatic itself.

Injector WSGI component
-----------------------

If you don't want to use the Publisher component as you want to serve
the libraries yourself, you can still take care of injecting URLs by
configuring the :py:class:`Injector` WSGI component separately::

  [server:main]
  use = egg:Paste#http

  [app:my_application]
  use = egg:myapplication

  [pipeline:main]
  pipeline = injector my_application

  [filter:injector]
  use = egg:fanstatic#injector

The ``[filter:injector]`` section accepts the same set of
configuration parameters as the ``[filter:fanstatic]`` section. A
complete section therefore could look like this::

  [filter:injector]
  use = egg:fanstatic#injector
  recompute_hashes = false
  versioning = false
  bottom = true
  minified = true

Publisher WSGI component
------------------------

It is also possible to set up the ``Publisher`` component separately.
The publisher framework component is actually a combination of a
:py:class:`Delegator` and a :py:class:`Publisher` component. The
delegator is responsible for recognizing what URLs are in fact URLs to
"serve-able" resources, passing along all other URLs to be handled by
your application.

The delegator recognizes URLs that contain the ``publisher_signature``
as a path segment are recognized as "serve-able". Configuring only the
publisher component for your application implies that there is some
other mechanism that injects the correct resources URLs into, for
example, web pages.

The publisher component accepts one configuration directive, the
``publisher_signature`` (default it's set to ``fanstatic``)::

  [server:main]
  use = egg:Paste#http

  [app:my_application]
  use = egg:myapplication

  [pipeline:main]
  pipeline = publisher my_application

  [filter:publisher]
  use = egg:fanstatic#publisher
  publisher_signature = bar

Combining the publisher and the injector
----------------------------------------

As explained before, the :py:func:`Fanstatic` component combines the
publisher and injector components. An equivalent configuration using
the separate components would look like this::

  [server:main]
  use = egg:Paste#http

  [app:my_application]
  use = egg:myapplication

  [pipeline:main]
  pipeline = publisher injector my_application

  [filter:publisher]
  use = egg:fanstatic#publisher
  publisher_signature = baz

  [filter:injector]
  use = egg:fanstatic#injector
  recompute_hashes = false
  versioning = true
  bottom = true
  minified = true
  publisher_signature = baz

.. _`Paste Deployment`: http://pythonpaste.org/deploy/

