150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- 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
 | |
| }
 | 
