gremlinpython: refactor GraphsonIO to use instance type maps
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/d392379e Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/d392379e Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/d392379e Branch: refs/heads/master Commit: d392379e6fc2a7acfc6ed73a8f82ee04cbab2efd Parents: 6c4bf0b Author: Adam Holmberg <adam.holmb...@datastax.com> Authored: Tue Oct 4 13:56:21 2016 -0500 Committer: Adam Holmberg <adam.holmb...@datastax.com> Committed: Mon Oct 10 16:01:50 2016 -0500 ---------------------------------------------------------------------- .../driver/driver_remote_connection.py | 13 +- .../gremlin_python/structure/io/graphson.py | 372 ++++++++++--------- .../jython/tests/structure/io/test_graphson.py | 87 ++++- .../python/jsr223/JythonScriptEngineSetup.java | 4 +- .../jsr223/PythonGraphSONJavaTranslator.java | 2 +- .../io/graphson/GraphSONReaderTest.java | 68 ++-- .../io/graphson/GraphSONWriterTest.java | 56 +-- 7 files changed, 344 insertions(+), 258 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/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 e47c8e6..b8b3d87 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 @@ -23,8 +23,7 @@ from tornado import gen from tornado import ioloop from tornado import websocket -from gremlin_python.structure.io.graphson import GraphSONReader -from gremlin_python.structure.io.graphson import GraphSONWriter +from gremlin_python.structure.io.graphson import GraphSONIO from .remote_connection import RemoteConnection from .remote_connection import RemoteTraversal from .remote_connection import RemoteTraversalSideEffects @@ -42,6 +41,7 @@ class DriverRemoteConnection(RemoteConnection): self._password = password if loop is None: self._loop = ioloop.IOLoop.current() self._websocket = self._loop.run_sync(lambda: websocket.websocket_connect(self.url)) + self._graphson_io = GraphSONIO() def submit(self, bytecode): ''' @@ -65,7 +65,7 @@ class DriverRemoteConnection(RemoteConnection): "op": "bytecode", "processor": "traversal", "args": { - "gremlin": GraphSONWriter.writeObject(bytecode), + "gremlin": self._graphson_io.writeObject(bytecode), "aliases": {"g": self.traversal_source} } } @@ -142,7 +142,7 @@ class DriverRemoteConnection(RemoteConnection): if self._websocket.protocol is None: self._websocket = yield websocket.websocket_connect(self.url) self._websocket.write_message(send_message, binary=True) - response = Response(self._websocket, self._username, self._password) + response = Response(self._websocket, self._username, self._password, self._graphson_io) results = None while True: recv_message = yield response.receive() @@ -183,11 +183,12 @@ class DriverRemoteConnection(RemoteConnection): class Response: - def __init__(self, websocket, username, password): + def __init__(self, websocket, username, password, graphson_io): self._websocket = websocket self._username = username self._password = password self._closed = False + self._graphson_io = graphson_io @gen.coroutine def receive(self): @@ -224,7 +225,7 @@ class Response: elif status_code in [200, 206]: results = [] for item in recv_message["result"]["data"]: - results.append(GraphSONReader._objectify(item)) + results.append(self._graphson_io.toObject(item)) if status_code == 200: self._closed = True raise gen.Return((aggregateTo, results)) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py index b44897a..50db7cb 100644 --- a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py +++ b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py @@ -17,14 +17,12 @@ specific language governing permissions and limitations under the License. ''' import json -from abc import abstractmethod from aenum import Enum import six from gremlin_python import statics -from gremlin_python.statics import ( - FloatType, FunctionType, IntType, LongType, long, TypeType) +from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, TypeType from gremlin_python.process.traversal import Binding from gremlin_python.process.traversal import Bytecode from gremlin_python.process.traversal import P @@ -38,113 +36,194 @@ from gremlin_python.structure.graph import VertexProperty from gremlin_python.structure.graph import Path -__author__ = 'Marko A. Rodriguez (http://markorodriguez.com)' +_serializers = {} +_deserializers = {} -class GraphSONWriter(object): - @staticmethod - def _dictify(obj): - for key, serializer in serializers.items(): +class GraphSONTypeType(type): + def __new__(mcs, name, bases, dct): + cls = super(GraphSONTypeType, mcs).__new__(mcs, name, bases, dct) + if not name.startswith('_'): + if cls.python_type: + _serializers[cls.python_type] = cls + if cls.graphson_type: + _deserializers[cls.graphson_type] = cls + return cls + + +class GraphSONIO(object): + + _TYPE_KEY = "@type" + _VALUE_KEY = "@value" + + def __init__(self, serializer_map=None, deserializer_map=None): + """ + :param serializer_map: map from Python type to serializer instance implementing `dictify` + :param deserializer_map: map from GraphSON type tag to deserializer instance implementing `objectify` + """ + self.serializers = _serializers.copy() + if serializer_map: + self.serializers.update(serializer_map) + + self.deserializers = _deserializers.copy() + if deserializer_map: + self.deserializers.update(deserializer_map) + + def writeObject(self, objectData): + # to JSON + return json.dumps(self.toDict(objectData), separators=(',', ':')) + + def readObject(self, jsonData): + # from JSON + return self.toObject(json.loads(jsonData)) + + def toDict(self, obj): + """ + Encodes python objects in GraphSON type-tagged dict values + """ + for key, serializer in self.serializers.items(): if isinstance(obj, key): - return serializer._dictify(obj) + return serializer.dictify(obj, self) # list and map are treated as normal json objs (could be isolated serializers) if isinstance(obj, (list, set)): - return [GraphSONWriter._dictify(o) for o in obj] + return [self.toDict(o) for o in obj] elif isinstance(obj, dict): - return dict((GraphSONWriter._dictify(k), GraphSONWriter._dictify(v)) for k, v in obj.items()) + return dict((self.toDict(k), self.toDict(v)) for k, v in obj.items()) else: return obj - @staticmethod - def writeObject(objectData): - return json.dumps(GraphSONWriter._dictify(objectData), separators=(',', ':')) - - -class GraphSONReader(object): - @staticmethod - def _objectify(obj): + def toObject(self, obj): + """ + Unpacks GraphSON type-tagged dict values into objects mapped in self.deserializers + """ if isinstance(obj, dict): try: - return deserializers[obj[_SymbolHelper._TYPE]]._objectify(obj) + return self.deserializers[obj[self._TYPE_KEY]].objectify(obj[self._VALUE_KEY], self) except KeyError: pass # list and map are treated as normal json objs (could be isolated deserializers) - return dict((GraphSONReader._objectify(k), GraphSONReader._objectify(v)) for k, v in obj.items()) + return dict((self.toObject(k), self.toObject(v)) for k, v in obj.items()) elif isinstance(obj, list): - return [GraphSONReader._objectify(o) for o in obj] + return [self.toObject(o) for o in obj] else: return obj - @staticmethod - def readObject(jsonData): - return GraphSONReader._objectify(json.loads(jsonData)) + def typedValue(self, type_name, value, prefix="g"): + out = {self._TYPE_KEY: prefix + ":" + type_name} + if value is not None: + out[self._VALUE_KEY] = value + return out + +@six.add_metaclass(GraphSONTypeType) +class _GraphSONTypeIO(object): + python_type = None + graphson_type = None -''' -SERIALIZERS -''' + symbolMap = {"global_": "global", "as_": "as", "in_": "in", "and_": "and", + "or_": "or", "is_": "is", "not_": "not", "from_": "from", + "set_": "set", "list_": "list", "all_": "all"} + + @classmethod + def unmangleKeyword(cls, symbol): + return cls.symbolMap.get(symbol, symbol) + + def dictify(self, obj, graphson_io): + raise NotImplementedError() + def objectify(self, d, graphson_io): + raise NotImplementedError() -class GraphSONSerializer(object): - @abstractmethod - def _dictify(self, obj): - return obj +class _BytecodeSerializer(_GraphSONTypeIO): -class BytecodeSerializer(GraphSONSerializer): - def _dictify_instructions(self, instructions): + @classmethod + def _dictify_instructions(cls, instructions, graphson_io): out = [] for instruction in instructions: inst = [instruction[0]] - inst.extend(GraphSONWriter._dictify(arg) for arg in instruction[1:]) + inst.extend(graphson_io.toDict(arg) for arg in instruction[1:]) out.append(inst) return out - def _dictify(self, bytecode): + @classmethod + def dictify(cls, bytecode, graphson_io): if isinstance(bytecode, Traversal): bytecode = bytecode.bytecode out = {} if bytecode.source_instructions: - out["source"] = self._dictify_instructions(bytecode.source_instructions) + out["source"] = cls._dictify_instructions(bytecode.source_instructions, graphson_io) if bytecode.step_instructions: - out["step"] = self._dictify_instructions(bytecode.step_instructions) - return _SymbolHelper.objectify("Bytecode", out) + out["step"] = cls._dictify_instructions(bytecode.step_instructions, graphson_io) + return graphson_io.typedValue("Bytecode", out) + + +class TraversalSerializer(_BytecodeSerializer): + python_type = Traversal -class TraversalStrategySerializer(GraphSONSerializer): - def _dictify(self, strategy): - return _SymbolHelper.objectify(strategy.strategy_name, GraphSONWriter._dictify(strategy.configuration)) +class BytecodeSerializer(_BytecodeSerializer): + python_type = Bytecode -class TraverserSerializer(GraphSONSerializer): - def _dictify(self, traverser): - return _SymbolHelper.objectify("Traverser", {"value": GraphSONWriter._dictify(traverser.object), - "bulk": GraphSONWriter._dictify(traverser.bulk)}) +class TraversalStrategySerializer(_GraphSONTypeIO): + python_type = TraversalStrategy + @classmethod + def dictify(cls, strategy, graphson_io): + return graphson_io.typedValue(strategy.strategy_name, graphson_io.toDict(strategy.configuration)) -class EnumSerializer(GraphSONSerializer): - def _dictify(self, enum): - return _SymbolHelper.objectify(_SymbolHelper.toGremlin(type(enum).__name__), - _SymbolHelper.toGremlin(str(enum.name))) +class TraverserIO(_GraphSONTypeIO): + python_type = Traverser + graphson_type = "g:Traverser" -class PSerializer(GraphSONSerializer): - def _dictify(self, p): + @classmethod + def dictify(cls, traverser, graphson_io): + return graphson_io.typedValue("Traverser", {"value": graphson_io.toDict(traverser.object), + "bulk": graphson_io.toDict(traverser.bulk)}) + + @classmethod + def objectify(cls, d, graphson_io): + return Traverser(graphson_io.toObject(d["value"]), + graphson_io.toObject(d["bulk"])) + + +class EnumSerializer(_GraphSONTypeIO): + python_type = Enum + + @classmethod + def dictify(cls, enum, graphson_io): + return graphson_io.typedValue(cls.unmangleKeyword(type(enum).__name__), + cls.unmangleKeyword(str(enum.name))) + + +class PSerializer(_GraphSONTypeIO): + python_type = P + + @classmethod + def dictify(cls, p, graphson_io): out = {"predicate": p.operator, - "value": [GraphSONWriter._dictify(p.value), GraphSONWriter._dictify(p.other)] if p.other is not None else - GraphSONWriter._dictify(p.value)} - return _SymbolHelper.objectify("P", out) + "value": [graphson_io.toDict(p.value), graphson_io.toDict(p.other)] if p.other is not None else + graphson_io.toDict(p.value)} + return graphson_io.typedValue("P", out) + +class BindingSerializer(_GraphSONTypeIO): + python_type = Binding -class BindingSerializer(GraphSONSerializer): - def _dictify(self, binding): + @classmethod + def dictify(cls, binding, graphson_io): out = {"key": binding.key, - "value": GraphSONWriter._dictify(binding.value)} - return _SymbolHelper.objectify("Binding", out) + "value": graphson_io.toDict(binding.value)} + return graphson_io.typedValue("Binding", out) + +class LambdaSerializer(_GraphSONTypeIO): + python_type = FunctionType -class LambdaSerializer(GraphSONSerializer): - def _dictify(self, lambda_object): + @classmethod + def dictify(cls, lambda_object, graphson_io): lambda_result = lambda_object() script = lambda_result if isinstance(lambda_result, str) else lambda_result[0] language = statics.default_lambda_language if isinstance(lambda_result, str) else lambda_result[1] @@ -157,137 +236,94 @@ class LambdaSerializer(GraphSONSerializer): out["arguments"] = six.get_function_code(eval(out["script"])).co_argcount else: out["arguments"] = -1 - return _SymbolHelper.objectify("Lambda", out) + return graphson_io.typedValue("Lambda", out) -class TypeSerializer(GraphSONSerializer): - def _dictify(self, clazz): - return GraphSONWriter._dictify(clazz()) +class TypeSerializer(_GraphSONTypeIO): + python_type = TypeType + @classmethod + def dictify(cls, typ, graphson_io): + return graphson_io.toDict(typ()) -class NumberSerializer(GraphSONSerializer): - def _dictify(self, number): - if isinstance(number, bool): # python thinks that 0/1 integers are booleans - return number - elif isinstance(number, long) or ( - abs(number) > 2147483647): # in python all numbers are int unless specified otherwise - return _SymbolHelper.objectify("Int64", number) - elif isinstance(number, int): - return _SymbolHelper.objectify("Int32", number) - elif isinstance(number, float): - return _SymbolHelper.objectify("Float", number) - else: - return number +class _NumberIO(_GraphSONTypeIO): -''' -DESERIALIZERS -''' + @classmethod + def dictify(cls, n, graphson_io): + if isinstance(n, bool): # because isinstance(False, int) and isinstance(True, int) + return n + return graphson_io.typedValue(cls.graphson_base_type, n) + @classmethod + def objectify(cls, v, _): + return cls.python_type(v) -class GraphSONDeserializer(object): - @abstractmethod - def _objectify(self, d): - return d +class FloatIO(_NumberIO): + python_type = FloatType + graphson_type = "g:Float" + graphson_base_type = "Float" -class TraverserDeserializer(GraphSONDeserializer): - def _objectify(self, d): - return Traverser(GraphSONReader._objectify(d[_SymbolHelper._VALUE]["value"]), - GraphSONReader._objectify(d[_SymbolHelper._VALUE]["bulk"])) +class DoubleIO(FloatIO): + graphson_type = "g:Double" + graphson_base_type = "Double" -class NumberDeserializer(GraphSONDeserializer): - def _objectify(self, d): - type = d[_SymbolHelper._TYPE] - value = d[_SymbolHelper._VALUE] - if type == "g:Int32": - return int(value) - elif type == "g:Int64": - return long(value) - else: - return float(value) +class Int64IO(_NumberIO): + python_type = LongType + graphson_type = "g:Int64" + graphson_base_type = "Int64" -class VertexDeserializer(GraphSONDeserializer): - def _objectify(self, d): - value = d[_SymbolHelper._VALUE] - return Vertex(GraphSONReader._objectify(value["id"]), value.get("label", "")) +class Int32IO(_NumberIO): + python_type = IntType + graphson_type = "g:Int32" + graphson_base_type = "Int32" -class EdgeDeserializer(GraphSONDeserializer): - def _objectify(self, d): - value = d[_SymbolHelper._VALUE] - return Edge(GraphSONReader._objectify(value["id"]), - Vertex(GraphSONReader._objectify(value["outV"]), ""), - value.get("label", "vertex"), - Vertex(GraphSONReader._objectify(value["inV"]), "")) +class VertexDeserializer(_GraphSONTypeIO): + graphson_type = "g:Vertex" -class VertexPropertyDeserializer(GraphSONDeserializer): - def _objectify(self, d): - value = d[_SymbolHelper._VALUE] - return VertexProperty(GraphSONReader._objectify(value["id"]), value["label"], - GraphSONReader._objectify(value["value"])) + @classmethod + def objectify(cls, d, graphson_io): + return Vertex(graphson_io.toObject(d["id"]), d.get("label", "")) -class PropertyDeserializer(GraphSONDeserializer): - def _objectify(self, d): - value = d[_SymbolHelper._VALUE] - return Property(value["key"], GraphSONReader._objectify(value["value"])) +class EdgeDeserializer(_GraphSONTypeIO): + graphson_type = "g:Edge" + @classmethod + def objectify(cls, d, graphson_io): + return Edge(graphson_io.toObject(d["id"]), + Vertex(graphson_io.toObject(d["outV"]), ""), + d.get("label", "vertex"), + Vertex(graphson_io.toObject(d["inV"]), "")) -class PathDeserializer(GraphSONDeserializer): - def _objectify(self, d): - value = d[_SymbolHelper._VALUE] - labels = [set(label) for label in value["labels"]] - objects = [GraphSONReader._objectify(o) for o in value["objects"]] - return Path(labels, objects) +class VertexPropertyDeserializer(_GraphSONTypeIO): + graphson_type = "g:VertexProperty" -class _SymbolHelper(object): - symbolMap = {"global_": "global", "as_": "as", "in_": "in", "and_": "and", - "or_": "or", "is_": "is", "not_": "not", "from_": "from", - "set_": "set", "list_": "list", "all_": "all"} + @classmethod + def objectify(cls, d, graphson_io): + return VertexProperty(graphson_io.toObject(d["id"]), d["label"], + graphson_io.toObject(d["value"])) - _TYPE = "@type" - _VALUE = "@value" - @staticmethod - def toGremlin(symbol): - return _SymbolHelper.symbolMap.get(symbol, symbol) +class PropertyDeserializer(_GraphSONTypeIO): + graphson_type = "g:Property" - @staticmethod - def objectify(type, value=None, prefix="g"): - object = {_SymbolHelper._TYPE: prefix + ":" + type} - if value is not None: - object[_SymbolHelper._VALUE] = value - return object - -serializers = { - Traversal: BytecodeSerializer(), - Traverser: TraverserSerializer(), - Bytecode: BytecodeSerializer(), - Binding: BindingSerializer(), - P: PSerializer(), - Enum: EnumSerializer(), - FunctionType: LambdaSerializer(), - LongType: NumberSerializer(), - IntType: NumberSerializer(), - FloatType: NumberSerializer(), - TypeType: TypeSerializer(), - TraversalStrategy: TraversalStrategySerializer(), -} - -deserializers = { - "g:Traverser": TraverserDeserializer(), - "g:Int32": NumberDeserializer(), - "g:Int64": NumberDeserializer(), - "g:Float": NumberDeserializer(), - "g:Double": NumberDeserializer(), - "g:Vertex": VertexDeserializer(), - "g:Edge": EdgeDeserializer(), - "g:VertexProperty": VertexPropertyDeserializer(), - "g:Property": PropertyDeserializer(), - "g:Path": PathDeserializer() -} + @classmethod + def objectify(cls, d, graphson_io): + return Property(d["key"], graphson_io.toObject(d["value"])) + + +class PathDeserializer(_GraphSONTypeIO): + graphson_type = "g:Path" + + @classmethod + def objectify(cls, d, graphson_io): + labels = [set(label) for label in d["labels"]] + objects = [graphson_io.toObject(o) for o in d["objects"]] + return Path(labels, objects) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py b/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py index 313f406..90866aa 100644 --- a/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py +++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py @@ -20,6 +20,7 @@ under the License. __author__ = 'Marko A. Rodriguez (http://markorodriguez.com)' import json +from mock import Mock import unittest from unittest import TestCase @@ -28,37 +29,39 @@ import six from gremlin_python.statics import * from gremlin_python.structure.graph import Vertex from gremlin_python.structure.graph import Path -from gremlin_python.structure.io.graphson import GraphSONReader -from gremlin_python.structure.io.graphson import GraphSONWriter +from gremlin_python.structure.io.graphson import GraphSONIO +import gremlin_python.structure.io.graphson from gremlin_python.process.traversal import P from gremlin_python.process.strategies import SubgraphStrategy from gremlin_python.process.graph_traversal import __ +graphson_io = GraphSONIO() -class TestGraphSONReader(TestCase): - def test_numbers(self): - x = GraphSONReader.readObject(json.dumps({ + +class TestGraphSONIO(TestCase): + def test_number_input(self): + x = graphson_io.readObject(json.dumps({ "@type": "g:Int32", "@value": 31 })) assert isinstance(x, int) assert 31 == x ## - x = GraphSONReader.readObject(json.dumps({ + x = graphson_io.readObject(json.dumps({ "@type": "g:Int64", "@value": 31 })) assert isinstance(x, long) assert long(31) == x ## - x = GraphSONReader.readObject(json.dumps({ + x = graphson_io.readObject(json.dumps({ "@type": "g:Float", "@value": 31.3 })) assert isinstance(x, float) assert 31.3 == x ## - x = GraphSONReader.readObject(json.dumps({ + x = graphson_io.readObject(json.dumps({ "@type": "g:Double", "@value": 31.2 })) @@ -66,7 +69,7 @@ class TestGraphSONReader(TestCase): assert 31.2 == x def test_graph(self): - vertex = GraphSONReader.readObject( + vertex = graphson_io.readObject( """{"@type":"g:Vertex", "@value":{"id":{"@type":"g:Int32","@value":1},"label":"person","outE":{"created":[{"id":{"@type":"g:Int32","@value":9},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.4}}}],"knows":[{"id":{"@type":"g:Int32","@value":7},"inV":{"@type":"g:Int32","@value":2},"properties":{"weight":{"@type":"g:Double","@value":0.5}}},{"id":{"@type":"g:Int32","@value":8},"inV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":0},"value":"marko"}],"age":[{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29}}]}}}""") assert isinstance(vertex, Vertex) assert "person" == vertex.label @@ -75,7 +78,7 @@ class TestGraphSONReader(TestCase): assert vertex == Vertex(1) def test_path(self): - path = GraphSONReader.readObject( + path = graphson_io.readObject( """{"@type":"g:Path","@value":{"labels":[["a"],["b","c"],[]],"objects":[{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":1},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":0},"value":"marko","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29},"label":"age"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":3},"label":"software","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":4},"value":"lop","label":"name"}}],"lang":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":5},"value":"java","label":"lang"}}]}}},"lop"]}}""" ) assert isinstance(path, Path) @@ -88,25 +91,71 @@ class TestGraphSONReader(TestCase): assert "lop" == path[2] assert 3 == len(path) + def test_number_output(self): + assert {"@type":"g:Int64","@value":2} == json.loads(graphson_io.writeObject(long(2))) + assert {"@type":"g:Int32","@value":1} == json.loads(graphson_io.writeObject(1)) + assert {"@type":"g:Double","@value":3.2} == json.loads(graphson_io.writeObject(3.2)) + assert """true""" == graphson_io.writeObject(True) -class TestGraphSONWriter(TestCase): def test_numbers(self): - assert {"@type": "g:Int64", "@value": 2} == json.loads(GraphSONWriter.writeObject(long(2))) - assert {"@type": "g:Int32", "@value": 1} == json.loads(GraphSONWriter.writeObject(1)) - assert {"@type": "g:Float", "@value": 3.2} == json.loads(GraphSONWriter.writeObject(3.2)) - assert """true""" == GraphSONWriter.writeObject(True) + assert {"@type": "g:Int64", "@value": 2} == json.loads(graphson_io.writeObject(long(2))) + assert {"@type": "g:Int32", "@value": 1} == json.loads(graphson_io.writeObject(1)) + assert {"@type": "g:Double", "@value": 3.2} == json.loads(graphson_io.writeObject(3.2)) + assert """true""" == graphson_io.writeObject(True) def test_P(self): - assert """{"@type":"g:P","@value":{"predicate":"and","value":[{"@type":"g:P","@value":{"predicate":"or","value":[{"@type":"g:P","@value":{"predicate":"lt","value":"b"}},{"@type":"g:P","@value":{"predicate":"gt","value":"c"}}]}},{"@type":"g:P","@value":{"predicate":"neq","value":"d"}}]}}""" == GraphSONWriter.writeObject( + assert """{"@type":"g:P","@value":{"predicate":"and","value":[{"@type":"g:P","@value":{"predicate":"or","value":[{"@type":"g:P","@value":{"predicate":"lt","value":"b"}},{"@type":"g:P","@value":{"predicate":"gt","value":"c"}}]}},{"@type":"g:P","@value":{"predicate":"neq","value":"d"}}]}}""" == graphson_io.writeObject( P.lt("b").or_(P.gt("c")).and_(P.neq("d"))) def test_strategies(self): # we have a proxy model for now given that we don't want to have to have g:XXX all registered on the Gremlin traversal machine (yet) - assert {"@type": "g:SubgraphStrategy", "@value": {}} == json.loads(GraphSONWriter.writeObject(SubgraphStrategy)) + assert {"@type": "g:SubgraphStrategy", "@value": {}} == json.loads(graphson_io.writeObject(SubgraphStrategy)) assert {"@type": "g:SubgraphStrategy", "@value": { "vertices": {"@type": "g:Bytecode", "@value": {"step": [["has", "name", "marko"]]}}}} == json.loads( - GraphSONWriter.writeObject(SubgraphStrategy(vertices=__.has("name", "marko")))) - + graphson_io.writeObject(SubgraphStrategy(vertices=__.has("name", "marko")))) + + def test_custom_mapping(self): + + # extended mapping + class X(object): + pass + + type_string = "test:Xtype" + override_string = "g:Int64" + serdes = Mock() + + gio = GraphSONIO(serializer_map={X: serdes}, deserializer_map={type_string: serdes, }) + self.assertIn(X, gio.serializers) + self.assertIn(type_string, gio.deserializers) + + # base dicts are not modified + self.assertNotIn(X, gremlin_python.structure.io.graphson._serializers) + self.assertNotIn(type_string, gremlin_python.structure.io.graphson._deserializers) + + obj = X() + d = gio.toDict(obj) + serdes.dictify.assert_called_once_with(obj, gio) + self.assertIs(d, serdes.dictify()) + + o = gio.toObject({GraphSONIO._TYPE_KEY: type_string, GraphSONIO._VALUE_KEY: obj}) + serdes.objectify.assert_called_once_with(obj, gio) + self.assertIs(o, serdes.objectify()) + + # overridden mapping + type_string = "g:Int64" + serdes = Mock() + gio = GraphSONIO(serializer_map={int: serdes}, deserializer_map={type_string: serdes, override_string: serdes}) + self.assertIsNot(gremlin_python.structure.io.graphson._serializers[int], gio.serializers[int]) + self.assertIsNot(gremlin_python.structure.io.graphson._deserializers[type_string], gio.deserializers[type_string]) + + value = 3 + d = gio.toDict(value) + serdes.dictify.assert_called_once_with(value, gio) + self.assertIs(d, serdes.dictify()) + + o = gio.toObject({GraphSONIO._TYPE_KEY: type_string, GraphSONIO._VALUE_KEY: value}) + serdes.objectify.assert_called_once_with(value, gio) + self.assertIs(o, serdes.objectify()) if __name__ == '__main__': unittest.main() http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java index e71d3e6..d5305dc 100644 --- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java +++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java @@ -49,8 +49,8 @@ public class JythonScriptEngineSetup { jythonEngine.eval("from gremlin_python.structure.graph import Edge"); jythonEngine.eval("from gremlin_python.structure.graph import VertexProperty"); jythonEngine.eval("from gremlin_python.structure.graph import Property"); - jythonEngine.eval("from gremlin_python.structure.io.graphson import GraphSONWriter"); - jythonEngine.eval("from gremlin_python.structure.io.graphson import GraphSONReader"); + jythonEngine.eval("from gremlin_python.structure.io.graphson import GraphSONIO"); + jythonEngine.eval("graphson_io = GraphSONIO()"); return jythonEngine; } catch (final ScriptException e) { throw new IllegalStateException(e.getMessage(), e); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java index 8bb5330..e57afd2 100644 --- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java +++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java @@ -69,7 +69,7 @@ final class PythonGraphSONJavaTranslator<S extends TraversalSource, T extends Tr bindings.putAll(jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE)); bindings.put(this.pythonTranslator.getTraversalSource(), jythonEngine.eval("Graph().traversal()")); bindings.putAll(bytecode.getBindings()); - final String graphsonBytecode = jythonEngine.eval("GraphSONWriter.writeObject(" + this.pythonTranslator.translate(bytecode) + ")", bindings).toString(); + final String graphsonBytecode = jythonEngine.eval("graphson_io.writeObject(" + this.pythonTranslator.translate(bytecode) + ")", bindings).toString(); // System.out.println(graphsonBytecode); return this.javaTranslator.translate(this.reader.readObject(new ByteArrayInputStream(graphsonBytecode.getBytes()), Bytecode.class)); } catch (final Exception e) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONReaderTest.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONReaderTest.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONReaderTest.java index 171fd04..7bbf364 100644 --- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONReaderTest.java +++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONReaderTest.java @@ -60,49 +60,49 @@ public class GraphSONReaderTest { public void shouldDeserializeGraphObjects() throws Exception { final Vertex vertex = g.V(1).next(); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(vertex)); - assertEquals(vertex.toString(), jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),Vertex)")); + assertEquals(vertex.toString(), jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Vertex)")); // final Edge edge = g.V(1).outE("created").next(); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(edge)); - assertEquals(edge.toString(), jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),Edge)")); + assertEquals(edge.toString(), jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Edge)")); // final VertexProperty vertexProperty = (VertexProperty) g.V(1).properties("name").next(); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(vertexProperty)); - assertEquals(vertexProperty.toString(), jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),VertexProperty)")); + assertEquals(vertexProperty.toString(), jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),VertexProperty)")); // final Property property = g.V(1).outE("created").properties("weight").next(); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(property)); - assertEquals(property.toString(), jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),Property)")); + assertEquals(property.toString(), jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Property)")); // final Traverser<Vertex> traverser = new DefaultRemoteTraverser<>(vertex, 3L); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(traverser)); - assertEquals(traverser.toString(), jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertEquals(BigInteger.valueOf(3L), jythonEngine.eval("GraphSONReader.readObject(x).bulk")); // jython uses big integer in Java - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x).object,Vertex)")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),Traverser)")); + assertEquals(traverser.toString(), jythonEngine.eval("str(graphson_io.readObject(x))")); + assertEquals(BigInteger.valueOf(3L), jythonEngine.eval("graphson_io.readObject(x).bulk")); // jython uses big integer in Java + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x).object,Vertex)")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Traverser)")); } @Test public void shouldDeserializeNumbers() throws Exception { jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1)); - assertEquals("1", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),int)")); + assertEquals("1", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),int)")); // jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1L)); - assertEquals("1", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),long)")); + assertEquals("1", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),long)")); // jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.2f)); - assertEquals("1.2", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),float)")); + assertEquals("1.2", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),float)")); // jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.3d)); - assertEquals("1.3", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x),float)")); + assertEquals("1.3", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),float)")); } @Test @@ -111,23 +111,23 @@ public class GraphSONReaderTest { map.put("a", 2); map.put("b", 2.3d); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(map)); - assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertEquals(2, jythonEngine.eval("GraphSONReader.readObject(x)['a']")); - assertEquals(2.3d, jythonEngine.eval("GraphSONReader.readObject(x)['b']")); // jython is smart about double - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)['a'],int)")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)['b'],float)")); + assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertEquals(2, jythonEngine.eval("graphson_io.readObject(x)['a']")); + assertEquals(2.3d, jythonEngine.eval("graphson_io.readObject(x)['b']")); // jython is smart about double + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)['a'],int)")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)['b'],float)")); // final List<Object> list = Arrays.asList(g.V(1).next(), "hello", map, true); jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(list)); - assertEquals("[v[1], u'hello', {u'a': 2, u'b': 2.3}, True]", jythonEngine.eval("str(GraphSONReader.readObject(x))")); - assertEquals(g.V(1).next().toString(), jythonEngine.eval("str(GraphSONReader.readObject(x)[0])")); - assertEquals("hello", jythonEngine.eval("GraphSONReader.readObject(x)[1]")); - assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(GraphSONReader.readObject(x)[2])")); - assertTrue((Boolean) jythonEngine.eval("GraphSONReader.readObject(x)[3]")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)[0],Vertex)")); - // assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)[1],str)")); // its python unicode jython object - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)[2],dict)")); - assertTrue((Boolean) jythonEngine.eval("isinstance(GraphSONReader.readObject(x)[3],bool)")); + assertEquals("[v[1], u'hello', {u'a': 2, u'b': 2.3}, True]", jythonEngine.eval("str(graphson_io.readObject(x))")); + assertEquals(g.V(1).next().toString(), jythonEngine.eval("str(graphson_io.readObject(x)[0])")); + assertEquals("hello", jythonEngine.eval("graphson_io.readObject(x)[1]")); + assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_io.readObject(x)[2])")); + assertTrue((Boolean) jythonEngine.eval("graphson_io.readObject(x)[3]")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)[0],Vertex)")); + // assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)[1],str)")); // its python unicode jython object + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)[2],dict)")); + assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x)[3],bool)")); } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d392379e/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONWriterTest.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONWriterTest.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONWriterTest.java index 0ef3158..01e8c23 100644 --- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONWriterTest.java +++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/structure/io/graphson/GraphSONWriterTest.java @@ -56,75 +56,75 @@ public class GraphSONWriterTest { @Test public void shouldSerializeNumbers() throws Exception { - assertEquals(1, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(1)").toString(), Object.class)); - assertEquals(mapper.writeValueAsString(1), jythonEngine.eval("GraphSONWriter.writeObject(1)").toString().replace(" ", "")); + assertEquals(1, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(1)").toString(), Object.class)); + assertEquals(mapper.writeValueAsString(1), jythonEngine.eval("graphson_io.writeObject(1)").toString().replace(" ", "")); // - assertEquals(2L, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(2L)").toString(), Object.class)); - assertEquals(mapper.writeValueAsString(2L), jythonEngine.eval("GraphSONWriter.writeObject(2L)").toString().replace(" ", "")); + assertEquals(2L, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(2L)").toString(), Object.class)); + assertEquals(mapper.writeValueAsString(2L), jythonEngine.eval("graphson_io.writeObject(2L)").toString().replace(" ", "")); // - assertEquals(3.4f, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(3.4)").toString(), Object.class)); - assertEquals(mapper.writeValueAsString(3.4f), jythonEngine.eval("GraphSONWriter.writeObject(3.4)").toString().replace(" ", "")); + assertEquals(3.4, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(3.4)").toString(), Object.class)); + assertEquals(mapper.writeValueAsString(3.4), jythonEngine.eval("graphson_io.writeObject(3.4)").toString().replace(" ", "")); } @Test public void shouldSerializeCollections() throws Exception { final Map<String, Number> map = new LinkedHashMap<>(); map.put("a", 2); - map.put("b", 2.3f); - assertEquals(map, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject({'a':2,'b':2.3})").toString(), Object.class)); + map.put("b", 2.3); + assertEquals(map, mapper.readValue(jythonEngine.eval("graphson_io.writeObject({'a':2,'b':2.3})").toString(), Object.class)); // final List<Object> list = Arrays.asList(new DefaultRemoteTraverser<>("hello", 3L), "hello", map, true); assertTrue((Boolean) jythonEngine.eval("isinstance([Traverser('hello',3L),'hello',{'a':2,'b':2.3},True],list)")); - assertEquals(list, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject([Traverser('hello',3L),'hello',{'a':2,'b':2.3},True])").toString(), Object.class)); + assertEquals(list, mapper.readValue(jythonEngine.eval("graphson_io.writeObject([Traverser('hello',3L),'hello',{'a':2,'b':2.3},True])").toString(), Object.class)); } @Test public void shouldSerializeTraverser() throws Exception { assertEquals( new DefaultRemoteTraverser<>("hello", 3L), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Traverser('hello',3L))").toString(), Object.class)); - assertEquals(3L, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Traverser('hello',3L))").toString(), Traverser.class).bulk()); - assertEquals("hello", mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Traverser('hello',3L))").toString(), Traverser.class).get()); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Traverser('hello',3L))").toString(), Object.class)); + assertEquals(3L, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Traverser('hello',3L))").toString(), Traverser.class).bulk()); + assertEquals("hello", mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Traverser('hello',3L))").toString(), Traverser.class).get()); } @Test public void shouldSerializeBytecode() throws Exception { - assertEquals(P.eq(7L), mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(P.eq(7L))").toString(), Object.class)); - // TODO: assertEquals(mapper.writeValueAsString(P.between(1, 2).and(P.eq(7L))), jythonEngine.eval("GraphSONWriter.writeObject(P.eq(7L)._and(P.between(1,2)))").toString().replace(" ","")); - assertEquals(AndP.class, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(P.eq(7L).and_(P.between(1,2)))").toString(), Object.class).getClass()); + assertEquals(P.eq(7L), mapper.readValue(jythonEngine.eval("graphson_io.writeObject(P.eq(7L))").toString(), Object.class)); + // TODO: assertEquals(mapper.writeValueAsString(P.between(1, 2).and(P.eq(7L))), jythonEngine.eval("graphson_io.writeObject(P.eq(7L)._and(P.between(1,2)))").toString().replace(" ","")); + assertEquals(AndP.class, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(P.eq(7L).and_(P.between(1,2)))").toString(), Object.class).getClass()); // - assertEquals(new Bytecode.Binding<>("a", 5L), mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Binding('a',5L))").toString(), Object.class)); + assertEquals(new Bytecode.Binding<>("a", 5L), mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Binding('a',5L))").toString(), Object.class)); // for (final Column t : Column.values()) { - assertEquals(t, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Column." + t.name() + ")").toString(), Object.class)); + assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Column." + t.name() + ")").toString(), Object.class)); } for (final T t : T.values()) { - assertEquals(t, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(T." + t.name() + ")").toString(), Object.class)); + assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(T." + t.name() + ")").toString(), Object.class)); } - assertEquals(Pop.first, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Pop.first)").toString(), Object.class)); - assertEquals(Pop.last, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Pop.last)").toString(), Object.class)); - assertEquals(Pop.all, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Pop.all_)").toString(), Object.class)); - assertEquals(Scope.global, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Scope.global_)").toString(), Object.class)); - assertEquals(Scope.local, mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(Scope.local)").toString(), Object.class)); + assertEquals(Pop.first, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Pop.first)").toString(), Object.class)); + assertEquals(Pop.last, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Pop.last)").toString(), Object.class)); + assertEquals(Pop.all, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Pop.all_)").toString(), Object.class)); + assertEquals(Scope.global, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Scope.global_)").toString(), Object.class)); + assertEquals(Scope.local, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Scope.local)").toString(), Object.class)); } @Test public void shouldSerializeLambda() throws Exception { assertEquals( Lambda.function("lambda z : 1+2", "gremlin-python"), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(lambda : 'z : 1+2')").toString(), Object.class)); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'z : 1+2')").toString(), Object.class)); assertEquals( Lambda.function("lambda z : z+ 7", "gremlin-python"), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(lambda : 'lambda z : z+ 7')").toString(), Object.class)); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z : z+ 7')").toString(), Object.class)); assertEquals( Lambda.supplier("lambda : 23", "gremlin-python"), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(lambda : 'lambda : 23')").toString(), Object.class)); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda : 23')").toString(), Object.class)); assertEquals( Lambda.consumer("lambda z : z + 23", "gremlin-python"), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(lambda : 'lambda z : z + 23')").toString(), Object.class)); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z : z + 23')").toString(), Object.class)); assertEquals( Lambda.biFunction("lambda z,y : z - y + 2", "gremlin-python"), - mapper.readValue(jythonEngine.eval("GraphSONWriter.writeObject(lambda : 'lambda z,y : z - y + 2')").toString(), Object.class)); + mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z,y : z - y + 2')").toString(), Object.class)); } }