OLD | NEW |
(Empty) | |
| 1 # -*- coding: utf-8 -*- |
| 2 """ |
| 3 jinja2.tests |
| 4 ~~~~~~~~~~~~ |
| 5 |
| 6 Jinja test functions. Used with the "is" operator. |
| 7 |
| 8 :copyright: (c) 2010 by the Jinja Team. |
| 9 :license: BSD, see LICENSE for more details. |
| 10 """ |
| 11 import re |
| 12 from jinja2.runtime import Undefined |
| 13 |
| 14 try: |
| 15 from collections import Mapping as MappingType |
| 16 except ImportError: |
| 17 import UserDict |
| 18 MappingType = (UserDict.UserDict, UserDict.DictMixin, dict) |
| 19 |
| 20 # nose, nothing here to test |
| 21 __test__ = False |
| 22 |
| 23 |
| 24 number_re = re.compile(r'^-?\d+(\.\d+)?$') |
| 25 regex_type = type(number_re) |
| 26 |
| 27 |
| 28 try: |
| 29 test_callable = callable |
| 30 except NameError: |
| 31 def test_callable(x): |
| 32 return hasattr(x, '__call__') |
| 33 |
| 34 |
| 35 def test_odd(value): |
| 36 """Return true if the variable is odd.""" |
| 37 return value % 2 == 1 |
| 38 |
| 39 |
| 40 def test_even(value): |
| 41 """Return true if the variable is even.""" |
| 42 return value % 2 == 0 |
| 43 |
| 44 |
| 45 def test_divisibleby(value, num): |
| 46 """Check if a variable is divisible by a number.""" |
| 47 return value % num == 0 |
| 48 |
| 49 |
| 50 def test_defined(value): |
| 51 """Return true if the variable is defined: |
| 52 |
| 53 .. sourcecode:: jinja |
| 54 |
| 55 {% if variable is defined %} |
| 56 value of variable: {{ variable }} |
| 57 {% else %} |
| 58 variable is not defined |
| 59 {% endif %} |
| 60 |
| 61 See the :func:`default` filter for a simple way to set undefined |
| 62 variables. |
| 63 """ |
| 64 return not isinstance(value, Undefined) |
| 65 |
| 66 |
| 67 def test_undefined(value): |
| 68 """Like :func:`defined` but the other way round.""" |
| 69 return isinstance(value, Undefined) |
| 70 |
| 71 |
| 72 def test_none(value): |
| 73 """Return true if the variable is none.""" |
| 74 return value is None |
| 75 |
| 76 |
| 77 def test_lower(value): |
| 78 """Return true if the variable is lowercased.""" |
| 79 return unicode(value).islower() |
| 80 |
| 81 |
| 82 def test_upper(value): |
| 83 """Return true if the variable is uppercased.""" |
| 84 return unicode(value).isupper() |
| 85 |
| 86 |
| 87 def test_string(value): |
| 88 """Return true if the object is a string.""" |
| 89 return isinstance(value, basestring) |
| 90 |
| 91 |
| 92 def test_mapping(value): |
| 93 """Return true if the object is a mapping (dict etc.). |
| 94 |
| 95 .. versionadded:: 2.6 |
| 96 """ |
| 97 return isinstance(value, MappingType) |
| 98 |
| 99 |
| 100 def test_number(value): |
| 101 """Return true if the variable is a number.""" |
| 102 return isinstance(value, (int, long, float, complex)) |
| 103 |
| 104 |
| 105 def test_sequence(value): |
| 106 """Return true if the variable is a sequence. Sequences are variables |
| 107 that are iterable. |
| 108 """ |
| 109 try: |
| 110 len(value) |
| 111 value.__getitem__ |
| 112 except: |
| 113 return False |
| 114 return True |
| 115 |
| 116 |
| 117 def test_sameas(value, other): |
| 118 """Check if an object points to the same memory address than another |
| 119 object: |
| 120 |
| 121 .. sourcecode:: jinja |
| 122 |
| 123 {% if foo.attribute is sameas false %} |
| 124 the foo attribute really is the `False` singleton |
| 125 {% endif %} |
| 126 """ |
| 127 return value is other |
| 128 |
| 129 |
| 130 def test_iterable(value): |
| 131 """Check if it's possible to iterate over an object.""" |
| 132 try: |
| 133 iter(value) |
| 134 except TypeError: |
| 135 return False |
| 136 return True |
| 137 |
| 138 |
| 139 def test_escaped(value): |
| 140 """Check if the value is escaped.""" |
| 141 return hasattr(value, '__html__') |
| 142 |
| 143 |
| 144 TESTS = { |
| 145 'odd': test_odd, |
| 146 'even': test_even, |
| 147 'divisibleby': test_divisibleby, |
| 148 'defined': test_defined, |
| 149 'undefined': test_undefined, |
| 150 'none': test_none, |
| 151 'lower': test_lower, |
| 152 'upper': test_upper, |
| 153 'string': test_string, |
| 154 'mapping': test_mapping, |
| 155 'number': test_number, |
| 156 'sequence': test_sequence, |
| 157 'iterable': test_iterable, |
| 158 'callable': test_callable, |
| 159 'sameas': test_sameas, |
| 160 'escaped': test_escaped |
| 161 } |
OLD | NEW |