Added test for mappings. This fixes #35
authorArmin Ronacher <armin.ronacher@active-4.com>
Tue, 24 May 2011 14:40:23 +0000 (16:40 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Tue, 24 May 2011 14:40:23 +0000 (16:40 +0200)
CHANGES
jinja2/tests.py
jinja2/testsuite/tests.py

diff --git a/CHANGES b/CHANGES
index 2cdedf426e61997fdce33bef1c5ae00e257a4ef1..9fdfba2a963b54007b8f13c5962833a772586f5a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -32,6 +32,8 @@ Version 2.6
 - like sum and sort, join now also is able to join attributes of objects
   as string.
 - the internal eval context now has a reference to the environment.
+- added a mapping test to see if an object is a dict or an object with
+  a similar interface.
 
 Version 2.5.5
 -------------
index d257eca0a1e8a8e9ed5a65ac1c566d409727a06b..50510b0d353791c5dd3c3fd213cfc1545a9576cc 100644 (file)
 import re
 from jinja2.runtime import Undefined
 
+try:
+    from collections import Mapping as MappingType
+except ImportError:
+    import UserDict
+    MappingType = (UserDict.UserDict, UserDict.DictMixin, dict)
+
 # nose, nothing here to test
 __test__ = False
 
@@ -83,6 +89,14 @@ def test_string(value):
     return isinstance(value, basestring)
 
 
+def test_mapping(value):
+    """Return true if the object is a mapping (dict etc.).
+
+    .. versionadded:: 2.6
+    """
+    return isinstance(value, MappingType)
+
+
 def test_number(value):
     """Return true if the variable is a number."""
     return isinstance(value, (int, long, float, complex))
@@ -137,6 +151,7 @@ TESTS = {
     'lower':            test_lower,
     'upper':            test_upper,
     'string':           test_string,
+    'mapping':          test_mapping,
     'number':           test_number,
     'sequence':         test_sequence,
     'iterable':         test_iterable,
index cd5006fd37f1ec2f06017ade14bb8f1340ac0c59..3ece7a8ff71ddf03e7006a5bb450895521b19e94 100644 (file)
@@ -48,10 +48,16 @@ class TestsTestCase(JinjaTestCase):
             {{ range is callable }}
             {{ 42 is callable }}
             {{ range(5) is iterable }}
+            {{ {} is mapping }}
+            {{ mydict is mapping }}
+            {{ [] is mapping }}
         ''')
-        assert tmpl.render().split() == [
+        class MyDict(dict):
+            pass
+        assert tmpl.render(mydict=MyDict()).split() == [
             'False', 'True', 'False', 'True', 'True', 'False',
-            'True', 'True', 'True', 'True', 'False', 'True'
+            'True', 'True', 'True', 'True', 'False', 'True',
+            'True', 'True', 'False'
         ]
 
     def test_sequence(self):