Package: release.debian.org Severity: normal User: release.debian.org@packages.debian.org Usertags: freeze-exception Please unblock package jinja2 it's a bugfix release (I skipped docs, examples and removed markupsafe¹ module from attached debdiff²) [¹] we use packaged python-markupsafe instead, already in Squeeze [²] debdiff jinja2_2.5-1.dsc jinja2_2.5.2-2.dsc | \ filterdiff -x '*/docs/*' -x '*/examples/*' -x '*/_markupsafe/*' unblock jinja2/2.5.2-2 -- System Information: Debian Release: squeeze/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32-5-amd64 (SMP w/2 CPU cores) Locale: LANG=pl_PL.UTF-8, LC_CTYPE=pl_PL.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash -- Do you like the idea of time-based freezes? Mention it in your signature in all mails to debian-release@l.d.o to encourage Release Team!
diff -Nru jinja2-2.5/CHANGES jinja2-2.5.2/CHANGES --- jinja2-2.5/CHANGES 2010-05-29 20:55:56.000000000 +0200 +++ jinja2-2.5.2/CHANGES 2010-08-18 11:10:38.000000000 +0200 @@ -1,6 +1,33 @@ Jinja2 Changelog ================ +Version 2.5.2 +------------- +(bugfix release, released on August 18th 2010) + +- improved setup.py script to better work with assumptions people + might still have from it (``--with-speedups``). +- fixed a packaging error that excluded the new debug support. + +Version 2.5.1 +------------- +(bugfix release, released on August 17th 2010) + +- StopIteration exceptions raised by functions called from templates + are now intercepted and converted to undefineds. This solves a + lot of debugging grief. (StopIteration is used internally to + abort template execution) +- improved performance of macro calls slightly. +- babel extraction can now properly extract newstyle gettext calls. +- using the variable `num` in newstyle gettext for something else + than the pluralize count will no longer raise a :exc:`KeyError`. +- removed builtin markup class and switched to markupsafe. For backwards + compatibility the pure Python implementation still exists but is + pulled from markupsafe by the Jinja2 developers. The debug support + went into a separate feature called "debugsupport" and is disabled + by default because it is only relevant for Python 2.4 +- fixed an issue with unary operators having the wrong precendence. + Version 2.5 ----------- (codename Incoherence, relased on May 29th 2010) diff -Nru jinja2-2.5/debian/changelog jinja2-2.5.2/debian/changelog --- jinja2-2.5/debian/changelog 2010-08-22 16:45:49.000000000 +0200 +++ jinja2-2.5.2/debian/changelog 2010-08-22 16:45:49.000000000 +0200 @@ -1,3 +1,21 @@ +jinja2 (2.5.2-2) unstable; urgency=low + + * Really remove _markupsafe + + -- Piotr Ożarowski <piotr@debian.org> Thu, 19 Aug 2010 09:24:47 +0200 + +jinja2 (2.5.2-1) unstable; urgency=low + + * New upstream release + - speedups module moved to separate package: MarkupSafe + * python-markupsafe added to Depends (jinja2._markupsafe removed from the + package) + * debian/control: python3-jinja2 binary package updated to latest changes in + dh_python3 + * Standards-version bumped to 3.9.1 (no other changes needed) + + -- Piotr Ożarowski <piotr@debian.org> Wed, 18 Aug 2010 11:29:44 +0200 + jinja2 (2.5-1) unstable; urgency=low * New upstream release diff -Nru jinja2-2.5/debian/control jinja2-2.5.2/debian/control --- jinja2-2.5/debian/control 2010-08-22 16:45:49.000000000 +0200 +++ jinja2-2.5.2/debian/control 2010-08-22 16:45:49.000000000 +0200 @@ -8,7 +8,7 @@ python3-all-dev, python3-all-dbg, python-setuptools (>= 0.6b3-1~), python3-setuptools Build-Depends-Indep: python-sphinx (>= 0.6), python-pygments -Standards-Version: 3.8.4 +Standards-Version: 3.9.1 Homepage: http://jinja.pocoo.org/2/ XS-Python-Version: >= 2.4 Vcs-Svn: svn://svn.debian.org/python-modules/packages/jinja2/trunk @@ -16,7 +16,7 @@ Package: python-jinja2 Architecture: any -Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends} +Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends}, python-markupsafe Recommends: python-pkg-resources Provides: ${python:Provides} Suggests: python-jinja2-doc @@ -69,11 +69,10 @@ Package: python3-jinja2 Architecture: any -Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends}, python3.1 -Recommends: python-pkg-resources -Provides: ${python:Provides} -Suggests: python-jinja2-doc -XB-Python-Version: ${python:Versions} +Depends: ${python3:Depends}, ${shlibs:Depends}, ${misc:Depends}, python3-markupsafe, python3.1 +Recommends: python3-pkg-resources +Provides: ${python3:Provides} +Suggests: python3-jinja2-doc Description: small but fast and easy to use stand-alone template engine Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional diff -Nru jinja2-2.5/debian/copyright jinja2-2.5.2/debian/copyright --- jinja2-2.5/debian/copyright 2010-08-22 16:45:49.000000000 +0200 +++ jinja2-2.5.2/debian/copyright 2010-08-22 16:45:49.000000000 +0200 @@ -3,7 +3,7 @@ It was downloaded from http://pypi.python.org/pypi/Jinja2 -Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. +Copyright (c) 2009-2010 by the Jinja Team, see AUTHORS for more details. Some rights reserved. @@ -69,8 +69,8 @@ --------------------------------------------------------------- -The Debian packaging is © 2008-2009, Piotr Ożarowski <piotr@debian.org> and -is licensed under the BSD. +The Debian packaging is © 2008-2010, Piotr Ożarowski <piotr@debian.org> and +is licensed under the same license as Jinja2. On Debian systems, the complete text of the BSD License can be found in `/usr/share/common-licenses/BSD' diff -Nru jinja2-2.5/debian/rules jinja2-2.5.2/debian/rules --- jinja2-2.5/debian/rules 2010-08-22 16:45:49.000000000 +0200 +++ jinja2-2.5.2/debian/rules 2010-08-22 16:45:49.000000000 +0200 @@ -30,11 +30,11 @@ touch $@ build-python%: - python$* setup.py --with-speedups build + python$* setup.py --with-debugsupport build touch $@ build-debug-python%: - python$*-dbg setup.py --with-speedups build + python$*-dbg setup.py --with-debugsupport build touch $@ build-docs: @@ -46,13 +46,15 @@ touch $@ install-python%: build - python$* setup.py --with-speedups install $(py_setup_install_args) \ + python$* setup.py --with-debugsupport install $(py_setup_install_args) \ --skip-build --single-version-externally-managed --root $(call pkgdir,$*) sed -i -e 's,REPLACE_ME_WITH_PROPER_VERSION,$(VERSION),' $(call pkgdir,$*)$(call py_libdir,$*)/jinja2/__init__.py + rm -rf $(call pkgdir,$*)$(call py_libdir,$*)/jinja2/_markupsafe + rm -f $(call pkgdir,$*)$(call py_libdir,$*)/jinja2/_debugsupport.c touch $@ install-debug-python%: build - python$*-dbg setup.py --with-speedups install $(py_setup_install_args) \ + python$*-dbg setup.py --with-debugsupport install $(py_setup_install_args) \ --skip-build --single-version-externally-managed --root $(call pkgdir,$*)-dbg/ find $(call pkgdir,$*)-dbg/usr/ ! -type d ! -name '*_d\.so' -delete find $(call pkgdir,$*)-dbg/usr/ -depth -empty -delete diff -Nru jinja2-2.5/docs/extensions.rst jinja2-2.5.2/docs/extensions.rst diff -Nru jinja2-2.5/docs/faq.rst jinja2-2.5.2/docs/faq.rst diff -Nru jinja2-2.5/docs/intro.rst jinja2-2.5.2/docs/intro.rst diff -Nru jinja2-2.5/docs/templates.rst jinja2-2.5.2/docs/templates.rst diff -Nru jinja2-2.5/examples/bench.py jinja2-2.5.2/examples/bench.py diff -Nru jinja2-2.5/examples/profile.py jinja2-2.5.2/examples/profile.py diff -Nru jinja2-2.5/examples/rwbench/djangoext.py jinja2-2.5.2/examples/rwbench/djangoext.py Binary files /tmp/NpbD08VgxX/jinja2-2.5/examples/rwbench/djangoext.pyc and /tmp/ZmiIRk1ok5/jinja2-2.5.2/examples/rwbench/djangoext.pyc differ diff -Nru jinja2-2.5/examples/rwbench/rwbench.py jinja2-2.5.2/examples/rwbench/rwbench.py Binary files /tmp/NpbD08VgxX/jinja2-2.5/examples/rwbench/rwbench.pyc and /tmp/ZmiIRk1ok5/jinja2-2.5.2/examples/rwbench/rwbench.pyc differ diff -Nru jinja2-2.5/jinja2/compiler.py jinja2-2.5.2/jinja2/compiler.py --- jinja2-2.5/jinja2/compiler.py 2010-05-29 20:07:41.000000000 +0200 +++ jinja2-2.5.2/jinja2/compiler.py 2010-08-17 17:14:51.000000000 +0200 @@ -1223,8 +1223,6 @@ else: finalize = unicode - self.newline(node) - # if we are inside a frame that requires output checking, we do so outdent_later = False if frame.require_output_check: diff -Nru jinja2-2.5/jinja2/constants.py jinja2-2.5.2/jinja2/constants.py --- jinja2-2.5/jinja2/constants.py 2010-04-07 14:21:02.000000000 +0200 +++ jinja2-2.5.2/jinja2/constants.py 2010-08-17 17:14:51.000000000 +0200 @@ -30,261 +30,3 @@ tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus viverra volutpat vulputate''' - - -#: a dict of all html entities + apos -HTML_ENTITIES = { - 'AElig': 198, - 'Aacute': 193, - 'Acirc': 194, - 'Agrave': 192, - 'Alpha': 913, - 'Aring': 197, - 'Atilde': 195, - 'Auml': 196, - 'Beta': 914, - 'Ccedil': 199, - 'Chi': 935, - 'Dagger': 8225, - 'Delta': 916, - 'ETH': 208, - 'Eacute': 201, - 'Ecirc': 202, - 'Egrave': 200, - 'Epsilon': 917, - 'Eta': 919, - 'Euml': 203, - 'Gamma': 915, - 'Iacute': 205, - 'Icirc': 206, - 'Igrave': 204, - 'Iota': 921, - 'Iuml': 207, - 'Kappa': 922, - 'Lambda': 923, - 'Mu': 924, - 'Ntilde': 209, - 'Nu': 925, - 'OElig': 338, - 'Oacute': 211, - 'Ocirc': 212, - 'Ograve': 210, - 'Omega': 937, - 'Omicron': 927, - 'Oslash': 216, - 'Otilde': 213, - 'Ouml': 214, - 'Phi': 934, - 'Pi': 928, - 'Prime': 8243, - 'Psi': 936, - 'Rho': 929, - 'Scaron': 352, - 'Sigma': 931, - 'THORN': 222, - 'Tau': 932, - 'Theta': 920, - 'Uacute': 218, - 'Ucirc': 219, - 'Ugrave': 217, - 'Upsilon': 933, - 'Uuml': 220, - 'Xi': 926, - 'Yacute': 221, - 'Yuml': 376, - 'Zeta': 918, - 'aacute': 225, - 'acirc': 226, - 'acute': 180, - 'aelig': 230, - 'agrave': 224, - 'alefsym': 8501, - 'alpha': 945, - 'amp': 38, - 'and': 8743, - 'ang': 8736, - 'apos': 39, - 'aring': 229, - 'asymp': 8776, - 'atilde': 227, - 'auml': 228, - 'bdquo': 8222, - 'beta': 946, - 'brvbar': 166, - 'bull': 8226, - 'cap': 8745, - 'ccedil': 231, - 'cedil': 184, - 'cent': 162, - 'chi': 967, - 'circ': 710, - 'clubs': 9827, - 'cong': 8773, - 'copy': 169, - 'crarr': 8629, - 'cup': 8746, - 'curren': 164, - 'dArr': 8659, - 'dagger': 8224, - 'darr': 8595, - 'deg': 176, - 'delta': 948, - 'diams': 9830, - 'divide': 247, - 'eacute': 233, - 'ecirc': 234, - 'egrave': 232, - 'empty': 8709, - 'emsp': 8195, - 'ensp': 8194, - 'epsilon': 949, - 'equiv': 8801, - 'eta': 951, - 'eth': 240, - 'euml': 235, - 'euro': 8364, - 'exist': 8707, - 'fnof': 402, - 'forall': 8704, - 'frac12': 189, - 'frac14': 188, - 'frac34': 190, - 'frasl': 8260, - 'gamma': 947, - 'ge': 8805, - 'gt': 62, - 'hArr': 8660, - 'harr': 8596, - 'hearts': 9829, - 'hellip': 8230, - 'iacute': 237, - 'icirc': 238, - 'iexcl': 161, - 'igrave': 236, - 'image': 8465, - 'infin': 8734, - 'int': 8747, - 'iota': 953, - 'iquest': 191, - 'isin': 8712, - 'iuml': 239, - 'kappa': 954, - 'lArr': 8656, - 'lambda': 955, - 'lang': 9001, - 'laquo': 171, - 'larr': 8592, - 'lceil': 8968, - 'ldquo': 8220, - 'le': 8804, - 'lfloor': 8970, - 'lowast': 8727, - 'loz': 9674, - 'lrm': 8206, - 'lsaquo': 8249, - 'lsquo': 8216, - 'lt': 60, - 'macr': 175, - 'mdash': 8212, - 'micro': 181, - 'middot': 183, - 'minus': 8722, - 'mu': 956, - 'nabla': 8711, - 'nbsp': 160, - 'ndash': 8211, - 'ne': 8800, - 'ni': 8715, - 'not': 172, - 'notin': 8713, - 'nsub': 8836, - 'ntilde': 241, - 'nu': 957, - 'oacute': 243, - 'ocirc': 244, - 'oelig': 339, - 'ograve': 242, - 'oline': 8254, - 'omega': 969, - 'omicron': 959, - 'oplus': 8853, - 'or': 8744, - 'ordf': 170, - 'ordm': 186, - 'oslash': 248, - 'otilde': 245, - 'otimes': 8855, - 'ouml': 246, - 'para': 182, - 'part': 8706, - 'permil': 8240, - 'perp': 8869, - 'phi': 966, - 'pi': 960, - 'piv': 982, - 'plusmn': 177, - 'pound': 163, - 'prime': 8242, - 'prod': 8719, - 'prop': 8733, - 'psi': 968, - 'quot': 34, - 'rArr': 8658, - 'radic': 8730, - 'rang': 9002, - 'raquo': 187, - 'rarr': 8594, - 'rceil': 8969, - 'rdquo': 8221, - 'real': 8476, - 'reg': 174, - 'rfloor': 8971, - 'rho': 961, - 'rlm': 8207, - 'rsaquo': 8250, - 'rsquo': 8217, - 'sbquo': 8218, - 'scaron': 353, - 'sdot': 8901, - 'sect': 167, - 'shy': 173, - 'sigma': 963, - 'sigmaf': 962, - 'sim': 8764, - 'spades': 9824, - 'sub': 8834, - 'sube': 8838, - 'sum': 8721, - 'sup': 8835, - 'sup1': 185, - 'sup2': 178, - 'sup3': 179, - 'supe': 8839, - 'szlig': 223, - 'tau': 964, - 'there4': 8756, - 'theta': 952, - 'thetasym': 977, - 'thinsp': 8201, - 'thorn': 254, - 'tilde': 732, - 'times': 215, - 'trade': 8482, - 'uArr': 8657, - 'uacute': 250, - 'uarr': 8593, - 'ucirc': 251, - 'ugrave': 249, - 'uml': 168, - 'upsih': 978, - 'upsilon': 965, - 'uuml': 252, - 'weierp': 8472, - 'xi': 958, - 'yacute': 253, - 'yen': 165, - 'yuml': 255, - 'zeta': 950, - 'zwj': 8205, - 'zwnj': 8204 -} diff -Nru jinja2-2.5/jinja2/debug.py jinja2-2.5.2/jinja2/debug.py --- jinja2-2.5/jinja2/debug.py 2010-04-07 14:21:02.000000000 +0200 +++ jinja2-2.5.2/jinja2/debug.py 2010-08-17 17:14:51.000000000 +0200 @@ -60,7 +60,7 @@ self.frames = frames def chain_frames(self): - """Chains the frames. Requires ctypes or the speedups extension.""" + """Chains the frames. Requires ctypes or the debugsupport extension.""" prev_tb = None for tb in self.frames: if prev_tb is not None: @@ -299,7 +299,7 @@ # try to get a tb_set_next implementation try: - from jinja2._speedups import tb_set_next + from jinja2._debugsupport import tb_set_next except ImportError: try: tb_set_next = _init_ugly_crap() diff -Nru jinja2-2.5/jinja2/_debugsupport.c jinja2-2.5.2/jinja2/_debugsupport.c --- jinja2-2.5/jinja2/_debugsupport.c 1970-01-01 01:00:00.000000000 +0100 +++ jinja2-2.5.2/jinja2/_debugsupport.c 2010-08-17 17:14:51.000000000 +0200 @@ -0,0 +1,78 @@ +/** + * jinja2._debugsupport + * ~~~~~~~~~~~~~~~~~~~~ + * + * C implementation of `tb_set_next`. + * + * :copyright: (c) 2010 by the Jinja Team. + * :license: BSD. + */ + +#include <Python.h> + + +static PyObject* +tb_set_next(PyObject *self, PyObject *args) +{ + PyTracebackObject *tb, *old; + PyObject *next; + + if (!PyArg_ParseTuple(args, "O!O:tb_set_next", &PyTraceBack_Type, &tb, &next)) + return NULL; + if (next == Py_None) + next = NULL; + else if (!PyTraceBack_Check(next)) { + PyErr_SetString(PyExc_TypeError, + "tb_set_next arg 2 must be traceback or None"); + return NULL; + } + else + Py_INCREF(next); + + old = tb->tb_next; + tb->tb_next = (PyTracebackObject*)next; + Py_XDECREF(old); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef module_methods[] = { + {"tb_set_next", (PyCFunction)tb_set_next, METH_VARARGS, + "Set the tb_next member of a traceback object."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + + +#if PY_MAJOR_VERSION < 3 + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +init_debugsupport(void) +{ + Py_InitModule3("jinja2._debugsupport", module_methods, ""); +} + +#else /* Python 3.x module initialization */ + +static struct PyModuleDef module_definition = { + PyModuleDef_HEAD_INIT, + "jinja2._debugsupport", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__debugsupport(void) +{ + return PyModule_Create(&module_definition); +} + +#endif diff -Nru jinja2-2.5/jinja2/ext.py jinja2-2.5.2/jinja2/ext.py --- jinja2-2.5/jinja2/ext.py 2010-05-29 22:25:38.000000000 +0200 +++ jinja2-2.5.2/jinja2/ext.py 2010-08-17 17:14:51.000000000 +0200 @@ -13,7 +13,7 @@ from collections import deque from jinja2 import nodes from jinja2.defaults import * -from jinja2.environment import get_spontaneous_environment +from jinja2.environment import Environment from jinja2.runtime import Undefined, concat from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError from jinja2.utils import contextfunction, import_string, Markup, next @@ -286,7 +286,8 @@ parser.fail('pluralize without variables', lineno) node = self._make_node(singular, plural, variables, plural_expr, - bool(referenced), num_called_num) + bool(referenced), + num_called_num and have_plural) node.set_lineno(lineno) return node @@ -326,7 +327,7 @@ vars_referenced, num_called_num): """Generates a useful node from the data provided.""" # no variables referenced? no need to escape for old style - # gettext invocations + # gettext invocations only if there are vars. if not vars_referenced and not self.environment.newstyle_gettext: singular = singular.replace('%%', '%') if plural: @@ -545,6 +546,10 @@ gettext call in one line of code and the matching comment in the same line or the line before. + .. versionchanged:: 2.5.1 + The `newstyle_gettext` flag can be set to `True` to enable newstyle + gettext calls. + :param fileobj: the file-like object the messages should be extracted from :param keywords: a list of keywords (i.e. function names) that should be recognized as translation functions @@ -563,7 +568,10 @@ if InternationalizationExtension not in extensions: extensions.add(InternationalizationExtension) - environment = get_spontaneous_environment( + def getbool(options, key, default=False): + options.get(key, str(default)).lower() in ('1', 'on', 'yes', 'true') + + environment = Environment( options.get('block_start_string', BLOCK_START_STRING), options.get('block_end_string', BLOCK_END_STRING), options.get('variable_start_string', VARIABLE_START_STRING), @@ -572,17 +580,15 @@ options.get('comment_end_string', COMMENT_END_STRING), options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX, options.get('line_comment_prefix') or LINE_COMMENT_PREFIX, - str(options.get('trim_blocks', TRIM_BLOCKS)).lower() in \ - ('1', 'on', 'yes', 'true'), + getbool(options, 'trim_blocks', TRIM_BLOCKS), NEWLINE_SEQUENCE, frozenset(extensions), - # fill with defaults so that environments are shared - # with other spontaneus environments. The rest of the - # arguments are optimizer, undefined, finalize, autoescape, - # loader, cache size, auto reloading setting and the - # bytecode cache - True, Undefined, None, False, None, 0, False, None + cache_size=0, + auto_reload=False ) + if getbool(options, 'newstyle_gettext'): + environment.newstyle_gettext = True + source = fileobj.read().decode(options.get('encoding', 'utf-8')) try: node = environment.parse(source) diff -Nru jinja2-2.5/jinja2/filters.py jinja2-2.5.2/jinja2/filters.py --- jinja2-2.5/jinja2/filters.py 2010-05-23 23:00:52.000000000 +0200 +++ jinja2-2.5.2/jinja2/filters.py 2010-08-18 11:13:09.000000000 +0200 @@ -555,16 +555,10 @@ """ if not method in ('common', 'ceil', 'floor'): raise FilterArgumentError('method must be common, ceil or floor') - if precision < 0: - raise FilterArgumentError('precision must be a postive integer ' - 'or zero.') if method == 'common': return round(value, precision) func = getattr(math, method) - if precision: - return func(value * 10 * precision) / (10 * precision) - else: - return func(value) + return func(value * (10 ** precision)) / (10 ** precision) @environmentfilter diff -Nru jinja2-2.5/jinja2/lexer.py jinja2-2.5.2/jinja2/lexer.py --- jinja2-2.5/jinja2/lexer.py 2010-04-07 14:21:02.000000000 +0200 +++ jinja2-2.5.2/jinja2/lexer.py 2010-08-17 17:14:51.000000000 +0200 @@ -432,9 +432,10 @@ 'root': [ # directives (c('(.*?)(?:%s)' % '|'.join( - [r'(?P<raw_begin>(?:\s*%s\-|%s)\s*raw\s*%s)' % ( + [r'(?P<raw_begin>(?:\s*%s\-|%s)\s*raw\s*(?:\-%s\s*|%s))' % ( e(environment.block_start_string), e(environment.block_start_string), + e(environment.block_end_string), e(environment.block_end_string) )] + [ r'(?P<%s_begin>\s*%s\-|%s)' % (n, r, r) diff -Nru jinja2-2.5/jinja2/_markupsafe/_bundle.py jinja2-2.5.2/jinja2/_markupsafe/_bundle.py diff -Nru jinja2-2.5/jinja2/_markupsafe/_constants.py jinja2-2.5.2/jinja2/_markupsafe/_constants.py diff -Nru jinja2-2.5/jinja2/_markupsafe/__init__.py jinja2-2.5.2/jinja2/_markupsafe/__init__.py diff -Nru jinja2-2.5/jinja2/_markupsafe/_native.py jinja2-2.5.2/jinja2/_markupsafe/_native.py diff -Nru jinja2-2.5/jinja2/_markupsafe/tests.py jinja2-2.5.2/jinja2/_markupsafe/tests.py diff -Nru jinja2-2.5/jinja2/parser.py jinja2-2.5.2/jinja2/parser.py --- jinja2-2.5/jinja2/parser.py 2010-04-12 14:02:14.000000000 +0200 +++ jinja2-2.5.2/jinja2/parser.py 2010-08-17 17:14:51.000000000 +0200 @@ -370,7 +370,7 @@ target = self.parse_tuple(simplified=True, extra_end_rules=extra_end_rules) else: - target = self.parse_primary(with_postfix=False) + target = self.parse_primary() target.set_ctx('store') if not target.can_assign(): self.fail('can\'t assign to %r' % target.__class__. @@ -525,20 +525,22 @@ lineno = self.stream.current.lineno return left - def parse_unary(self): + def parse_unary(self, with_postfix=True): token_type = self.stream.current.type lineno = self.stream.current.lineno if token_type == 'sub': next(self.stream) - node = self.parse_unary() - return nodes.Neg(node, lineno=lineno) - if token_type == 'add': - next(self.stream) - node = self.parse_unary() - return nodes.Pos(node, lineno=lineno) - return self.parse_primary() + node = nodes.Neg(self.parse_unary(False), lineno=lineno) + elif token_type == 'add': + next(self.stream) + node = nodes.Pos(self.parse_unary(False), lineno=lineno) + else: + node = self.parse_primary() + if with_postfix: + node = self.parse_postfix(node) + return node - def parse_primary(self, with_postfix=True): + def parse_primary(self): token = self.stream.current if token.type == 'name': if token.value in ('true', 'false', 'True', 'False'): @@ -570,8 +572,6 @@ node = self.parse_dict() else: self.fail("unexpected '%s'" % describe_token(token), token.lineno) - if with_postfix: - node = self.parse_postfix(node) return node def parse_tuple(self, simplified=False, with_condexpr=True, @@ -596,7 +596,7 @@ """ lineno = self.stream.current.lineno if simplified: - parse = lambda: self.parse_primary(with_postfix=False) + parse = self.parse_primary elif with_condexpr: parse = self.parse_expression else: diff -Nru jinja2-2.5/jinja2/runtime.py jinja2-2.5.2/jinja2/runtime.py --- jinja2-2.5/jinja2/runtime.py 2010-05-29 21:16:29.000000000 +0200 +++ jinja2-2.5.2/jinja2/runtime.py 2010-08-17 17:14:51.000000000 +0200 @@ -179,7 +179,12 @@ args = (__self.eval_ctx,) + args elif getattr(__obj, 'environmentfunction', 0): args = (__self.environment,) + args - return __obj(*args, **kwargs) + try: + return __obj(*args, **kwargs) + except StopIteration: + return __self.environment.undefined('value was undefined because ' + 'a callable raised a ' + 'StopIteration exception') def derived(self, locals=None): """Internal helper function to create a derived context.""" @@ -345,7 +350,7 @@ class Macro(object): - """Wraps a macro.""" + """Wraps a macro function.""" def __init__(self, environment, func, name, arguments, defaults, catch_kwargs, catch_varargs, caller): @@ -361,20 +366,24 @@ @internalcode def __call__(self, *args, **kwargs): - arguments = [] - for idx, name in enumerate(self.arguments): - try: - value = args[idx] - except: + # try to consume the positional arguments + arguments = list(args[:self._argument_count]) + off = len(arguments) + + # if the number of arguments consumed is not the number of + # arguments expected we start filling in keyword arguments + # and defaults. + if off != self._argument_count: + for idx, name in enumerate(self.arguments[len(arguments):]): try: value = kwargs.pop(name) - except: + except KeyError: try: - value = self.defaults[idx - self._argument_count] - except: + value = self.defaults[idx - self._argument_count + off] + except IndexError: value = self._environment.undefined( 'parameter %r was not provided' % name, name=name) - arguments.append(value) + arguments.append(value) # it's important that the order of these arguments does not change # if not also changed in the compiler's `function_scoping` method. diff -Nru jinja2-2.5/jinja2/_speedups.c jinja2-2.5.2/jinja2/_speedups.c --- jinja2-2.5/jinja2/_speedups.c 2010-04-07 14:21:02.000000000 +0200 +++ jinja2-2.5.2/jinja2/_speedups.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,259 +0,0 @@ -/** - * jinja2._speedups - * ~~~~~~~~~~~~~~~~ - * - * This module implements functions for automatic escaping in C for better - * performance. Additionally it defines a `tb_set_next` function to patch the - * debug traceback. If the speedups module is not compiled a ctypes - * implementation of `tb_set_next` and Python implementations of the other - * functions are used. - * - * :copyright: (c) 2009 by the Jinja Team. - * :license: BSD. - */ - -#include <Python.h> - -#define ESCAPED_CHARS_TABLE_SIZE 63 -#define UNICHR(x) (((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL))->str); - -#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) -typedef int Py_ssize_t; -#define PY_SSIZE_T_MAX INT_MAX -#define PY_SSIZE_T_MIN INT_MIN -#endif - - -static PyObject* markup; -static Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE]; -static Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE]; - -static int -init_constants(void) -{ - PyObject *module; - /* happing of characters to replace */ - escaped_chars_repl['"'] = UNICHR("""); - escaped_chars_repl['\''] = UNICHR("'"); - escaped_chars_repl['&'] = UNICHR("&"); - escaped_chars_repl['<'] = UNICHR("<"); - escaped_chars_repl['>'] = UNICHR(">"); - - /* lengths of those characters when replaced - 1 */ - memset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len)); - escaped_chars_delta_len['"'] = escaped_chars_delta_len['\''] = \ - escaped_chars_delta_len['&'] = 4; - escaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3; - - /* import markup type so that we can mark the return value */ - module = PyImport_ImportModule("jinja2.utils"); - if (!module) - return 0; - markup = PyObject_GetAttrString(module, "Markup"); - Py_DECREF(module); - - return 1; -} - -static PyObject* -escape_unicode(PyUnicodeObject *in) -{ - PyUnicodeObject *out; - Py_UNICODE *inp = in->str; - const Py_UNICODE *inp_end = in->str + in->length; - Py_UNICODE *next_escp; - Py_UNICODE *outp; - Py_ssize_t delta=0, erepl=0, delta_len=0; - - /* First we need to figure out how long the escaped string will be */ - while (*(inp) || inp < inp_end) { - if (*inp < ESCAPED_CHARS_TABLE_SIZE && escaped_chars_delta_len[*inp]) { - delta += escaped_chars_delta_len[*inp]; - ++erepl; - } - ++inp; - } - - /* Do we need to escape anything at all? */ - if (!erepl) { - Py_INCREF(in); - return (PyObject*)in; - } - - out = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, in->length + delta); - if (!out) - return NULL; - - outp = out->str; - inp = in->str; - while (erepl-- > 0) { - /* look for the next substitution */ - next_escp = inp; - while (next_escp < inp_end) { - if (*next_escp < ESCAPED_CHARS_TABLE_SIZE && - (delta_len = escaped_chars_delta_len[*next_escp])) { - ++delta_len; - break; - } - ++next_escp; - } - - if (next_escp > inp) { - /* copy unescaped chars between inp and next_escp */ - Py_UNICODE_COPY(outp, inp, next_escp-inp); - outp += next_escp - inp; - } - - /* escape 'next_escp' */ - Py_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len); - outp += delta_len; - - inp = next_escp + 1; - } - if (inp < inp_end) - Py_UNICODE_COPY(outp, inp, in->length - (inp - in->str)); - - return (PyObject*)out; -} - - -static PyObject* -escape(PyObject *self, PyObject *text) -{ - PyObject *s = NULL, *rv = NULL, *html; - - /* we don't have to escape integers, bools or floats */ - if (PyLong_CheckExact(text) || -#if PY_MAJOR_VERSION < 3 - PyInt_CheckExact(text) || -#endif - PyFloat_CheckExact(text) || PyBool_Check(text) || - text == Py_None) - return PyObject_CallFunctionObjArgs(markup, text, NULL); - - /* if the object has an __html__ method that performs the escaping */ - html = PyObject_GetAttrString(text, "__html__"); - if (html) { - rv = PyObject_CallObject(html, NULL); - Py_DECREF(html); - return rv; - } - - /* otherwise make the object unicode if it isn't, then escape */ - PyErr_Clear(); - if (!PyUnicode_Check(text)) { -#if PY_MAJOR_VERSION < 3 - PyObject *unicode = PyObject_Unicode(text); -#else - PyObject *unicode = PyObject_Str(text); -#endif - if (!unicode) - return NULL; - s = escape_unicode((PyUnicodeObject*)unicode); - Py_DECREF(unicode); - } - else - s = escape_unicode((PyUnicodeObject*)text); - - /* convert the unicode string into a markup object. */ - rv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL); - Py_DECREF(s); - return rv; -} - - -static PyObject* -soft_unicode(PyObject *self, PyObject *s) -{ - if (!PyUnicode_Check(s)) -#if PY_MAJOR_VERSION < 3 - return PyObject_Unicode(s); -#else - return PyObject_Str(s); -#endif - Py_INCREF(s); - return s; -} - - -static PyObject* -tb_set_next(PyObject *self, PyObject *args) -{ - PyTracebackObject *tb, *old; - PyObject *next; - - if (!PyArg_ParseTuple(args, "O!O:tb_set_next", &PyTraceBack_Type, &tb, &next)) - return NULL; - if (next == Py_None) - next = NULL; - else if (!PyTraceBack_Check(next)) { - PyErr_SetString(PyExc_TypeError, - "tb_set_next arg 2 must be traceback or None"); - return NULL; - } - else - Py_INCREF(next); - - old = tb->tb_next; - tb->tb_next = (PyTracebackObject*)next; - Py_XDECREF(old); - - Py_INCREF(Py_None); - return Py_None; -} - - -static PyMethodDef module_methods[] = { - {"escape", (PyCFunction)escape, METH_O, - "escape(s) -> markup\n\n" - "Convert the characters &, <, >, ', and \" in string s to HTML-safe\n" - "sequences. Use this if you need to display text that might contain\n" - "such characters in HTML. Marks return value as markup string."}, - {"soft_unicode", (PyCFunction)soft_unicode, METH_O, - "soft_unicode(object) -> string\n\n" - "Make a string unicode if it isn't already. That way a markup\n" - "string is not converted back to unicode."}, - {"tb_set_next", (PyCFunction)tb_set_next, METH_VARARGS, - "Set the tb_next member of a traceback object."}, - {NULL, NULL, 0, NULL} /* Sentinel */ -}; - - -#if PY_MAJOR_VERSION < 3 - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif -PyMODINIT_FUNC -init_speedups(void) -{ - if (!init_constants()) - return; - - Py_InitModule3("jinja2._speedups", module_methods, ""); -} - -#else /* Python 3.x module initialization */ - -static struct PyModuleDef module_definition = { - PyModuleDef_HEAD_INIT, - "jinja2._speedups", - NULL, - -1, - module_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__speedups(void) -{ - if (!init_constants()) - return NULL; - - return PyModule_Create(&module_definition); -} - -#endif diff -Nru jinja2-2.5/jinja2/testsuite/api.py jinja2-2.5.2/jinja2/testsuite/api.py --- jinja2-2.5/jinja2/testsuite/api.py 2010-05-23 23:14:39.000000000 +0200 +++ jinja2-2.5.2/jinja2/testsuite/api.py 2010-08-17 17:14:51.000000000 +0200 @@ -172,6 +172,14 @@ class UndefinedTestCase(JinjaTestCase): + def test_stopiteration_is_undefined(self): + def test(): + raise StopIteration() + t = Template('A{{ test() }}B') + assert t.render(test=test) == 'AB' + t = Template('A{{ test().missingattribute }}B') + self.assert_raises(UndefinedError, t.render, test=test) + def test_default_undefined(self): env = Environment(undefined=Undefined) self.assert_equal(env.from_string('{{ missing }}').render(), u'') diff -Nru jinja2-2.5/jinja2/testsuite/ext.py jinja2-2.5.2/jinja2/testsuite/ext.py --- jinja2-2.5/jinja2/testsuite/ext.py 2010-05-29 22:30:54.000000000 +0200 +++ jinja2-2.5.2/jinja2/testsuite/ext.py 2010-08-17 17:14:51.000000000 +0200 @@ -51,7 +51,13 @@ 'stringformat.html': '{{ _("User: %(num)s", num=user_count) }}', 'ngettext.html': '{{ ngettext("%(num)s apple", "%(num)s apples", apples) }}', 'ngettext_long.html': '{% trans num=apples %}{{ num }} apple{% pluralize %}' - '{{ num }} apples{% endtrans %}' + '{{ num }} apples{% endtrans %}', + 'transvars1.html': '{% trans %}User: {{ num }}{% endtrans %}', + 'transvars2.html': '{% trans num=count %}User: {{ num }}{% endtrans %}', + 'transvars3.html': '{% trans count=num %}User: {{ count }}{% endtrans %}', + 'novars.html': '{% trans %}%(hello)s{% endtrans %}', + 'vars.html': '{% trans %}{{ foo }}%(foo)s{% endtrans %}', + 'explicitvars.html': '{% trans foo="42" %}%(foo)s{% endtrans %}' } @@ -62,6 +68,7 @@ 'One user online': u'Ein Benutzer online', '%(user_count)s users online': u'%(user_count)s Benutzer online', 'User: %(num)s': u'Benutzer: %(num)s', + 'User: %(count)s': u'Benutzer: %(count)s', '%(num)s apple': u'%(num)s Apfel', '%(num)s apples': u'%(num)s Äpfel' } @@ -345,6 +352,22 @@ assert re.search(r"l_ngettext, u?'\%\(num\)s apple', u?'\%\(num\)s " r"apples', 3", source) is not None + def test_trans_vars(self): + t1 = newstyle_i18n_env.get_template('transvars1.html') + t2 = newstyle_i18n_env.get_template('transvars2.html') + t3 = newstyle_i18n_env.get_template('transvars3.html') + assert t1.render(num=1, LANGUAGE='de') == 'Benutzer: 1' + assert t2.render(count=23, LANGUAGE='de') == 'Benutzer: 23' + assert t3.render(num=42, LANGUAGE='de') == 'Benutzer: 42' + + def test_novars_vars_escaping(self): + t = newstyle_i18n_env.get_template('novars.html') + assert t.render() == '%(hello)s' + t = newstyle_i18n_env.get_template('vars.html') + assert t.render(foo='42') == '42%(foo)s' + t = newstyle_i18n_env.get_template('explicitvars.html') + assert t.render() == '%(foo)s' + class AutoEscapeTestCase(JinjaTestCase): diff -Nru jinja2-2.5/jinja2/testsuite/filters.py jinja2-2.5.2/jinja2/testsuite/filters.py --- jinja2-2.5/jinja2/testsuite/filters.py 2010-05-23 23:02:27.000000000 +0200 +++ jinja2-2.5.2/jinja2/testsuite/filters.py 2010-08-17 17:14:51.000000000 +0200 @@ -206,13 +206,19 @@ def test_abs(self): tmpl = env.from_string('''{{ -1|abs }}|{{ 1|abs }}''') - return tmpl.render() == '1|1' + assert tmpl.render() == '1|1', tmpl.render() - def test_round(self): + def test_round_positive(self): tmpl = env.from_string('{{ 2.7|round }}|{{ 2.1|round }}|' - "{{ 2.1234|round(2, 'floor') }}|" + "{{ 2.1234|round(3, 'floor') }}|" "{{ 2.1|round(0, 'ceil') }}") - return tmpl.render() == '3.0|2.0|2.1|3.0' + assert tmpl.render() == '3.0|2.0|2.123|3.0', tmpl.render() + + def test_round_negative(self): + tmpl = env.from_string('{{ 21.3|round(-1)}}|' + "{{ 21.3|round(-1, 'ceil')}}|" + "{{ 21.3|round(-1, 'floor')}}") + assert tmpl.render() == '20.0|30.0|20.0',tmpl.render() def test_xmlattr(self): tmpl = env.from_string("{{ {'foo': 42, 'bar': 23, 'fish': none, " diff -Nru jinja2-2.5/jinja2/testsuite/lexnparse.py jinja2-2.5.2/jinja2/testsuite/lexnparse.py --- jinja2-2.5/jinja2/testsuite/lexnparse.py 2010-04-07 14:21:02.000000000 +0200 +++ jinja2-2.5.2/jinja2/testsuite/lexnparse.py 2010-08-17 17:14:51.000000000 +0200 @@ -16,7 +16,8 @@ from jinja2.testsuite import JinjaTestCase -from jinja2 import Environment, Template, TemplateSyntaxError, UndefinedError +from jinja2 import Environment, Template, TemplateSyntaxError, \ + UndefinedError, nodes env = Environment() @@ -36,6 +37,10 @@ '{%raw%}{{ bar }}|{% baz %}{% endraw %}') assert tmpl.render() == 'foo|{{ bar }}|{% baz %}' + def test_raw2(self): + tmpl = env.from_string('1 {%- raw -%} 2 {%- endraw -%} 3') + assert tmpl.render() == '123' + def test_balancing(self): env = Environment('{%', '%}', '${', '}') tmpl = env.from_string('''{% for item in seq @@ -353,6 +358,11 @@ '{{ none is defined }}|{{ missing is defined }}') assert tmpl.render() == 'True|False|None|True|False' + def test_neg_filter_priority(self): + node = env.parse('{{ -1|foo }}') + assert isinstance(node.body[0].nodes[0], nodes.Filter) + assert isinstance(node.body[0].nodes[0].node, nodes.Neg) + def test_const_assign(self): constass1 = '''{% set true = 42 %}''' constass2 = '''{% for none in seq %}{% endfor %}''' diff -Nru jinja2-2.5/jinja2/utils.py jinja2-2.5.2/jinja2/utils.py --- jinja2-2.5/jinja2/utils.py 2010-04-20 19:48:26.000000000 +0200 +++ jinja2-2.5.2/jinja2/utils.py 2010-08-17 17:14:51.000000000 +0200 @@ -349,205 +349,6 @@ return Markup(u'\n'.join(u'<p>%s</p>' % escape(x) for x in result)) -class Markup(unicode): - r"""Marks a string as being safe for inclusion in HTML/XML output without - needing to be escaped. This implements the `__html__` interface a couple - of frameworks and web applications use. :class:`Markup` is a direct - subclass of `unicode` and provides all the methods of `unicode` just that - it escapes arguments passed and always returns `Markup`. - - The `escape` function returns markup objects so that double escaping can't - happen. If you want to use autoescaping in Jinja just enable the - autoescaping feature in the environment. - - The constructor of the :class:`Markup` class can be used for three - different things: When passed an unicode object it's assumed to be safe, - when passed an object with an HTML representation (has an `__html__` - method) that representation is used, otherwise the object passed is - converted into a unicode string and then assumed to be safe: - - >>> Markup("Hello <em>World</em>!") - Markup(u'Hello <em>World</em>!') - >>> class Foo(object): - ... def __html__(self): - ... return '<a href="#">foo</a>' - ... - >>> Markup(Foo()) - Markup(u'<a href="#">foo</a>') - - If you want object passed being always treated as unsafe you can use the - :meth:`escape` classmethod to create a :class:`Markup` object: - - >>> Markup.escape("Hello <em>World</em>!") - Markup(u'Hello <em>World</em>!') - - Operations on a markup string are markup aware which means that all - arguments are passed through the :func:`escape` function: - - >>> em = Markup("<em>%s</em>") - >>> em % "foo & bar" - Markup(u'<em>foo & bar</em>') - >>> strong = Markup("<strong>%(text)s</strong>") - >>> strong % {'text': '<blink>hacker here</blink>'} - Markup(u'<strong><blink>hacker here</blink></strong>') - >>> Markup("<em>Hello</em> ") + "<foo>" - Markup(u'<em>Hello</em> <foo>') - """ - __slots__ = () - - def __new__(cls, base=u'', encoding=None, errors='strict'): - if hasattr(base, '__html__'): - base = base.__html__() - if encoding is None: - return unicode.__new__(cls, base) - return unicode.__new__(cls, base, encoding, errors) - - def __html__(self): - return self - - def __add__(self, other): - if hasattr(other, '__html__') or isinstance(other, basestring): - return self.__class__(unicode(self) + unicode(escape(other))) - return NotImplemented - - def __radd__(self, other): - if hasattr(other, '__html__') or isinstance(other, basestring): - return self.__class__(unicode(escape(other)) + unicode(self)) - return NotImplemented - - def __mul__(self, num): - if isinstance(num, (int, long)): - return self.__class__(unicode.__mul__(self, num)) - return NotImplemented - __rmul__ = __mul__ - - def __mod__(self, arg): - if isinstance(arg, tuple): - arg = tuple(imap(_MarkupEscapeHelper, arg)) - else: - arg = _MarkupEscapeHelper(arg) - return self.__class__(unicode.__mod__(self, arg)) - - def __repr__(self): - return '%s(%s)' % ( - self.__class__.__name__, - unicode.__repr__(self) - ) - - def join(self, seq): - return self.__class__(unicode.join(self, imap(escape, seq))) - join.__doc__ = unicode.join.__doc__ - - def split(self, *args, **kwargs): - return map(self.__class__, unicode.split(self, *args, **kwargs)) - split.__doc__ = unicode.split.__doc__ - - def rsplit(self, *args, **kwargs): - return map(self.__class__, unicode.rsplit(self, *args, **kwargs)) - rsplit.__doc__ = unicode.rsplit.__doc__ - - def splitlines(self, *args, **kwargs): - return map(self.__class__, unicode.splitlines(self, *args, **kwargs)) - splitlines.__doc__ = unicode.splitlines.__doc__ - - def unescape(self): - r"""Unescape markup again into an unicode string. This also resolves - known HTML4 and XHTML entities: - - >>> Markup("Main » <em>About</em>").unescape() - u'Main \xbb <em>About</em>' - """ - from jinja2.constants import HTML_ENTITIES - def handle_match(m): - name = m.group(1) - if name in HTML_ENTITIES: - return unichr(HTML_ENTITIES[name]) - try: - if name[:2] in ('#x', '#X'): - return unichr(int(name[2:], 16)) - elif name.startswith('#'): - return unichr(int(name[1:])) - except ValueError: - pass - return u'' - return _entity_re.sub(handle_match, unicode(self)) - - def striptags(self): - r"""Unescape markup into an unicode string and strip all tags. This - also resolves known HTML4 and XHTML entities. Whitespace is - normalized to one: - - >>> Markup("Main » <em>About</em>").striptags() - u'Main \xbb About' - """ - stripped = u' '.join(_striptags_re.sub('', self).split()) - return Markup(stripped).unescape() - - @classmethod - def escape(cls, s): - """Escape the string. Works like :func:`escape` with the difference - that for subclasses of :class:`Markup` this function would return the - correct subclass. - """ - rv = escape(s) - if rv.__class__ is not cls: - return cls(rv) - return rv - - def make_wrapper(name): - orig = getattr(unicode, name) - def func(self, *args, **kwargs): - args = _escape_argspec(list(args), enumerate(args)) - _escape_argspec(kwargs, kwargs.iteritems()) - return self.__class__(orig(self, *args, **kwargs)) - func.__name__ = orig.__name__ - func.__doc__ = orig.__doc__ - return func - - for method in '__getitem__', 'capitalize', \ - 'title', 'lower', 'upper', 'replace', 'ljust', \ - 'rjust', 'lstrip', 'rstrip', 'center', 'strip', \ - 'translate', 'expandtabs', 'swapcase', 'zfill': - locals()[method] = make_wrapper(method) - - # new in python 2.5 - if hasattr(unicode, 'partition'): - partition = make_wrapper('partition'), - rpartition = make_wrapper('rpartition') - - # new in python 2.6 - if hasattr(unicode, 'format'): - format = make_wrapper('format') - - # not in python 3 - if hasattr(unicode, '__getslice__'): - __getslice__ = make_wrapper('__getslice__') - - del method, make_wrapper - - -def _escape_argspec(obj, iterable): - """Helper for various string-wrapped functions.""" - for key, value in iterable: - if hasattr(value, '__html__') or isinstance(value, basestring): - obj[key] = escape(value) - return obj - - -class _MarkupEscapeHelper(object): - """Helper for Markup.__mod__""" - - def __init__(self, obj): - self.obj = obj - - __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x]) - __str__ = lambda s: str(escape(s.obj)) - __unicode__ = lambda s: unicode(escape(s.obj)) - __repr__ = lambda s: str(escape(repr(s.obj))) - __int__ = lambda s: int(s.obj) - __float__ = lambda s: float(s.obj) - - class LRUCache(object): """A simple LRU Cache implementation.""" @@ -776,33 +577,14 @@ return self.sep -# we have to import it down here as the speedups module imports the -# markup type which is define above. +# try markupsafe first, if that fails go with Jinja2's bundled version +# of markupsafe. Markupsafe was previously Jinja2's implementation of +# the Markup object but was moved into a separate package in a patchleve +# release try: - from jinja2._speedups import escape, soft_unicode + from markupsafe import Markup, escape, soft_unicode except ImportError: - def escape(s): - """Convert the characters &, <, >, ' and " in string s to HTML-safe - sequences. Use this if you need to display text that might contain - such characters in HTML. Marks return value as markup string. - """ - if hasattr(s, '__html__'): - return s.__html__() - return Markup(unicode(s) - .replace('&', '&') - .replace('>', '>') - .replace('<', '<') - .replace("'", ''') - .replace('"', '"') - ) - - def soft_unicode(s): - """Make a string unicode if it isn't already. That way a markup - string is not converted back to unicode. - """ - if not isinstance(s, unicode): - s = unicode(s) - return s + from jinja2._markupsafe import Markup, escape, soft_unicode # partials diff -Nru jinja2-2.5/Jinja2.egg-info/PKG-INFO jinja2-2.5.2/Jinja2.egg-info/PKG-INFO --- jinja2-2.5/Jinja2.egg-info/PKG-INFO 2010-05-29 22:54:35.000000000 +0200 +++ jinja2-2.5.2/Jinja2.egg-info/PKG-INFO 2010-08-18 11:15:03.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: Jinja2 -Version: 2.5 +Version: 2.5.2 Summary: A small but fast and easy to use stand-alone template engine written in pure python. Home-page: http://jinja.pocoo.org/ Author: Armin Ronacher diff -Nru jinja2-2.5/Jinja2.egg-info/SOURCES.txt jinja2-2.5.2/Jinja2.egg-info/SOURCES.txt --- jinja2-2.5/Jinja2.egg-info/SOURCES.txt 2010-05-29 22:54:35.000000000 +0200 +++ jinja2-2.5.2/Jinja2.egg-info/SOURCES.txt 2010-08-18 11:15:03.000000000 +0200 @@ -113,7 +113,9 @@ examples/basic/templates/broken.html examples/basic/templates/subbroken.html examples/rwbench/djangoext.py +examples/rwbench/djangoext.pyc examples/rwbench/rwbench.py +examples/rwbench/rwbench.pyc examples/rwbench/django/_form.html examples/rwbench/django/_input_field.html examples/rwbench/django/_textarea.html @@ -140,7 +142,7 @@ ext/django2jinja/templates/layout.html ext/django2jinja/templates/subtemplate.html jinja2/__init__.py -jinja2/_speedups.c +jinja2/_debugsupport.c jinja2/_stringdefs.py jinja2/bccache.py jinja2/compiler.py @@ -162,6 +164,11 @@ jinja2/tests.py jinja2/utils.py jinja2/visitor.py +jinja2/_markupsafe/__init__.py +jinja2/_markupsafe/_bundle.py +jinja2/_markupsafe/_constants.py +jinja2/_markupsafe/_native.py +jinja2/_markupsafe/tests.py jinja2/testsuite/__init__.py jinja2/testsuite/api.py jinja2/testsuite/core_tags.py diff -Nru jinja2-2.5/MANIFEST.in jinja2-2.5.2/MANIFEST.in --- jinja2-2.5/MANIFEST.in 2010-05-23 23:23:37.000000000 +0200 +++ jinja2-2.5.2/MANIFEST.in 2010-08-18 11:10:00.000000000 +0200 @@ -1,4 +1,4 @@ -include MANIFEST.in Makefile CHANGES LICENSE AUTHORS jinja2/_speedups.c +include MANIFEST.in Makefile CHANGES LICENSE AUTHORS jinja2/_debugsupport.c recursive-include docs * recursive-include custom_fixers * recursive-include ext * diff -Nru jinja2-2.5/PKG-INFO jinja2-2.5.2/PKG-INFO --- jinja2-2.5/PKG-INFO 2010-05-29 22:54:35.000000000 +0200 +++ jinja2-2.5.2/PKG-INFO 2010-08-18 11:15:04.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: Jinja2 -Version: 2.5 +Version: 2.5.2 Summary: A small but fast and easy to use stand-alone template engine written in pure python. Home-page: http://jinja.pocoo.org/ Author: Armin Ronacher diff -Nru jinja2-2.5/setup.py jinja2-2.5.2/setup.py --- jinja2-2.5/setup.py 2010-05-29 22:53:58.000000000 +0200 +++ jinja2-2.5.2/setup.py 2010-08-18 11:14:23.000000000 +0200 @@ -43,6 +43,16 @@ import sys from setuptools import setup, Extension, Feature +from distutils.command.build_ext import build_ext + +debugsupport = Feature( + 'optional C debug support', + standard=False, + ext_modules = [ + Extension('jinja2._debugsupport', ['jinja2/_debugsupport.c']), + ], +) + # tell distribute to use 2to3 with our own fixers. extra = {} @@ -52,10 +62,25 @@ use_2to3_fixers=['custom_fixers'] ) +# ignore the old '--with-speedups' flag +try: + speedups_pos = sys.argv.index('--with-speedups') +except ValueError: + pass +else: + sys.argv[speedups_pos] = '--with-debugsupport' + sys.stderr.write('*' * 74 + '\n') + sys.stderr.write('WARNING:\n') + sys.stderr.write(' the --with-speedups flag is deprecated, assuming ' + '--with-debugsupport\n') + sys.stderr.write(' For the actual speedups install the MarkupSafe ' + 'package.\n') + sys.stderr.write('*' * 74 + '\n') + setup( name='Jinja2', - version='2.5', + version='2.5.2', url='http://jinja.pocoo.org/', license='BSD', author='Armin Ronacher', @@ -77,15 +102,8 @@ 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Text Processing :: Markup :: HTML' ], - packages=['jinja2', 'jinja2.testsuite', 'jinja2.testsuite.res'], - features={ - 'speedups': Feature("optional C speed-enhancements", - standard=False, - ext_modules=[ - Extension('jinja2._speedups', ['jinja2/_speedups.c']) - ] - ) - }, + packages=['jinja2', 'jinja2.testsuite', 'jinja2.testsuite.res', + 'jinja2._markupsafe'], extras_require={'i18n': ['Babel>=0.8']}, test_suite='jinja2.testsuite.suite', include_package_data=True, @@ -93,5 +111,6 @@ [babel.extractors] jinja2 = jinja2.ext:babel_extract[i18n] """, + features={'debugsupport': debugsupport}, **extra )
Attachment:
signature.asc
Description: Digital signature