• Stars
    star
    1,308
  • Rank 35,971 (Top 0.8 %)
  • Language
    Python
  • License
    MIT License
  • Created about 15 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Mustache in Python

Pystache

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.1.2 of the spec.

Requirements

Pystache is tested with--

  • Python 2.4 (requires simplejson version 2.0.9 or earlier)
  • Python 2.5 (requires simplejson)
  • Python 2.6
  • Python 2.7
  • Python 3.1
  • Python 3.2
  • Python 3.3
  • PyPy

Distribute (the setuptools fork) is recommended over setuptools, and is required in some cases (e.g. for Python 3 support). If you use pip, you probably already satisfy this requirement.

JSON support is needed only for the command-line interface and to run the spec tests. We require simplejson for earlier versions of Python since Python's json module was added in Python 2.6.

For Python 2.4 we require an earlier version of simplejson since simplejson stopped officially supporting Python 2.4 in simplejson version 2.1.0. Earlier versions of simplejson can be installed manually, as follows:

pip install 'simplejson<2.1.0'

Official support for Python 2.4 will end with Pystache version 0.6.0.

Install It

pip install pystache

And test it--

pystache-test

To install and test from source (e.g. from GitHub), see the Develop section.

Use It

>>> import pystache
>>> print pystache.render('Hi {{person}}!', {'person': 'Mom'})
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"

Instantiating like so:

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

Then your template, say_hello.mustache (by default in the same directory as your class definition):

Hello, {{to}}!

Pull it together:

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

For greater control over rendering (e.g. to specify a custom template directory), use the Renderer class like above. One can pass attributes to the Renderer class constructor or set them on a Renderer instance. To customize template loading on a per-view basis, subclass TemplateSpec. See the docstrings of the Renderer class and TemplateSpec class for more information.

You can also pre-parse a template:

>>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}")
>>> print parsed
[u'Hey ', _SectionNode(key=u'who', index_begin=12, index_end=18, parsed=[_EscapeNode(key=u'.'), u'!'])]

And then:

>>> print renderer.render(parsed, {'who': 'Pops'})
Hey Pops!
>>> print renderer.render(parsed, {'who': 'you'})
Hey you!

Python 3

Pystache has supported Python 3 since version 0.5.1. Pystache behaves slightly differently between Python 2 and 3, as follows:

  • In Python 2, the default html-escape function cgi.escape() does not escape single quotes. In Python 3, the default escape function html.escape() does escape single quotes.
  • In both Python 2 and 3, the string and file encodings default to sys.getdefaultencoding(). However, this function can return different values under Python 2 and 3, even when run from the same system. Check your own system for the behavior on your system, or do not rely on the defaults by passing in the encodings explicitly (e.g. to the Renderer class).

Unicode

This section describes how Pystache handles unicode, strings, and encodings.

Internally, Pystache uses only unicode strings (str in Python 3 and unicode in Python 2). For input, Pystache accepts both unicode strings and byte strings (bytes in Python 3 and str in Python 2). For output, Pystache's template rendering methods return only unicode.

Pystache's Renderer class supports a number of attributes to control how Pystache converts byte 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 any other byte strings encountered during the rendering process into unicode (e.g. context values that are encoded byte strings).

The decode_errors attribute is what the renderer passes as the errors argument to Python's built-in unicode-decoding function (str() in Python 3 and unicode() in Python 2). 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.

Develop

To test from a source distribution (without installing)--

python test_pystache.py

To test Pystache with multiple versions of Python (with a single command!), you can use tox:

pip install 'virtualenv<1.8'  # Version 1.8 dropped support for Python 2.4.
pip install 'tox<1.4'  # Version 1.4 dropped support for Python 2.4.
tox

If you do not have all Python versions listed in tox.ini--

tox -e py26,py32  # for example

The source distribution tests also include doctests and tests from the Mustache spec. To include tests from the Mustache spec in your test runs:

git submodule init
git submodule update

The test harness parses the spec's (more human-readable) yaml files if PyYAML is present. Otherwise, it parses the json files. To install PyYAML--

pip install pyyaml

To run a subset of the tests, you can use nose:

pip install nose
nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present

Using Python 3 with Pystache from source

Pystache is written in Python 2 and must be converted to Python 3 prior to using it with Python 3. The installation process (and tox) do this automatically.

To convert the code to Python 3 manually (while using Python 3)--

python setup.py build

This writes the converted code to a subdirectory called build. By design, Python 3 builds cannot be created from Python 2.

To convert the code without using setup.py, you can use 2to3 as follows (two steps)--

2to3 --write --nobackups --no-diffs --doctests_only pystache
2to3 --write --nobackups --no-diffs pystache

This converts the code (and doctests) in place.

To import pystache from a source distribution while using Python 3, be sure that you are importing from a directory containing a converted version of the code (e.g. from the build directory after converting), and not from the original (unconverted) source directory. Otherwise, you will get a syntax error. You can help prevent this by not running the Python IDE from the project directory when importing Pystache while using Python 3.

Mailing List

There is a mailing list. Note that there is a bit of a delay between posting a message and seeing it appear in the mailing list archive.

Credits

>>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek' }
>>> print pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}", context)
Author: Chris Wanstrath
Maintainer: Chris Jerdonek

Pystache logo by David Phillips is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

More Repositories

1

jquery-pjax

pushState + ajax = pjax
JavaScript
16,740
star
2

gist

Potentially the best command line gister.
Ruby
3,805
star
3

dotjs

~/.js
Ruby
3,161
star
4

facebox

Facebook-style lightbox, built in jQuery
JavaScript
1,928
star
5

unicorn

Unofficial Unicorn Mirror.
Ruby
1,410
star
6

github-gem

