inheritance uses a less awkward hack for contexts now and subclassing templates is...
[jinja2.git] / setup.py
1 # -*- coding: utf-8 -*-
2 """
3 Jinja2
4 ~~~~~~
5
6 Jinja2 is a template engine written in pure Python.  It provides a
7 `Django`_ inspired non-XML syntax but supports inline expressions and
8 an optional `sandboxed`_ environment.
9
10 Nutshell
11 --------
12
13 Here a small example of a Jinja template::
14
15     {% extends 'base.html' %}
16     {% block title %}Memberlist{% endblock %}
17     {% block content %}
18       <ul>
19       {% for user in users %}
20         <li><a href="{{ user.url }}">{{ user.username }}</a></li>
21       {% endfor %}
22       </ul>
23     {% endblock %}
24
25 Philosophy
26 ----------
27
28 Application logic is for the controller but don't try to make the life
29 for the template designer too hard by giving him too few functionality.
30
31 For more informations visit the new `jinja2 webpage`_ and `documentation`_.
32
33 The `Jinja2 tip`_ is installable via `easy_install` with ``easy_install
34 Jinja2==dev``.
35
36 .. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security)
37 .. _Django: http://www.djangoproject.com/
38 .. _jinja webpage: http://jinja2.pocoo.org/
39 .. _documentation: http://jinja2.pocoo.org/documentation/index.html
40 .. _Jinja tip: http://dev.pocoo.org/hg/jinja2-main/archive/tip.tar.gz#egg=Jinja2-dev
41 """
42 import os
43 import sys
44 import ez_setup
45 ez_setup.use_setuptools()
46
47 from setuptools import setup, Extension, Feature
48 from distutils.command.build_ext import build_ext
49 from distutils.errors import CCompilerError, DistutilsPlatformError
50
51
52 def list_files(path):
53     for fn in os.listdir(path):
54         if fn.startswith('.'):
55             continue
56         fn = os.path.join(path, fn)
57         if os.path.isfile(fn):
58             yield fn
59
60
61 def get_terminal_width():
62     """Return the current terminal dimensions."""
63     try:
64         from struct import pack, unpack
65         from fcntl import ioctl
66         from termios import TIOCGWINSZ
67         s = pack('HHHH', 0, 0, 0, 0)
68         return unpack('HHHH', ioctl(sys.stdout.fileno(), TIOCGWINSZ, s))[1]
69     except:
70         return 80
71
72
73 class optional_build_ext(build_ext):
74     """This class allows C extension building to fail."""
75
76     def run(self):
77         try:
78             build_ext.run(self)
79         except DistutilsPlatformError:
80             self._unavailable()
81
82     def build_extension(self, ext):
83         try:
84             build_ext.build_extension(self, ext)
85         except CCompilerError, x:
86             self._unavailable()
87
88     def _unavailable(self):
89         width = get_terminal_width()
90         print '*' * width
91         print """WARNING:
92 An optional C extension could not be compiled, speedups will not be
93 available."""
94         print '*' * width
95
96
97 setup(
98     name='Jinja2',
99     version='2.0dev',
100     url='http://jinja.pocoo.org/',
101     license='BSD',
102     author='Armin Ronacher',
103     author_email='armin.ronacher@active-4.com',
104     description='A small but fast and easy to use stand-alone template '
105                 'engine written in pure python.',
106     long_description=__doc__,
107     # jinja is egg safe. But because we distribute the documentation
108     # in form of html and txt files it's a better idea to extract the files
109     zip_safe=False,
110     classifiers=[
111         'Development Status :: 4 Beta',
112         'Environment :: Web Environment',
113         'Intended Audience :: Developers',
114         'License :: OSI Approved :: BSD License',
115         'Operating System :: OS Independent',
116         'Programming Language :: Python',
117         'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
118         'Topic :: Software Development :: Libraries :: Python Modules',
119         'Topic :: Text Processing :: Markup :: HTML'
120     ],
121     packages=['jinja2'],
122     data_files=[
123         ('docs/html', list(list_files('docs/html'))),
124         ('docs/txt', list(list_files('docs/src')))
125     ],
126     features={
127         'speedups': Feature("optional C speed-enhancements",
128             standard=True,
129             ext_modules=[
130                 Extension('jinja2._speedups', ['jinja2/_speedups.c'])
131             ]
132         )
133     },
134     extras_require={'i18n': ['Babel>=0.8']},
135     entry_points="""
136     [babel.extractors]
137     jinja2 = jinja.i18n:babel_extract[i18n]
138     """
139 )