Skip to content

chuanzhang/pystache

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pystache

image

Pystache is a Python implementation of Mustache. Mustache is a framework-agnostic, logic-free templating system inspired by ctemplate and et. Like ctemplate, Mustache "emphasizes separating logic from presentation: it is impossible to embed application logic in this template language."

The mustache(5) man page provides a good introduction to Mustache's syntax. For a more complete (and more current) description of Mustache's behavior, see the official Mustache spec.

Pystache is semantically versioned and can be found on PyPI. This version of Pystache passes all tests in version 1.0.3 of the spec.

Logo: David Phillips

Requirements

Pystache is tested with the following versions of Python:

  • Python 2.4 (requires simplejson version 2.0.9 or earlier)
  • Python 2.5 (requires simplejson)
  • Python 2.6
  • Python 2.7

JSON support is needed only for the command-line interface and to run the spec tests. Python's json module is new as of Python 2.6. Python's simplejson package works with earlier versions of Python. Because simplejson stopped officially supporting Python 2.4 as of version 2.1.0, Python 2.4 requires an earlier version.

Install It

pip install pystache

Use It

>>> import pystache
>>> pystache.render('Hi {{person}}!', {'person': 'Mom'})
u'Hi Mom!'

You can also create dedicated view classes to hold your view logic.

Here's your view class (in examples/readme.py):

class SayHello(object):

    def to(self):
        return "Pizza"

Like so:

>>> from examples.readme import SayHello
>>> hello = SayHello()

Then your template, say_hello.mustache:

Hello, {{to}}!

Pull it together:

>>> renderer = pystache.Renderer()
>>> renderer.render(hello)
u'Hello, Pizza!'

Unicode Handling

This section describes Pystache's handling of unicode (e.g. strings and encodings).

Internally, Pystache uses only unicode strings. For input, Pystache accepts both unicode and str strings. For output, Pystache's template rendering methods return only unicode.

Pystache's Renderer class supports a number of attributes that control how Pystache converts str strings to unicode on input. These include the file_encoding, string_encoding, and decode_errors attributes.

The file_encoding attribute is the encoding the renderer uses to convert to unicode any files read from the file system. Similarly, string_encoding is the encoding the renderer uses to convert to unicode any other strings of type str encountered during the rendering process (e.g. context values of type str).

The decode_errors attribute is what the renderer passes as the errors argument to Python's built-in unicode function unicode() when converting. The valid values for this argument are strict, ignore, and replace.

Each of these attributes can be set via the Renderer class's constructor using a keyword argument of the same name. See the Renderer class's docstrings for further details. In addition, the file_encoding attribute can be controlled on a per-view basis by subclassing the TemplateSpec class. When not specified explicitly, these attributes default to values set in Pystache's defaults module.

Test It

nose works great! :

pip install nose
cd pystache
nosetests

Depending on your Python version and nose installation, you may need to type, for example :

nosetests-2.4

To include tests from the Mustache spec in your test runs: :

git submodule init
git submodule update

To run all available tests (including doctests):

nosetests --with-doctest --doctest-extension=rst

or alternatively (using setup.cfg):

python setup.py nosetests

To run a subset of the tests, you can use this pattern, for example: :

nosetests --tests tests/test_context.py:GetValueTests.test_dictionary__key_present

Mailing List

As of November 2011, there's a mailing list, pystache@librelist.com.

Archive: http://librelist.com/browser/pystache/

Note: There's a bit of a delay in seeing the latest emails appear in the archive.

Author

>>> context = { 'author': 'Chris Wanstrath', 'email': 'chris@ozmm.org' }
>>> pystache.render("{{author}} :: {{email}}", context)
u'Chris Wanstrath :: chris@ozmm.org'