`github` command line helper for simplifying your GitHub experience.
Ruby
1,123
star
7

cijoe

CI Joe is a fun Continuous Integration server. Unmaintained.
Ruby
1,046
star
8

coffee-mode

Emacs Major Mode for CoffeeScript
Emacs Lisp
574
star
9

gist.el

Yet another Emacs paste mode, this one for Gist.
Emacs Lisp
548
star
10

hurl

Hurl makes HTTP requests.
JavaScript
529
star
11

rip

Take back your $LOAD_PATH. Deprecated and unmaintained.
Ruby
363
star
12

repl

Sometimes you need a REPL. Unmaintained, sorry.
Ruby
360
star
13

textmate.el

Basic emulation of awesome TextMate features for Emacs.
Emacs Lisp
356
star
14

colored

Colors in your terminal. Unmaintained.
Ruby
270
star
15

cache_fu

Ghost from Christmas past. Unmaintained.
Ruby
257
star
16

exception_logger

Unmaintained. Sorry.
Ruby
242
star
17

cheat

Cheating is fun!
Ruby
239
star
18

Zen

Distraction free writing for Atom.
CoffeeScript
193
star
19

emacs

My Emacs config
Emacs Lisp
187
star
20

choice

Choice is a gem for defining and parsing command line options with a friendly DSL.
Ruby
176
star
21

ambition

include Enumerable β€” Unmaintained
Ruby
165
star
22

markdown-mode

Emacs Markdown mode
Emacs Lisp
155
star
23

lyndon

Lyndon wraps JavaScript in a loving MacRuby embrace. A fun hack that is no longer maintained.
Ruby
145
star
24

nginx_config_generator

Generates nginx config files from YAML.
Ruby
125
star
25

acts_as_textiled

Makes your models act as textiled.
Ruby
115
star
26

resque-lock

A Resque plugin for ensuring only one instance of your job is running at a time.
Ruby
113
star
27

mofo

Mofo was a fast and simple microformat parser, based on a concise DSL and Hpricot. No longer maintained.
JavaScript
91
star
28

gem-man

RubyGems plugin to view a gem's manpage.
Ruby
85
star
29

quake

The source code to Quake, one of the best games ever.
79
star
30

mustache-sinatra-example

An example of using Mustache in a Sinatra app.
Ruby
79
star
31

defunkt.github.com

My GitHub Page
HTML
78
star
32

sake

System wide Rake.
Ruby
76
star
33

starling

Ruby
74
star
34

resque

Moved to resque/resque
57
star
35

ircamp

IRC <-> Campfire Bridge
Python
54
star
36

evilbot

an evil bot that's definitely not for convore
CoffeeScript
50
star
37

jasper

Lispy JavaScript
JavaScript
40
star
38

gibberish

Dead simple Rails localization.
Ruby
37
star
39

Mustache.tmbundle

A little textmate bundle for defunkt/mustache
36
star
40

resque-web

Sinatra-based web UI for Resque
Ruby
30
star
41

ike

Rake in Io.
Io
28
star
42

mapreducerb

Simple map/reduce in Ruby
Ruby
26
star
43

sake-tasks

Your own personal sake tasks, ripe for sharing.
25
star
44

matzbot

matzbot is nice so we are nice
Ruby
22
star
45

mustache-syntax-highlighter

Syntax highlighting plugin for mustache.rb
Ruby
22
star
46

repl-completion

Completion files for repl(1)
22
star
47

sfruby-meetup-resque

My Resque presentation at the SF Ruby Meetup, January 2010
Ruby
21
star
48

ftpd.rb

A simple ftp daemon, written in Ruby. Do not use β€” here for historical purposes.
Ruby
19
star
49

zippy

Zippy lil’ zipcode lib.
Ruby
18
star
50

subtlety

Subtlety: SVN => RSS, hAtom => Atom
Ruby
16
star
51

ambitious_activerecord

Unmaintained Ambitious ActiveRecord adapter, for Ambition.
Ruby
15
star
52

cheat.el

Cheat Emacs mode
Emacs Lisp
15
star
53

fixture_scenarios_builder

Build your fixtures in Ruby.
Ruby
15
star
54

resque-cli

A command line program for talking to Resque.
15
star
55

iui

Import of the iui library
JavaScript
14
star
56

ambitious_activeldap

Ambition adapter for ActiveLdap
Ruby
13
star
57

dodgeball.github.com

yes
Ruby
12
star
58

ooc-markdown

A Discount binding for ooc
C
12
star
59

pinder

My fork of Pinder, the Campfire API for Python developers.
Python
10
star
60

sdoc-helpers

Simple helpers to make using sdoc easier.
Ruby
10
star
61

metaid

10
star
62

Markdown-problems

Public repository to submit markdown problems to github support
9
star
63

currency_converter

Objective-C
9
star
64

magit

Mirror of the Magit Emacs mode.
Emacs Lisp
8
star
65

burn

Sinatra => Campfire
7
star
66

my-awesome-framework

A simple demonstration of how to effectively use Git submodules.
7
star
67

repo-in-a-repo

7
star
68

sakerb

Sake repository served fresh by the guys at Barefoot.
Ruby
7
star
69

barefootexamples

Ruby
7
star
70

ozimodo

An ancient Ruby on Rails powered tumblelog.
7
star
71

electron-wordwrap

7
star
72

redis-namespace

Moved to resque/redis-namespace
6
star
73

rtimeout

Ruby
6
star
74

lacampfire

Logical Awesome Campfire userscript.
JavaScript
6
star
75

my-fun-repo

5
star
76

my-fantastic-plugin

A simple demonstration of how to effectively use Git submodules.
5
star
77

github-markup

Moved!
5
star