1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez# -*- coding: utf-8 -*-
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez"""
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    jinja2.tests
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    ~~~~~~~~~~~~
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    Jinja test functions. Used with the "is" operator.
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    :copyright: (c) 2010 by the Jinja Team.
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    :license: BSD, see LICENSE for more details.
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez"""
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport re
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezfrom jinja2.runtime import Undefined
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezfrom jinja2._compat import text_type, string_types, mapping_types
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznumber_re = re.compile(r'^-?\d+(\.\d+)?$')
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezregex_type = type(number_re)
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztest_callable = callable
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_odd(value):
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is odd."""
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value % 2 == 1
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_even(value):
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is even."""
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value % 2 == 0
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_divisibleby(value, num):
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Check if a variable is divisible by a number."""
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value % num == 0
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_defined(value):
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is defined:
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    .. sourcecode:: jinja
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {% if variable is defined %}
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            value of variable: {{ variable }}
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {% else %}
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            variable is not defined
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {% endif %}
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    See the :func:`default` filter for a simple way to set undefined
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    variables.
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return not isinstance(value, Undefined)
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_undefined(value):
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Like :func:`defined` but the other way round."""
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return isinstance(value, Undefined)
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_none(value):
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is none."""
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value is None
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_lower(value):
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is lowercased."""
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return text_type(value).islower()
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_upper(value):
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is uppercased."""
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return text_type(value).isupper()
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_string(value):
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the object is a string."""
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return isinstance(value, string_types)
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_mapping(value):
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the object is a mapping (dict etc.).
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    .. versionadded:: 2.6
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return isinstance(value, mapping_types)
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_number(value):
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is a number."""
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return isinstance(value, (int, float, complex))
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_sequence(value):
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Return true if the variable is a sequence. Sequences are variables
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    that are iterable.
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    try:
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        len(value)
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        value.__getitem__
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    except:
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return False
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return True
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_sameas(value, other):
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Check if an object points to the same memory address than another
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    object:
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    .. sourcecode:: jinja
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {% if foo.attribute is sameas false %}
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            the foo attribute really is the `False` singleton
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {% endif %}
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value is other
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_iterable(value):
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Check if it's possible to iterate over an object."""
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    try:
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        iter(value)
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    except TypeError:
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return False
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return True
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdef test_escaped(value):
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Check if the value is escaped."""
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return hasattr(value, '__html__')
130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTESTS = {
133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'odd':              test_odd,
134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'even':             test_even,
135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'divisibleby':      test_divisibleby,
136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'defined':          test_defined,
137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'undefined':        test_undefined,
138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'none':             test_none,
139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'lower':            test_lower,
140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'upper':            test_upper,
141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'string':           test_string,
142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'mapping':          test_mapping,
143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'number':           test_number,
144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'sequence':         test_sequence,
145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'iterable':         test_iterable,
146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'callable':         test_callable,
147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'sameas':           test_sameas,
148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    'escaped':          test_escaped
149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
150