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