Commit 86b7e3d1 authored by hbristow's avatar hbristow

Moved Jinja2 into 3rdparty. Now using latest stable version from pypi (2.7.1)

parent 224f44a2
...@@ -27,13 +27,13 @@ ...@@ -27,13 +27,13 @@
:license: BSD, see LICENSE for more details. :license: BSD, see LICENSE for more details.
""" """
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
__version__ = '2.8-dev' __version__ = '2.7.1'
# high level interface # high level interface
from jinja2.environment import Environment, Template from jinja2.environment import Environment, Template
# loaders # loaders
from jinja2.loaders import BaseLoader, FileSystemLoader, \ from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \
DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \ DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \
ModuleLoader ModuleLoader
...@@ -58,7 +58,7 @@ from jinja2.utils import Markup, escape, clear_caches, \ ...@@ -58,7 +58,7 @@ from jinja2.utils import Markup, escape, clear_caches, \
__all__ = [ __all__ = [
'Environment', 'Template', 'BaseLoader', 'FileSystemLoader', 'Environment', 'Template', 'BaseLoader', 'FileSystemLoader',
'DictLoader', 'FunctionLoader', 'PrefixLoader', 'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader',
'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache', 'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache',
'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined', 'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined',
'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound', 'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound',
......
...@@ -82,6 +82,12 @@ else: ...@@ -82,6 +82,12 @@ else:
return filename.encode('utf-8') return filename.encode('utf-8')
return filename return filename
try:
next = next
except NameError:
def next(it):
return it.next()
def with_metaclass(meta, *bases): def with_metaclass(meta, *bases):
# This requires a bit of explanation: the basic idea is to make a # This requires a bit of explanation: the basic idea is to make a
...@@ -103,7 +109,42 @@ def with_metaclass(meta, *bases): ...@@ -103,7 +109,42 @@ def with_metaclass(meta, *bases):
return metaclass('temporary_class', None, {}) return metaclass('temporary_class', None, {})
try:
from collections import Mapping as mapping_types
except ImportError:
import UserDict
mapping_types = (UserDict.UserDict, UserDict.DictMixin, dict)
# common types. These do exist in the special types module too which however
# does not exist in IronPython out of the box. Also that way we don't have
# to deal with implementation specific stuff here
class _C(object):
def method(self): pass
def _func():
yield None
function_type = type(_func)
generator_type = type(_func())
method_type = type(_C().method)
code_type = type(_C.method.__code__)
try:
raise TypeError()
except TypeError:
_tb = sys.exc_info()[2]
traceback_type = type(_tb)
frame_type = type(_tb.tb_frame)
try: try:
from urllib.parse import quote_from_bytes as url_quote from urllib.parse import quote_from_bytes as url_quote
except ImportError: except ImportError:
from urllib import quote as url_quote from urllib import quote as url_quote
try:
from thread import allocate_lock
except ImportError:
try:
from threading import Lock as allocate_lock
except ImportError:
from dummy_thread import allocate_lock
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -21,7 +21,7 @@ import tempfile ...@@ -21,7 +21,7 @@ import tempfile
import fnmatch import fnmatch
from hashlib import sha1 from hashlib import sha1
from jinja2.utils import open_if_exists from jinja2.utils import open_if_exists
from jinja2._compat import BytesIO, pickle, PY2 from jinja2._compat import BytesIO, pickle, PY2, text_type
# marshal works better on 3.x, one hack less required # marshal works better on 3.x, one hack less required
...@@ -160,7 +160,7 @@ class BytecodeCache(object): ...@@ -160,7 +160,7 @@ class BytecodeCache(object):
hash = sha1(name.encode('utf-8')) hash = sha1(name.encode('utf-8'))
if filename is not None: if filename is not None:
filename = '|' + filename filename = '|' + filename
if isinstance(filename, unicode): if isinstance(filename, text_type):
filename = filename.encode('utf-8') filename = filename.encode('utf-8')
hash.update(filename) hash.update(filename)
return hash.hexdigest() return hash.hexdigest()
......
...@@ -16,7 +16,7 @@ from jinja2.nodes import EvalContext ...@@ -16,7 +16,7 @@ from jinja2.nodes import EvalContext
from jinja2.visitor import NodeVisitor from jinja2.visitor import NodeVisitor
from jinja2.exceptions import TemplateAssertionError from jinja2.exceptions import TemplateAssertionError
from jinja2.utils import Markup, concat, escape from jinja2.utils import Markup, concat, escape
from jinja2._compat import range_type, text_type, string_types, \ from jinja2._compat import range_type, next, text_type, string_types, \
iteritems, NativeStringIO, imap iteritems, NativeStringIO, imap
...@@ -949,16 +949,9 @@ class CodeGenerator(NodeVisitor): ...@@ -949,16 +949,9 @@ class CodeGenerator(NodeVisitor):
self.indent() self.indent()
if node.with_context: if node.with_context:
self.writeline('include_context = template.new_context('
'context.parent, True, locals())')
self.writeline('for name, context_blocks in context.'
'blocks.%s():' % dict_item_iter)
self.indent()
self.writeline('include_context.blocks.setdefault('
'name, [])[0:0] = context_blocks')
self.outdent()
self.writeline('for event in template.root_render_func(' self.writeline('for event in template.root_render_func('
'include_context):') 'template.new_context(context.parent, True, '
'locals())):')
else: else:
self.writeline('for event in template.module._body_stream:') self.writeline('for event in template.module._body_stream:')
......
# -*- coding: utf-8 -*-
"""
jinja.constants
~~~~~~~~~~~~~~~
Various constants.
:copyright: (c) 2010 by the Jinja Team.
:license: BSD, see LICENSE for more details.
"""
#: list of lorem ipsum words used by the lipsum() helper function
LOREM_IPSUM_WORDS = u'''\
a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at
auctor augue bibendum blandit class commodo condimentum congue consectetuer
consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus
diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend
elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames
faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac
hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum
justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem
luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie
mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non
nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque
penatibus per pharetra phasellus placerat platea porta porttitor posuere
potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus
ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit
sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor
tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices
ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus
viverra volutpat vulputate'''
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
""" """
import sys import sys
import traceback import traceback
from types import TracebackType, CodeType from types import TracebackType
from jinja2.utils import missing, internal_code from jinja2.utils import missing, internal_code
from jinja2.exceptions import TemplateSyntaxError from jinja2.exceptions import TemplateSyntaxError
from jinja2._compat import iteritems, reraise from jinja2._compat import iteritems, reraise, code_type
# on pypy we can take advantage of transparent proxies # on pypy we can take advantage of transparent proxies
try: try:
...@@ -245,7 +245,7 @@ def fake_exc_info(exc_info, filename, lineno): ...@@ -245,7 +245,7 @@ def fake_exc_info(exc_info, filename, lineno):
location = 'block "%s"' % function[6:] location = 'block "%s"' % function[6:]
else: else:
location = 'template' location = 'template'
code = CodeType(0, code.co_nlocals, code.co_stacksize, code = code_type(0, code.co_nlocals, code.co_stacksize,
code.co_flags, code.co_code, code.co_consts, code.co_flags, code.co_code, code.co_consts,
code.co_names, code.co_varnames, filename, code.co_names, code.co_varnames, filename,
location, code.co_firstlineno, location, code.co_firstlineno,
......
...@@ -29,6 +29,7 @@ KEEP_TRAILING_NEWLINE = False ...@@ -29,6 +29,7 @@ KEEP_TRAILING_NEWLINE = False
# default filters, tests and namespace # default filters, tests and namespace
from jinja2.filters import FILTERS as DEFAULT_FILTERS from jinja2.filters import FILTERS as DEFAULT_FILTERS
from jinja2.tests import TESTS as DEFAULT_TESTS
DEFAULT_NAMESPACE = { DEFAULT_NAMESPACE = {
'range': range_type, 'range': range_type,
'dict': lambda **kw: kw, 'dict': lambda **kw: kw,
......
...@@ -15,7 +15,7 @@ from jinja2.defaults import BLOCK_START_STRING, \ ...@@ -15,7 +15,7 @@ from jinja2.defaults import BLOCK_START_STRING, \
BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \ BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \ COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \ LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
DEFAULT_FILTERS, DEFAULT_NAMESPACE, \ DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \
KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
from jinja2.lexer import get_lexer, TokenStream from jinja2.lexer import get_lexer, TokenStream
from jinja2.parser import Parser from jinja2.parser import Parser
...@@ -290,6 +290,7 @@ class Environment(object): ...@@ -290,6 +290,7 @@ class Environment(object):
# defaults # defaults
self.filters = DEFAULT_FILTERS.copy() self.filters = DEFAULT_FILTERS.copy()
self.tests = DEFAULT_TESTS.copy()
self.globals = DEFAULT_NAMESPACE.copy() self.globals = DEFAULT_NAMESPACE.copy()
# set the loader provided # set the loader provided
...@@ -410,7 +411,7 @@ class Environment(object): ...@@ -410,7 +411,7 @@ class Environment(object):
func = self.filters.get(name) func = self.filters.get(name)
if func is None: if func is None:
raise TemplateRuntimeError('no filter named %r' % name) raise TemplateRuntimeError('no filter named %r' % name)
args = list(args or ()) args = [value] + list(args or ())
if getattr(func, 'contextfilter', False): if getattr(func, 'contextfilter', False):
if context is None: if context is None:
raise TemplateRuntimeError('Attempted to invoke context ' raise TemplateRuntimeError('Attempted to invoke context '
...@@ -425,7 +426,7 @@ class Environment(object): ...@@ -425,7 +426,7 @@ class Environment(object):
args.insert(0, eval_ctx) args.insert(0, eval_ctx)
elif getattr(func, 'environmentfilter', False): elif getattr(func, 'environmentfilter', False):
args.insert(0, self) args.insert(0, self)
return func(value, *args, **(kwargs or {})) return func(*args, **(kwargs or {}))
def call_test(self, name, value, args=None, kwargs=None): def call_test(self, name, value, args=None, kwargs=None):
"""Invokes a test on a value the same way the compiler does it. """Invokes a test on a value the same way the compiler does it.
......
This diff is collapsed.
...@@ -18,7 +18,7 @@ from jinja2.utils import Markup, escape, pformat, urlize, soft_unicode, \ ...@@ -18,7 +18,7 @@ from jinja2.utils import Markup, escape, pformat, urlize, soft_unicode, \
unicode_urlencode unicode_urlencode
from jinja2.runtime import Undefined from jinja2.runtime import Undefined
from jinja2.exceptions import FilterArgumentError from jinja2.exceptions import FilterArgumentError
from jinja2._compat import imap, string_types, text_type, iteritems from jinja2._compat import next, imap, string_types, text_type, iteritems
_word_re = re.compile(r'\w+(?u)') _word_re = re.compile(r'\w+(?u)')
...@@ -183,10 +183,10 @@ def do_title(s): ...@@ -183,10 +183,10 @@ def do_title(s):
uppercase letters, all remaining characters are lowercase. uppercase letters, all remaining characters are lowercase.
""" """
rv = [] rv = []
for item in re.compile(r'([-\s]+)(?u)').split(soft_unicode(s)): for item in re.compile(r'([-\s]+)(?u)').split(s):
if not item: if not item:
continue continue
rv.append(item[0].upper() + item[1:]) rv.append(item[0].upper() + item[1:].lower())
return ''.join(rv) return ''.join(rv)
...@@ -842,15 +842,14 @@ def do_map(*args, **kwargs): ...@@ -842,15 +842,14 @@ def do_map(*args, **kwargs):
@contextfilter @contextfilter
def do_select(*args, **kwargs): def do_select(*args, **kwargs):
"""Filters a sequence of objects by appying a test to the object and only """Filters a sequence of objects by appying a test to either the object
selecting the ones with the test succeeding. or the attribute and only selecting the ones with the test succeeding.
Example usage: Example usage:
.. sourcecode:: jinja .. sourcecode:: jinja
{{ numbers|select("odd") }} {{ numbers|select("odd") }}
{{ numbers|select("odd") }}
.. versionadded:: 2.7 .. versionadded:: 2.7
""" """
...@@ -859,8 +858,8 @@ def do_select(*args, **kwargs): ...@@ -859,8 +858,8 @@ def do_select(*args, **kwargs):
@contextfilter @contextfilter
def do_reject(*args, **kwargs): def do_reject(*args, **kwargs):
"""Filters a sequence of objects by appying a test to the object and """Filters a sequence of objects by appying a test to either the object
rejecting the ones with the test succeeding. or the attribute and rejecting the ones with the test succeeding.
Example usage: Example usage:
...@@ -875,8 +874,8 @@ def do_reject(*args, **kwargs): ...@@ -875,8 +874,8 @@ def do_reject(*args, **kwargs):
@contextfilter @contextfilter
def do_selectattr(*args, **kwargs): def do_selectattr(*args, **kwargs):
"""Filters a sequence of objects by appying a test to an attribute of an """Filters a sequence of objects by appying a test to either the object
object and only selecting the ones with the test succeeding. or the attribute and only selecting the ones with the test succeeding.
Example usage: Example usage:
...@@ -892,8 +891,8 @@ def do_selectattr(*args, **kwargs): ...@@ -892,8 +891,8 @@ def do_selectattr(*args, **kwargs):
@contextfilter @contextfilter
def do_rejectattr(*args, **kwargs): def do_rejectattr(*args, **kwargs):
"""Filters a sequence of objects by appying a test to an attribute of an """Filters a sequence of objects by appying a test to either the object
object or the attribute and rejecting the ones with the test succeeding. or the attribute and rejecting the ones with the test succeeding.
.. sourcecode:: jinja .. sourcecode:: jinja
......
...@@ -20,7 +20,7 @@ from operator import itemgetter ...@@ -20,7 +20,7 @@ from operator import itemgetter
from collections import deque from collections import deque
from jinja2.exceptions import TemplateSyntaxError from jinja2.exceptions import TemplateSyntaxError
from jinja2.utils import LRUCache from jinja2.utils import LRUCache
from jinja2._compat import iteritems, implements_iterator, text_type, \ from jinja2._compat import next, iteritems, implements_iterator, text_type, \
intern intern
......
...@@ -192,6 +192,71 @@ class FileSystemLoader(BaseLoader): ...@@ -192,6 +192,71 @@ class FileSystemLoader(BaseLoader):
return sorted(found) return sorted(found)
class PackageLoader(BaseLoader):
"""Load templates from python eggs or packages. It is constructed with
the name of the python package and the path to the templates in that
package::
loader = PackageLoader('mypackage', 'views')
If the package path is not given, ``'templates'`` is assumed.
Per default the template encoding is ``'utf-8'`` which can be changed
by setting the `encoding` parameter to something else. Due to the nature
of eggs it's only possible to reload templates if the package was loaded
from the file system and not a zip file.
"""
def __init__(self, package_name, package_path='templates',
encoding='utf-8'):
from pkg_resources import DefaultProvider, ResourceManager, \
get_provider
provider = get_provider(package_name)
self.encoding = encoding
self.manager = ResourceManager()
self.filesystem_bound = isinstance(provider, DefaultProvider)
self.provider = provider
self.package_path = package_path
def get_source(self, environment, template):
pieces = split_template_path(template)
p = '/'.join((self.package_path,) + tuple(pieces))
if not self.provider.has_resource(p):
raise TemplateNotFound(template)
filename = uptodate = None
if self.filesystem_bound:
filename = self.provider.get_resource_filename(self.manager, p)
mtime = path.getmtime(filename)
def uptodate():
try:
return path.getmtime(filename) == mtime
except OSError:
return False
source = self.provider.get_resource_string(self.manager, p)
return source.decode(self.encoding), filename, uptodate
def list_templates(self):
path = self.package_path
if path[:2] == './':
path = path[2:]
elif path == '.':
path = ''
offset = len(path)
results = []
def _walk(path):
for filename in self.provider.resource_listdir(path):
fullname = path + '/' + filename
if self.provider.resource_isdir(fullname):
_walk(fullname)
else:
results.append(fullname[offset:].lstrip('/'))
_walk(path)
results.sort()
return results
class DictLoader(BaseLoader): class DictLoader(BaseLoader):
"""Loads a template from a python dict. It's passed a dict of unicode """Loads a template from a python dict. It's passed a dict of unicode
strings bound to template names. This loader is useful for unittesting: strings bound to template names. This loader is useful for unittesting:
......
# -*- coding: utf-8 -*-
"""
jinja2.meta
~~~~~~~~~~~
This module implements various functions that exposes information about
templates that might be interesting for various kinds of applications.
:copyright: (c) 2010 by the Jinja Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from jinja2 import nodes
from jinja2.compiler import CodeGenerator
from jinja2._compat import string_types
class TrackingCodeGenerator(CodeGenerator):
"""We abuse the code generator for introspection."""
def __init__(self, environment):
CodeGenerator.__init__(self, environment, '<introspection>',
'<introspection>')
self.undeclared_identifiers = set()
def write(self, x):
"""Don't write."""
def pull_locals(self, frame):
"""Remember all undeclared identifiers."""
self.undeclared_identifiers.update(frame.identifiers.undeclared)
def find_undeclared_variables(ast):
"""Returns a set of all variables in the AST that will be looked up from
the context at runtime. Because at compile time it's not known which
variables will be used depending on the path the execution takes at
runtime, all variables are returned.
>>> from jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
>>> meta.find_undeclared_variables(ast)
set(['bar'])
.. admonition:: Implementation
Internally the code generator is used for finding undeclared variables.
This is good to know because the code generator might raise a
:exc:`TemplateAssertionError` during compilation and as a matter of
fact this function can currently raise that exception as well.
"""
codegen = TrackingCodeGenerator(ast.environment)
codegen.visit(ast)
return codegen.undeclared_identifiers
def find_referenced_templates(ast):
"""Finds all the referenced templates from the AST. This will return an
iterator over all the hardcoded template extensions, inclusions and
imports. If dynamic inheritance or inclusion is used, `None` will be
yielded.
>>> from jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% extends "layout.html" %}{% include helper %}')
>>> list(meta.find_referenced_templates(ast))
['layout.html', None]
This function is useful for dependency tracking. For example if you want
to rebuild parts of the website after a layout template has changed.
"""
for node in ast.find_all((nodes.Extends, nodes.FromImport, nodes.Import,
nodes.Include)):
if not isinstance(node.template, nodes.Const):
# a tuple with some non consts in there
if isinstance(node.template, (nodes.Tuple, nodes.List)):
for template_name in node.template.items:
# something const, only yield the strings and ignore
# non-string consts that really just make no sense
if isinstance(template_name, nodes.Const):
if isinstance(template_name.value, string_types):
yield template_name.value
# something dynamic in there
else:
yield None
# something dynamic we don't know about here
else:
yield None
continue
# constant is a basestring, direct template name
if isinstance(node.template.value, string_types):
yield node.template.value
# a tuple or list (latter *should* not happen) made of consts,
# yield the consts that are strings. We could warn here for
# non string values
elif isinstance(node, nodes.Include) and \
isinstance(node.template.value, (tuple, list)):
for template_name in node.template.value:
if isinstance(template_name, string_types):
yield template_name
# something else we don't care about, we could warn here
else:
yield None
...@@ -12,16 +12,16 @@ ...@@ -12,16 +12,16 @@
:copyright: (c) 2010 by the Jinja Team. :copyright: (c) 2010 by the Jinja Team.
:license: BSD, see LICENSE for more details. :license: BSD, see LICENSE for more details.
""" """
import types
import operator import operator
from collections import deque from collections import deque
from jinja2.utils import Markup from jinja2.utils import Markup
from jinja2._compat import izip, with_metaclass, text_type from jinja2._compat import next, izip, with_metaclass, text_type, \
method_type, function_type
#: the types we support for context functions #: the types we support for context functions
_context_function_types = (types.FunctionType, types.MethodType) _context_function_types = (function_type, method_type)
_binop_to_func = { _binop_to_func = {
...@@ -232,6 +232,9 @@ class Node(with_metaclass(NodeType, object)): ...@@ -232,6 +232,9 @@ class Node(with_metaclass(NodeType, object)):
def __ne__(self, other): def __ne__(self, other):
return not self.__eq__(other) return not self.__eq__(other)
# Restore Python 2 hashing behavior on Python 3
__hash__ = object.__hash__
def __repr__(self): def __repr__(self):
return '%s(%s)' % ( return '%s(%s)' % (
self.__class__.__name__, self.__class__.__name__,
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
from jinja2 import nodes from jinja2 import nodes
from jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError from jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError
from jinja2.lexer import describe_token, describe_token_expr from jinja2.lexer import describe_token, describe_token_expr
from jinja2._compat import imap from jinja2._compat import next, imap
#: statements that callinto #: statements that callinto
......
...@@ -14,7 +14,7 @@ from jinja2.utils import Markup, soft_unicode, escape, missing, concat, \ ...@@ -14,7 +14,7 @@ from jinja2.utils import Markup, soft_unicode, escape, missing, concat, \
internalcode, object_type_repr internalcode, object_type_repr
from jinja2.exceptions import UndefinedError, TemplateRuntimeError, \ from jinja2.exceptions import UndefinedError, TemplateRuntimeError, \
TemplateNotFound TemplateNotFound
from jinja2._compat import imap, text_type, iteritems, \ from jinja2._compat import next, imap, text_type, iteritems, \
implements_iterator, implements_to_string, string_types, PY2 implements_iterator, implements_to_string, string_types, PY2
...@@ -497,6 +497,15 @@ class Undefined(object): ...@@ -497,6 +497,15 @@ class Undefined(object):
__float__ = __complex__ = __pow__ = __rpow__ = \ __float__ = __complex__ = __pow__ = __rpow__ = \
_fail_with_undefined_error _fail_with_undefined_error
def __eq__(self, other):
return type(self) is type(other)
def __ne__(self, other):
return not self.__eq__(other)
def __hash__(self):
return id(type(self))
def __str__(self): def __str__(self):
return u'' return u''
...@@ -563,7 +572,8 @@ class StrictUndefined(Undefined): ...@@ -563,7 +572,8 @@ class StrictUndefined(Undefined):
""" """
__slots__ = () __slots__ = ()
__iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \ __iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \
__ne__ = __bool__ = Undefined._fail_with_undefined_error __ne__ = __bool__ = __hash__ = \
Undefined._fail_with_undefined_error
# remove remaining slots attributes, after the metaclass did the magic they # remove remaining slots attributes, after the metaclass did the magic they
......
This diff is collapsed.
# -*- coding: utf-8 -*-
"""
jinja2.tests
~~~~~~~~~~~~
Jinja test functions. Used with the "is" operator.
:copyright: (c) 2010 by the Jinja Team.
:license: BSD, see LICENSE for more details.
"""
import re
from jinja2.runtime import Undefined
from jinja2._compat import text_type, string_types, mapping_types
number_re = re.compile(r'^-?\d+(\.\d+)?$')
regex_type = type(number_re)
test_callable = callable
def test_odd(value):
"""Return true if the variable is odd."""
return value % 2 == 1
def test_even(value):
"""Return true if the variable is even."""
return value % 2 == 0
def test_divisibleby(value, num):
"""Check if a variable is divisible by a number."""
return value % num == 0
def test_defined(value):
"""Return true if the variable is defined:
.. sourcecode:: jinja
{% if variable is defined %}
value of variable: {{ variable }}
{% else %}
variable is not defined
{% endif %}
See the :func:`default` filter for a simple way to set undefined
variables.
"""
return not isinstance(value, Undefined)
def test_undefined(value):
"""Like :func:`defined` but the other way round."""
return isinstance(value, Undefined)
def test_none(value):
"""Return true if the variable is none."""
return value is None
def test_lower(value):
"""Return true if the variable is lowercased."""
return text_type(value).islower()
def test_upper(value):
"""Return true if the variable is uppercased."""
return text_type(value).isupper()
def test_string(value):
"""Return true if the object is a string."""
return isinstance(value, string_types)
def test_mapping(value):
"""Return true if the object is a mapping (dict etc.).
.. versionadded:: 2.6
"""
return isinstance(value, mapping_types)
def test_number(value):
"""Return true if the variable is a number."""
return isinstance(value, (int, float, complex))
def test_sequence(value):
"""Return true if the variable is a sequence. Sequences are variables
that are iterable.
"""
try:
len(value)
value.__getitem__
except:
return False
return True
def test_sameas(value, other):
"""Check if an object points to the same memory address than another
object:
.. sourcecode:: jinja
{% if foo.attribute is sameas false %}
the foo attribute really is the `False` singleton
{% endif %}
"""
return value is other
def test_iterable(value):
"""Check if it's possible to iterate over an object."""
try:
iter(value)
except TypeError:
return False
return True
def test_escaped(value):
"""Check if the value is escaped."""
return hasattr(value, '__html__')
TESTS = {
'odd': test_odd,
'even': test_even,
'divisibleby': test_divisibleby,
'defined': test_defined,
'undefined': test_undefined,
'none': test_none,
'lower': test_lower,
'upper': test_upper,
'string': test_string,
'mapping': test_mapping,
'number': test_number,
'sequence': test_sequence,
'iterable': test_iterable,
'callable': test_callable,
'sameas': test_sameas,
'escaped': test_escaped
}
...@@ -11,9 +11,8 @@ ...@@ -11,9 +11,8 @@
import re import re
import errno import errno
from collections import deque from collections import deque
from threading import Lock
from jinja2._compat import text_type, string_types, implements_iterator, \ from jinja2._compat import text_type, string_types, implements_iterator, \
url_quote allocate_lock, url_quote
_word_split_re = re.compile(r'(\s+)') _word_split_re = re.compile(r'(\s+)')
...@@ -310,7 +309,7 @@ class LRUCache(object): ...@@ -310,7 +309,7 @@ class LRUCache(object):
self._popleft = self._queue.popleft self._popleft = self._queue.popleft
self._pop = self._queue.pop self._pop = self._queue.pop
self._remove = self._queue.remove self._remove = self._queue.remove
self._wlock = Lock() self._wlock = allocate_lock()
self._append = self._queue.append self._append = self._queue.append
def __getstate__(self): def __getstate__(self):
......
...@@ -125,7 +125,11 @@ endfunction() ...@@ -125,7 +125,11 @@ endfunction()
# sets the variable MATLAB_FOUND to TRUE # sets the variable MATLAB_FOUND to TRUE
function(locate_matlab_components MATLAB_ROOT_DIR) function(locate_matlab_components MATLAB_ROOT_DIR)
# get the mex extension # get the mex extension
if (UNIX)
execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext OUTPUT_VARIABLE MATLAB_MEXEXT_) execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext OUTPUT_VARIABLE MATLAB_MEXEXT_)
elseif (WIN32)
execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext.bat OUTPUT_VARIABLE MATLAB_MEXEXT_)
endif()
if (NOT MATLAB_MEXEXT_) if (NOT MATLAB_MEXEXT_)
return() return()
endif() endif()
...@@ -154,7 +158,7 @@ function(locate_matlab_components MATLAB_ROOT_DIR) ...@@ -154,7 +158,7 @@ function(locate_matlab_components MATLAB_ROOT_DIR)
find_path(MATLAB_INCLUDE_DIRS_ mex.h ${MATLAB_ROOT_DIR}/extern/include) find_path(MATLAB_INCLUDE_DIRS_ mex.h ${MATLAB_ROOT_DIR}/extern/include)
# get the mex shell script # get the mex shell script
find_program(MATLAB_MEX_SCRIPT_ NAMES mex PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH) find_program(MATLAB_MEX_SCRIPT_ NAMES mex mex.bat PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH)
# get the Matlab executable # get the Matlab executable
find_program(MATLAB_BIN_ NAMES matlab PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH) find_program(MATLAB_BIN_ NAMES matlab PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH)
......
...@@ -97,7 +97,8 @@ ocv_add_module(matlab BINDINGS ...@@ -97,7 +97,8 @@ ocv_add_module(matlab BINDINGS
execute_process(COMMAND git log -1 --pretty=%H OUTPUT_VARIABLE GIT_COMMIT ERROR_QUIET) execute_process(COMMAND git log -1 --pretty=%H OUTPUT_VARIABLE GIT_COMMIT ERROR_QUIET)
string(REGEX REPLACE "(\r?\n)+$" "" GIT_COMMIT "${GIT_COMMIT}") string(REGEX REPLACE "(\r?\n)+$" "" GIT_COMMIT "${GIT_COMMIT}")
# set the path to the C++ header and doc parser # set the path to the C++ header and doc parser, and template engine
set(JINJA2_PATH ${CMAKE_SOURCE_DIR}/3rdparty)
set(HDR_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/python/src2) set(HDR_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/python/src2)
set(RST_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/java/generator) set(RST_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/java/generator)
...@@ -149,6 +150,7 @@ if (NOT MEX_WORKS) ...@@ -149,6 +150,7 @@ if (NOT MEX_WORKS)
execute_process( execute_process(
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/gen_matlab.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/gen_matlab.py
--jinja2 ${JINJA2_PATH}
--hdrparser ${HDR_PARSER_PATH} --hdrparser ${HDR_PARSER_PATH}
--rstparser ${RST_PARSER_PATH} --rstparser ${RST_PARSER_PATH}
--extra "test=${CMAKE_CURRENT_SOURCE_DIR}/test/test_generator.hpp" --extra "test=${CMAKE_CURRENT_SOURCE_DIR}/test/test_generator.hpp"
...@@ -208,6 +210,7 @@ add_custom_command( ...@@ -208,6 +210,7 @@ add_custom_command(
OUTPUT ${GENERATE_PROXY} OUTPUT ${GENERATE_PROXY}
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/gen_matlab.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/gen_matlab.py
--jinja2 ${JINJA2_PATH}
--hdrparser ${HDR_PARSER_PATH} --hdrparser ${HDR_PARSER_PATH}
--rstparser ${RST_PARSER_PATH} --rstparser ${RST_PARSER_PATH}
--moduleroot ${CMAKE_SOURCE_DIR}/modules --moduleroot ${CMAKE_SOURCE_DIR}/modules
...@@ -216,6 +219,7 @@ add_custom_command( ...@@ -216,6 +219,7 @@ add_custom_command(
--outdir ${CMAKE_CURRENT_BINARY_DIR} --outdir ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/build_info.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/build_info.py
--jinja2 ${JINJA2_PATH}
--os ${CMAKE_SYSTEM} --os ${CMAKE_SYSTEM}
--arch ${ARCH} ${CMAKE_SYSTEM_PROCESSOR} --arch ${ARCH} ${CMAKE_SYSTEM_PROCESSOR}
--compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} --compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}
...@@ -229,6 +233,7 @@ add_custom_command( ...@@ -229,6 +233,7 @@ add_custom_command(
--outdir ${CMAKE_CURRENT_BINARY_DIR} --outdir ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/cvmex.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/cvmex.py
--jinja2 ${JINJA2_PATH}
--opts="${MEX_OPTS}" --opts="${MEX_OPTS}"
--include_dirs="${MEX_INCLUDE_DIRS}" --include_dirs="${MEX_INCLUDE_DIRS}"
--lib_dir=${MEX_LIB_DIR} --lib_dir=${MEX_LIB_DIR}
...@@ -291,6 +296,7 @@ install(CODE ...@@ -291,6 +296,7 @@ install(CODE
"execute_process( "execute_process(
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/cvmex.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/cvmex.py
--jinja2 ${JINJA2_PATH}
--opts=${MEX_OPTS} --opts=${MEX_OPTS}
--include_dirs=-I${CMAKE_INSTALL_PREFIX}/${OPENCV_INCLUDE_INSTALL_PATH} --include_dirs=-I${CMAKE_INSTALL_PREFIX}/${OPENCV_INCLUDE_INSTALL_PATH}
--lib_dir=-L${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH} --lib_dir=-L${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}
......
...@@ -49,6 +49,7 @@ if __name__ == "__main__": ...@@ -49,6 +49,7 @@ if __name__ == "__main__":
import sys, re, os, time import sys, re, os, time
from argparse import ArgumentParser from argparse import ArgumentParser
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument('--jinja2')
parser.add_argument('--os') parser.add_argument('--os')
parser.add_argument('--arch', nargs=2) parser.add_argument('--arch', nargs=2)
parser.add_argument('--compiler', nargs='+') parser.add_argument('--compiler', nargs='+')
...@@ -63,6 +64,9 @@ if __name__ == "__main__": ...@@ -63,6 +64,9 @@ if __name__ == "__main__":
parser.add_argument('--outdir') parser.add_argument('--outdir')
build = parser.parse_args() build = parser.parse_args()
# add jinja to the path
sys.path.append(build.jinja2)
from filters import * from filters import *
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
......
...@@ -43,6 +43,7 @@ if __name__ == "__main__": ...@@ -43,6 +43,7 @@ if __name__ == "__main__":
import sys, re, os, time import sys, re, os, time
from argparse import ArgumentParser from argparse import ArgumentParser
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument('--jinja2')
parser.add_argument('--opts') parser.add_argument('--opts')
parser.add_argument('--include_dirs') parser.add_argument('--include_dirs')
parser.add_argument('--lib_dir') parser.add_argument('--lib_dir')
...@@ -51,6 +52,9 @@ if __name__ == "__main__": ...@@ -51,6 +52,9 @@ if __name__ == "__main__":
parser.add_argument('--outdir') parser.add_argument('--outdir')
cv = parser.parse_args() cv = parser.parse_args()
# add jinja to the path
sys.path.append(cv.jinja2)
from filters import * from filters import *
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
......
...@@ -168,6 +168,7 @@ if __name__ == "__main__": ...@@ -168,6 +168,7 @@ if __name__ == "__main__":
import sys, re, os, time import sys, re, os, time
from argparse import ArgumentParser from argparse import ArgumentParser
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument('--jinja2')
parser.add_argument('--hdrparser') parser.add_argument('--hdrparser')
parser.add_argument('--rstparser') parser.add_argument('--rstparser')
parser.add_argument('--moduleroot', default='', required=False) parser.add_argument('--moduleroot', default='', required=False)
...@@ -177,6 +178,7 @@ if __name__ == "__main__": ...@@ -177,6 +178,7 @@ if __name__ == "__main__":
args = parser.parse_args() args = parser.parse_args()
# add the hdr_parser and rst_parser modules to the path # add the hdr_parser and rst_parser modules to the path
sys.path.append(args.jinja2)
sys.path.append(args.hdrparser) sys.path.append(args.hdrparser)
sys.path.append(args.rstparser) sys.path.append(args.rstparser)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment