fix PY-1509 Debug variable inspection pane/tree does not support MultiValueDict
authorElizaveta Shashkova <Elizaveta.Shashkova@jetbrains.com>
Fri, 19 Dec 2014 12:26:32 +0000 (15:26 +0300)
committerElizaveta Shashkova <Elizaveta.Shashkova@jetbrains.com>
Fri, 19 Dec 2014 12:26:32 +0000 (15:26 +0300)
python/helpers/pydev/pydevd_resolver.py
python/helpers/pydev/pydevd_xml.py

index a1c7a1dfe40eac4ad315c7f161c47b646068dd37..603f5c4d9ed6317c8b1975f690888d71f9daf9fd 100644 (file)
@@ -13,7 +13,7 @@ except:
     setattr(__builtin__, 'False', 0)
 
 import pydevd_constants
-from pydevd_constants import DictIterItems, xrange
+from pydevd_constants import DictIterItems, DictKeys, xrange
 
 
 # Note: 300 is already a lot to see in the outline (after that the user should really use the shell to get things)
@@ -444,6 +444,43 @@ class NdArrayResolver:
 class NdArrayItemsContainer: pass
 
 
+
+#=======================================================================================================================
+# MultiValueDictResolver
+#=======================================================================================================================
+class MultiValueDictResolver(DictResolver):
+
+    def resolve(self, dict, key):
+        if key in ('__len__', TOO_LARGE_ATTR):
+            return None
+
+        #ok, we have to iterate over the items to find the one that matches the id, because that's the only way
+        #to actually find the reference from the string we have before.
+        expected_id = int(key.split('(')[-1][:-1])
+        for key in DictKeys(dict):
+            val = dict.getlist(key)
+            if id(key) == expected_id:
+                return val
+
+        raise UnableToResolveVariableException()
+
+    def getDictionary(self, dict):
+        ret = {}
+        i = 0
+        for key in DictKeys(dict):
+            val = dict.getlist(key)
+            i += 1
+            #we need to add the id because otherwise we cannot find the real object to get its contents later on.
+            key = '%s (%s)' % (self.keyStr(key), id(key))
+            ret[key] = val
+            if i > MAX_ITEMS_TO_HANDLE:
+                ret[TOO_LARGE_ATTR] = TOO_LARGE_MSG
+                break
+
+        ret['__len__'] = len(dict)
+        return ret
+
+
 #=======================================================================================================================
 # FrameResolver
 #=======================================================================================================================
@@ -501,4 +538,5 @@ instanceResolver = InstanceResolver()
 jyArrayResolver = JyArrayResolver()
 setResolver = SetResolver()
 ndarrayResolver = NdArrayResolver()
+multiValueDictResolver = MultiValueDictResolver()
 frameResolver = FrameResolver()
index 52bb186bc58ecd384147ce8265ef82d2508fb6c3..a8b90f429a0400e87451964199dded4a9c4ca515 100644 (file)
@@ -29,6 +29,7 @@ class ExceptionOnEvaluate:
 #------------------------------------------------------------------------------------------------------ resolvers in map
 
 if not sys.platform.startswith("java"):
+
     typeMap = [
             #None means that it should not be treated as a compound variable
 
@@ -69,6 +70,13 @@ if not sys.platform.startswith("java"):
     except:
         pass  #numpy may not be installed
 
+    try:
+        from django.utils.datastructures import MultiValueDict
+        typeMap.insert(0, (MultiValueDict, pydevd_resolver.multiValueDictResolver))
+        #we should put it before dict
+    except:
+        pass  #django may not be installed
+
     if frame_type is not None:
         typeMap.append((frame_type, pydevd_resolver.frameResolver))