blob: 9fbf1639438c101b0a5972d34a54b80eeb78bf9c [file] [log] [blame]
Armin Ronacher58875382007-02-27 19:40:14 +01001# -*- coding: utf-8 -*-
2"""
Armin Ronacher26c0f512008-04-17 11:16:01 +02003 jinja2.tests
4 ~~~~~~~~~~~~
Armin Ronacher58875382007-02-27 19:40:14 +01005
6 Jinja test functions. Used with the "is" operator.
7
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01008 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacher58875382007-02-27 19:40:14 +01009 :license: BSD, see LICENSE for more details.
10"""
11import re
Armin Ronacher577ad382008-04-16 15:36:49 +020012from jinja2.runtime import Undefined
Armin Ronacher58875382007-02-27 19:40:14 +010013
14
Armin Ronacherab45b842007-03-18 20:47:50 +010015number_re = re.compile(r'^-?\d+(\.\d+)?$')
Armin Ronacher58875382007-02-27 19:40:14 +010016regex_type = type(number_re)
17
18
Armin Ronacher42a19882009-08-05 18:45:39 +020019try:
20 test_callable = callable
21except NameError:
22 def test_callable(x):
23 return hasattr(x, '__call__')
24
25
Armin Ronacher577ad382008-04-16 15:36:49 +020026def test_odd(value):
27 """Return true if the variable is odd."""
28 return value % 2 == 1
Armin Ronacher58875382007-02-27 19:40:14 +010029
30
Armin Ronacher577ad382008-04-16 15:36:49 +020031def test_even(value):
Lukas Meuserad48a2e2008-05-01 18:19:57 +020032 """Return true if the variable is even."""
Armin Ronacher577ad382008-04-16 15:36:49 +020033 return value % 2 == 0
Armin Ronacher58875382007-02-27 19:40:14 +010034
35
Armin Ronacherf59bac22008-04-20 13:11:43 +020036def test_divisibleby(value, num):
37 """Check if a variable is divisible by a number."""
38 return value % num == 0
39
40
Armin Ronacher577ad382008-04-16 15:36:49 +020041def test_defined(value):
42 """Return true if the variable is defined:
Armin Ronacher58875382007-02-27 19:40:14 +010043
Armin Ronacher37a88512007-03-02 20:42:18 +010044 .. sourcecode:: jinja
45
46 {% if variable is defined %}
47 value of variable: {{ variable }}
48 {% else %}
49 variable is not defined
50 {% endif %}
51
Armin Ronacher9f258ff2008-05-24 22:28:52 +020052 See the :func:`default` filter for a simple way to set undefined
Armin Ronacher26c0f512008-04-17 11:16:01 +020053 variables.
Armin Ronacher58875382007-02-27 19:40:14 +010054 """
Armin Ronacher577ad382008-04-16 15:36:49 +020055 return not isinstance(value, Undefined)
Armin Ronacher58875382007-02-27 19:40:14 +010056
57
Armin Ronacher53042292008-04-26 18:30:19 +020058def test_undefined(value):
Armin Ronacher9f258ff2008-05-24 22:28:52 +020059 """Like :func:`defined` but the other way round."""
Armin Ronacher53042292008-04-26 18:30:19 +020060 return isinstance(value, Undefined)
61
62
63def test_none(value):
64 """Return true if the variable is none."""
65 return value is None
66
67
Armin Ronacher577ad382008-04-16 15:36:49 +020068def test_lower(value):
Armin Ronacher53042292008-04-26 18:30:19 +020069 """Return true if the variable is lowercased."""
Armin Ronacher577ad382008-04-16 15:36:49 +020070 return unicode(value).islower()
Armin Ronacher58875382007-02-27 19:40:14 +010071
72
Armin Ronacher577ad382008-04-16 15:36:49 +020073def test_upper(value):
Armin Ronacher53042292008-04-26 18:30:19 +020074 """Return true if the variable is uppercased."""
Armin Ronacher577ad382008-04-16 15:36:49 +020075 return unicode(value).isupper()
Armin Ronacher58875382007-02-27 19:40:14 +010076
77
Armin Ronacher53042292008-04-26 18:30:19 +020078def test_string(value):
79 """Return true if the object is a string."""
80 return isinstance(value, basestring)
81
82
83def test_number(value):
84 """Return true if the variable is a number."""
85 return isinstance(value, (int, long, float, complex))
Armin Ronacher58875382007-02-27 19:40:14 +010086
87
Armin Ronacher577ad382008-04-16 15:36:49 +020088def test_sequence(value):
89 """Return true if the variable is a sequence. Sequences are variables
Armin Ronacher37a88512007-03-02 20:42:18 +010090 that are iterable.
Armin Ronacher58875382007-02-27 19:40:14 +010091 """
Armin Ronacher577ad382008-04-16 15:36:49 +020092 try:
93 len(value)
94 value.__getitem__
95 except:
96 return False
97 return True
Armin Ronacher58875382007-02-27 19:40:14 +010098
99
Armin Ronacher577ad382008-04-16 15:36:49 +0200100def test_sameas(value, other):
101 """Check if an object points to the same memory address than another
Armin Ronacher69ddc582007-06-24 12:37:13 +0200102 object:
103
104 .. sourcecode:: jinja
105
Armin Ronacherf59bac22008-04-20 13:11:43 +0200106 {% if foo.attribute is sameas false %}
Armin Ronacher69ddc582007-06-24 12:37:13 +0200107 the foo attribute really is the `False` singleton
108 {% endif %}
Armin Ronacher69ddc582007-06-24 12:37:13 +0200109 """
Armin Ronacher577ad382008-04-16 15:36:49 +0200110 return value is other
Armin Ronacher69ddc582007-06-24 12:37:13 +0200111
112
Armin Ronacher53042292008-04-26 18:30:19 +0200113def test_iterable(value):
114 """Check if it's possible to iterate over an object."""
115 try:
116 iter(value)
117 except TypeError:
118 return False
119 return True
120
121
Armin Ronacher3c8b7ad2008-04-28 13:52:21 +0200122def test_escaped(value):
123 """Check if the value is escaped."""
124 return hasattr(value, '__html__')
125
126
Armin Ronacher58875382007-02-27 19:40:14 +0100127TESTS = {
128 'odd': test_odd,
129 'even': test_even,
Armin Ronacherf59bac22008-04-20 13:11:43 +0200130 'divisibleby': test_divisibleby,
Armin Ronacher58875382007-02-27 19:40:14 +0100131 'defined': test_defined,
Armin Ronacher53042292008-04-26 18:30:19 +0200132 'undefined': test_undefined,
133 'none': test_none,
Armin Ronacher58875382007-02-27 19:40:14 +0100134 'lower': test_lower,
135 'upper': test_upper,
Armin Ronacher53042292008-04-26 18:30:19 +0200136 'string': test_string,
137 'number': test_number,
Armin Ronacher58875382007-02-27 19:40:14 +0100138 'sequence': test_sequence,
Armin Ronacher53042292008-04-26 18:30:19 +0200139 'iterable': test_iterable,
Armin Ronacher42a19882009-08-05 18:45:39 +0200140 'callable': test_callable,
Armin Ronacher3c8b7ad2008-04-28 13:52:21 +0200141 'sameas': test_sameas,
142 'escaped': test_escaped
Armin Ronacher58875382007-02-27 19:40:14 +0100143}