From 91748123b1cb40fbb1e95359349c16b0f0b4d95b Mon Sep 17 00:00:00 2001
From: Leifur Halldor Asgeirsson <lasgeirsson@zerofail.com>
Date: Wed, 31 Aug 2016 17:07:11 -0400
Subject: [PATCH] nested deserialiazation

---
 goblin/session.py     | 19 ++++++++++++++-----
 tests/test_session.py | 19 +++++++++++++++++++
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/goblin/session.py b/goblin/session.py
index 772a4b9..744aa80 100644
--- a/goblin/session.py
+++ b/goblin/session.py
@@ -137,8 +137,12 @@ class Session(connection.AbstractConnection):
 
     async def _receive(self, async_iter, response_queue):
         async for result in async_iter:
-            if (isinstance(result, dict) and
-                    result.get('type', '') in ['vertex', 'edge']):
+            response_queue.put_nowait(self._deserialize_result(result))
+        response_queue.put_nowait(None)
+
+    def _deserialize_result(self, result):
+        if isinstance(result, dict):
+            if result.get('type', '') in ['vertex', 'edge']:
                 hashable_id = self._get_hashable_id(result['id'])
                 current = self.current.get(hashable_id, None)
                 if not current:
@@ -151,10 +155,15 @@ class Session(connection.AbstractConnection):
                         current.source = GenericVertex()
                         current.target = GenericVertex()
                 element = current.__mapping__.mapper_func(result, current)
-                response_queue.put_nowait(element)
+                return element
             else:
-                response_queue.put_nowait(result)
-        response_queue.put_nowait(None)
+                for key in result:
+                    result[key] = self._deserialize_result(result[key])
+                return result
+        elif isinstance(result, list):
+            return [self._deserialize_result(item) for item in result]
+        else:
+            return result
 
     # Creation API
     def add(self, *elements):
diff --git a/tests/test_session.py b/tests/test_session.py
index 544ea46..c29ff0c 100644
--- a/tests/test_session.py
+++ b/tests/test_session.py
@@ -22,6 +22,8 @@ import pytest
 from goblin import element
 from goblin.traversal import bindprop
 
+from gremlin_python.process.graph_traversal import __
+
 
 @pytest.mark.asyncio
 async def test_session_close(session):
@@ -326,3 +328,20 @@ class TestTraversalApi:
                 'name', 'leif').one_or_none()
             one = await session.g.V(p1.id).count().one_or_none()
             assert one == 1
+
+    @pytest.mark.asyncio
+    async def test_deserialize_nested_map(self, session, person_class):
+        async with session:
+            await session.g.addV('person').property(
+                person_class.name, 'leif').property('place_of_birth', 'detroit').one_or_none()
+
+            await session.g.addV('person').property(person_class.name, 'David').property(
+                person_class.nicknames, 'davebshow').property(
+                person_class.nicknames, 'Dave').one_or_none()
+
+            resp = await (session.g.V().hasLabel('person')._as('x').valueMap()._as('y')
+                          .select('x', 'y').fold().one_or_none())
+
+            for item in resp:
+                assert isinstance(item['x'], person_class)
+                assert isinstance(item['y'], dict)
-- 
GitLab