allow user to pass graphson reader/writer
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/e3067e93 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/e3067e93 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/e3067e93 Branch: refs/heads/TINKERPOP-1599 Commit: e3067e9399e6e4c63a15f796631386448be9424f Parents: 07d2064 Author: davebshow <davebs...@gmail.com> Authored: Wed Feb 15 16:27:46 2017 -0500 Committer: davebshow <davebs...@gmail.com> Committed: Fri Feb 17 11:36:57 2017 -0500 ---------------------------------------------------------------------- .../main/jython/gremlin_python/driver/client.py | 6 +- .../driver/driver_remote_connection.py | 20 +++-- .../jython/gremlin_python/driver/protocol.py | 9 +- .../jython/gremlin_python/driver/serializer.py | 86 ++++++++++---------- .../src/main/jython/tests/conftest.py | 2 + 5 files changed, 70 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e3067e93/gremlin-python/src/main/jython/gremlin_python/driver/client.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/client.py b/gremlin-python/src/main/jython/gremlin_python/driver/client.py index fcbdf07..0314a44 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/client.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/client.py @@ -23,7 +23,7 @@ from concurrent.futures import ThreadPoolExecutor from six.moves import queue -from gremlin_python.driver import connection, protocol, request +from gremlin_python.driver import connection, protocol, request, serializer from gremlin_python.process import traversal # This is until concurrent.futures backport 3.1.0 release @@ -44,6 +44,8 @@ class Client: message_serializer=None, username="", password=""): self._url = url self._traversal_source = traversal_source + if message_serializer is None: + message_serializer = serializer.GraphSONMessageSerializer() self._message_serializer = message_serializer self._username = username self._password = password @@ -59,7 +61,7 @@ class Client: self._transport_factory = transport_factory if protocol_factory is None: protocol_factory = lambda: protocol.GremlinServerWSProtocol( - message_serializer=self._message_serializer, + self._message_serializer, username=self._username, password=self._password) self._protocol_factory = protocol_factory http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e3067e93/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py index fb0e4ba..1f08e2b 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py @@ -18,7 +18,7 @@ under the License. """ from concurrent.futures import Future -from gremlin_python.driver import client +from gremlin_python.driver import client, serializer from gremlin_python.driver.remote_connection import ( RemoteConnection, RemoteTraversal, RemoteTraversalSideEffects) @@ -29,10 +29,20 @@ class DriverRemoteConnection(RemoteConnection): def __init__(self, url, traversal_source, protocol_factory=None, transport_factory=None, pool_size=None, max_workers=None, - username="", password=""): - self._client = client.Client(url, traversal_source, protocol_factory, - transport_factory, pool_size, max_workers, - None, username, password) + username="", password="", message_serializer=None, + graphson_reader=None, graphson_writer=None): + if message_serializer is None: + message_serializer = serializer.GraphSONMessageSerializer( + reader=graphson_reader, + writer=graphson_writer) + self._client = client.Client(url, traversal_source, + protocol_factory=protocol_factory, + transport_factory=transport_factory, + pool_size=pool_size, + max_workers=max_workers, + message_serializer=message_serializer, + username=username, + password=password) self._url = self._client._url self._traversal_source = self._client._traversal_source http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e3067e93/gremlin-python/src/main/jython/gremlin_python/driver/protocol.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/protocol.py b/gremlin-python/src/main/jython/gremlin_python/driver/protocol.py index 279a8f5..33b4419 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/protocol.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/protocol.py @@ -19,10 +19,13 @@ under the License. import abc import base64 import collections -import json import uuid import six +try: + import ujson as json +except ImportError: + import json from gremlin_python.driver import serializer, request @@ -51,9 +54,7 @@ class AbstractBaseProtocol: class GremlinServerWSProtocol(AbstractBaseProtocol): - def __init__(self, message_serializer=None, username='', password=''): - if message_serializer is None: - message_serializer = serializer.GraphSONMessageSerializer() + def __init__(self, message_serializer, username='', password=''): self._message_serializer = message_serializer self._username = username self._password = password http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e3067e93/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py b/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py index 2db7374..a29d4dc 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py @@ -29,72 +29,74 @@ __author__ = 'David M. Brown (davebs...@gmail.com)' class Processor: """Base class for OpProcessor serialization system.""" - _graphson_writer = graphson.GraphSONWriter() - - def __init__(self, default_args): - self._default_args = default_args + def __init__(self, writer): + self._graphson_writer = writer def get_op_args(self, op, args): op_method = getattr(self, op, None) if not op_method: raise Exception("Processor does not support op: {}".format(op)) - args_ = self._default_args.get(op, dict()).copy() - args_.update(args) - return op_method(args_) - + return op_method(args) -class GraphSONMessageSerializer: - """Message serializer for GraphSON""" - _graphson_reader = graphson.GraphSONReader() +class Standard(Processor): + def authentication(self, args): + return args - class standard(Processor): + def eval(self, args): + return args - def authentication(self, args): - return args - def eval(self, args): - return args +class Traversal(Processor): + def authentication(self, args): + return args - class traversal(Processor): + def bytecode(self, args): + gremlin = args['gremlin'] + args['gremlin'] = self._graphson_writer.toDict(gremlin) + aliases = args.get('aliases', '') + if not aliases: + aliases = {'g': 'g'} + args['aliases'] = aliases + return args - def authentication(self, args): - return args + def close(self, args): + return self.keys(args) - def bytecode(self, args): - gremlin = args['gremlin'] - args['gremlin'] = self._graphson_writer.toDict(gremlin) - aliases = args.get('aliases', '') - if not aliases: - aliases = {'g': 'g'} - args['aliases'] = aliases - return args + def gather(self, args): + side_effect = args['sideEffect'] + args['sideEffect'] = {'@type': 'g:UUID', '@value': side_effect} + aliases = args.get('aliases', '') + if not aliases: + aliases = {'g': 'g'} + args['aliases'] = aliases + return args - def close(self, args): - return self.keys(args) + def keys(self, args): + side_effect = args['sideEffect'] + args['sideEffect'] = {'@type': 'g:UUID', '@value': side_effect} + return args - def gather(self, args): - side_effect = args['sideEffect'] - args['sideEffect'] = {'@type': 'g:UUID', '@value': side_effect} - aliases = args.get('aliases', '') - if not aliases: - aliases = {'g': 'g'} - args['aliases'] = aliases - return args - def keys(self, args): - side_effect = args['sideEffect'] - args['sideEffect'] = {'@type': 'g:UUID', '@value': side_effect} - return args +class GraphSONMessageSerializer: + """Message serializer for GraphSON""" + def __init__(self, reader=None, writer=None): + if not reader: + reader = graphson.GraphSONReader() + self._graphson_reader = reader + if not writer: + writer = graphson.GraphSONWriter() + self.standard = Standard(writer) + self.traversal = Traversal(writer) def get_processor(self, processor): processor = getattr(self, processor, None) if not processor: raise Exception("Unknown processor") - return processor({}) + return processor def serialize_message(self, request_id, request_message): processor = request_message.processor http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e3067e93/gremlin-python/src/main/jython/tests/conftest.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/conftest.py b/gremlin-python/src/main/jython/tests/conftest.py index 3425266..2cd4282 100644 --- a/gremlin-python/src/main/jython/tests/conftest.py +++ b/gremlin-python/src/main/jython/tests/conftest.py @@ -26,12 +26,14 @@ from gremlin_python.driver.connection import Connection from gremlin_python.driver.driver_remote_connection import ( DriverRemoteConnection) from gremlin_python.driver.protocol import GremlinServerWSProtocol +from gremlin_python.driver.serializer import GraphSONMessageSerializer from gremlin_python.driver.tornado.transport import TornadoTransport @pytest.fixture def connection(request): protocol = GremlinServerWSProtocol( + GraphSONMessageSerializer(), username='stephen', password='password') executor = concurrent.futures.ThreadPoolExecutor(5) pool = queue.Queue()