You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/10/12 20:53:35 UTC

[08/10] tinkerpop git commit: Split GraphSONIO into reader writer

Split GraphSONIO into reader writer

not an ideal design by itself, but follows the Java API precedence, which has
other requirements


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/0e211d6b
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/0e211d6b
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/0e211d6b

Branch: refs/heads/master
Commit: 0e211d6b763df2ee6260759c91b57b57770fc02b
Parents: d296eb7
Author: Adam Holmberg <Ad...@datastax.com>
Authored: Tue Oct 11 14:15:07 2016 -0500
Committer: Adam Holmberg <Ad...@datastax.com>
Committed: Tue Oct 11 14:15:07 2016 -0500

----------------------------------------------------------------------
 .../driver/driver_remote_connection.py          |  17 +-
 .../gremlin_python/structure/io/graphson.py     | 154 +++++++++----------
 .../jython/tests/structure/io/test_graphson.py  | 113 ++++++++------
 .../python/jsr223/JythonScriptEngineSetup.java  |   5 +-
 .../jsr223/PythonGraphSONJavaTranslator.java    |   2 +-
 .../io/graphson/GraphSONReaderTest.java         |  68 ++++----
 .../io/graphson/GraphSONWriterTest.java         |  54 +++----
 7 files changed, 219 insertions(+), 194 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0e211d6b/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 20129e9..eab06f1 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,7 +23,7 @@ from tornado import gen
 from tornado import ioloop
 from tornado import websocket
 
-from gremlin_python.structure.io.graphson import GraphSONIO
+from gremlin_python.structure.io.graphson import GraphSONReader, GraphSONWriter
 from .remote_connection import RemoteConnection
 from .remote_connection import RemoteTraversal
 from .remote_connection import RemoteTraversalSideEffects
@@ -34,14 +34,15 @@ class GremlinServerError(Exception):
 
 
 class DriverRemoteConnection(RemoteConnection):
-    def __init__(self, url, traversal_source, username="", password="", loop=None, graphson_io=None):
+    def __init__(self, url, traversal_source, username="", password="", loop=None, graphson_reader=None, graphson_writer=None):
         super(DriverRemoteConnection, self).__init__(url, traversal_source)
         self._url = url
         self._username = username
         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 = graphson_io or GraphSONIO()
+        self._graphson_reader = graphson_reader or GraphSONReader()
+        self._graphson_writer = graphson_writer or GraphSONWriter()
 
     def submit(self, bytecode):
         '''
@@ -65,7 +66,7 @@ class DriverRemoteConnection(RemoteConnection):
             "op": "bytecode",
             "processor": "traversal",
             "args": {
-                "gremlin": self._graphson_io.writeObject(bytecode),
+                "gremlin": self._graphson_writer.writeObject(bytecode),
                 "aliases": {"g": self.traversal_source}
             }
         }
@@ -142,7 +143,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, self._graphson_io)
+        response = Response(self._websocket, self._username, self._password, self._graphson_reader)
         results = None
         while True:
             recv_message = yield response.receive()
@@ -183,12 +184,12 @@ class DriverRemoteConnection(RemoteConnection):
 
 
 class Response:
-    def __init__(self, websocket, username, password, graphson_io):
+    def __init__(self, websocket, username, password, graphson_reader):
         self._websocket = websocket
         self._username = username
         self._password = password
         self._closed = False
-        self._graphson_io = graphson_io
+        self._graphson_reader = graphson_reader
 
     @gen.coroutine
     def receive(self):
@@ -225,7 +226,7 @@ class Response:
         elif status_code in [200, 206]:
             results = []
             for item in recv_message["result"]["data"]:
-                results.append(self._graphson_io.toObject(item))
+                results.append(self._graphson_reader.toObject(item))
             if status_code == 200:
                 self._closed = True
             raise gen.Return((aggregateTo, results))

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0e211d6b/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 50db7cb..45aec9d 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
@@ -16,24 +16,14 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 '''
-import json
 from aenum import Enum
-
+import json
 import six
 
 from gremlin_python import statics
 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
-from gremlin_python.process.traversal import Traversal
-from gremlin_python.process.traversal import Traverser
-from gremlin_python.process.traversal import TraversalStrategy
-from gremlin_python.structure.graph import Edge
-from gremlin_python.structure.graph import Property
-from gremlin_python.structure.graph import Vertex
-from gremlin_python.structure.graph import VertexProperty
-from gremlin_python.structure.graph import Path
+from gremlin_python.process.traversal import Binding, Bytecode, P, Traversal, Traverser, TraversalStrategy
+from gremlin_python.structure.graph import Edge, Property, Vertex, VertexProperty, Path
 
 
 _serializers = {}
@@ -51,32 +41,33 @@ class GraphSONTypeType(type):
         return cls
 
 
-class GraphSONIO(object):
+class _GraphSONIO(object):
+    TYPE_KEY = "@type"
+    VALUE_KEY = "@value"
+
+    @classmethod
+    def typedValue(cls, type_name, value, prefix="g"):
+        out = {cls.TYPE_KEY: prefix + ":" + type_name}
+        if value is not None:
+            out[cls.VALUE_KEY] = value
+        return out
 
-    _TYPE_KEY = "@type"
-    _VALUE_KEY = "@value"
 
-    def __init__(self, serializer_map=None, deserializer_map=None):
+# Read/Write classes split to follow precedence of the Java API
+class GraphSONWriter(object):
+
+    def __init__(self, serializer_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
@@ -92,13 +83,28 @@ class GraphSONIO(object):
         else:
             return obj
 
+
+class GraphSONReader(object):
+
+    def __init__(self, deserializer_map=None):
+        """
+        :param deserializer_map: map from GraphSON type tag to deserializer instance implementing `objectify`
+        """
+        self.deserializers = _deserializers.copy()
+        if deserializer_map:
+            self.deserializers.update(deserializer_map)
+
+    def readObject(self, jsonData):
+        # from JSON
+        return self.toObject(json.loads(jsonData))
+
     def toObject(self, obj):
         """
         Unpacks GraphSON type-tagged dict values into objects mapped in self.deserializers
         """
         if isinstance(obj, dict):
             try:
-                return self.deserializers[obj[self._TYPE_KEY]].objectify(obj[self._VALUE_KEY], self)
+                return self.deserializers[obj[_GraphSONIO.TYPE_KEY]].objectify(obj[_GraphSONIO.VALUE_KEY], self)
             except KeyError:
                 pass
             # list and map are treated as normal json objs (could be isolated deserializers)
@@ -108,12 +114,6 @@ class GraphSONIO(object):
         else:
             return obj
 
-    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):
@@ -128,34 +128,34 @@ class _GraphSONTypeIO(object):
     def unmangleKeyword(cls, symbol):
         return cls.symbolMap.get(symbol, symbol)
 
-    def dictify(self, obj, graphson_io):
+    def dictify(self, obj, writer):
         raise NotImplementedError()
 
-    def objectify(self, d, graphson_io):
+    def objectify(self, d, reader):
         raise NotImplementedError()
 
 
 class _BytecodeSerializer(_GraphSONTypeIO):
 
     @classmethod
-    def _dictify_instructions(cls, instructions, graphson_io):
+    def _dictify_instructions(cls, instructions, writer):
         out = []
         for instruction in instructions:
             inst = [instruction[0]]
-            inst.extend(graphson_io.toDict(arg) for arg in instruction[1:])
+            inst.extend(writer.toDict(arg) for arg in instruction[1:])
             out.append(inst)
         return out
 
     @classmethod
-    def dictify(cls, bytecode, graphson_io):
+    def dictify(cls, bytecode, writer):
         if isinstance(bytecode, Traversal):
             bytecode = bytecode.bytecode
         out = {}
         if bytecode.source_instructions:
-            out["source"] = cls._dictify_instructions(bytecode.source_instructions, graphson_io)
+            out["source"] = cls._dictify_instructions(bytecode.source_instructions, writer)
         if bytecode.step_instructions:
-            out["step"] = cls._dictify_instructions(bytecode.step_instructions, graphson_io)
-        return graphson_io.typedValue("Bytecode", out)
+            out["step"] = cls._dictify_instructions(bytecode.step_instructions, writer)
+        return _GraphSONIO.typedValue("Bytecode", out)
 
 
 class TraversalSerializer(_BytecodeSerializer):
@@ -170,8 +170,8 @@ 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))
+    def dictify(cls, strategy, writer):
+        return _GraphSONIO.typedValue(strategy.strategy_name, writer.toDict(strategy.configuration))
 
 
 class TraverserIO(_GraphSONTypeIO):
@@ -179,22 +179,22 @@ class TraverserIO(_GraphSONTypeIO):
     graphson_type = "g:Traverser"
 
     @classmethod
-    def dictify(cls, traverser, graphson_io):
-        return graphson_io.typedValue("Traverser", {"value": graphson_io.toDict(traverser.object),
-                                                     "bulk": graphson_io.toDict(traverser.bulk)})
+    def dictify(cls, traverser, writer):
+        return _GraphSONIO.typedValue("Traverser", {"value": writer.toDict(traverser.object),
+                                                     "bulk": writer.toDict(traverser.bulk)})
 
     @classmethod
-    def objectify(cls, d, graphson_io):
-        return Traverser(graphson_io.toObject(d["value"]),
-                         graphson_io.toObject(d["bulk"]))
+    def objectify(cls, d, reader):
+        return Traverser(reader.toObject(d["value"]),
+                         reader.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__),
+    def dictify(cls, enum, _):
+        return _GraphSONIO.typedValue(cls.unmangleKeyword(type(enum).__name__),
                                       cls.unmangleKeyword(str(enum.name)))
 
 
@@ -202,28 +202,28 @@ class PSerializer(_GraphSONTypeIO):
     python_type = P
 
     @classmethod
-    def dictify(cls, p, graphson_io):
+    def dictify(cls, p, writer):
         out = {"predicate": p.operator,
-               "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)
+               "value": [writer.toDict(p.value), writer.toDict(p.other)] if p.other is not None else
+                        writer.toDict(p.value)}
+        return _GraphSONIO.typedValue("P", out)
 
 
 class BindingSerializer(_GraphSONTypeIO):
     python_type = Binding
 
     @classmethod
-    def dictify(cls, binding, graphson_io):
+    def dictify(cls, binding, writer):
         out = {"key": binding.key,
-               "value": graphson_io.toDict(binding.value)}
-        return graphson_io.typedValue("Binding", out)
+               "value": writer.toDict(binding.value)}
+        return _GraphSONIO.typedValue("Binding", out)
 
 
 class LambdaSerializer(_GraphSONTypeIO):
     python_type = FunctionType
 
     @classmethod
-    def dictify(cls, lambda_object, graphson_io):
+    def dictify(cls, lambda_object, writer):
         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]
@@ -236,24 +236,24 @@ class LambdaSerializer(_GraphSONTypeIO):
             out["arguments"] = six.get_function_code(eval(out["script"])).co_argcount
         else:
             out["arguments"] = -1
-        return graphson_io.typedValue("Lambda", out)
+        return _GraphSONIO.typedValue("Lambda", out)
 
 
 class TypeSerializer(_GraphSONTypeIO):
     python_type = TypeType
 
     @classmethod
-    def dictify(cls, typ, graphson_io):
-        return graphson_io.toDict(typ())
+    def dictify(cls, typ, writer):
+        return writer.toDict(typ())
 
 
 class _NumberIO(_GraphSONTypeIO):
 
     @classmethod
-    def dictify(cls, n, graphson_io):
+    def dictify(cls, n, writer):
         if isinstance(n, bool):  # because isinstance(False, int) and isinstance(True, int)
             return n
-        return graphson_io.typedValue(cls.graphson_base_type, n)
+        return _GraphSONIO.typedValue(cls.graphson_base_type, n)
 
     @classmethod
     def objectify(cls, v, _):
@@ -287,43 +287,43 @@ class VertexDeserializer(_GraphSONTypeIO):
     graphson_type = "g:Vertex"
 
     @classmethod
-    def objectify(cls, d, graphson_io):
-        return Vertex(graphson_io.toObject(d["id"]), d.get("label", ""))
+    def objectify(cls, d, reader):
+        return Vertex(reader.toObject(d["id"]), d.get("label", ""))
 
 
 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"]), ""),
+    def objectify(cls, d, reader):
+        return Edge(reader.toObject(d["id"]),
+                    Vertex(reader.toObject(d["outV"]), ""),
                     d.get("label", "vertex"),
-                    Vertex(graphson_io.toObject(d["inV"]), ""))
+                    Vertex(reader.toObject(d["inV"]), ""))
 
 
 class VertexPropertyDeserializer(_GraphSONTypeIO):
     graphson_type = "g:VertexProperty"
 
     @classmethod
-    def objectify(cls, d, graphson_io):
-        return VertexProperty(graphson_io.toObject(d["id"]), d["label"],
-                              graphson_io.toObject(d["value"]))
+    def objectify(cls, d, reader):
+        return VertexProperty(reader.toObject(d["id"]), d["label"],
+                              reader.toObject(d["value"]))
 
 
 class PropertyDeserializer(_GraphSONTypeIO):
     graphson_type = "g:Property"
 
     @classmethod
-    def objectify(cls, d, graphson_io):
-        return Property(d["key"], graphson_io.toObject(d["value"]))
+    def objectify(cls, d, reader):
+        return Property(d["key"], reader.toObject(d["value"]))
 
 
 class PathDeserializer(_GraphSONTypeIO):
     graphson_type = "g:Path"
 
     @classmethod
-    def objectify(cls, d, graphson_io):
+    def objectify(cls, d, reader):
         labels = [set(label) for label in d["labels"]]
-        objects = [graphson_io.toObject(o) for o in d["objects"]]
+        objects = [reader.toObject(o) for o in d["objects"]]
         return Path(labels, objects)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0e211d6b/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 90866aa..a192cd2 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
@@ -29,39 +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 GraphSONIO
+from gremlin_python.structure.io.graphson import GraphSONWriter, GraphSONReader, _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):
+    graphson_reader = GraphSONReader()
 
-class TestGraphSONIO(TestCase):
     def test_number_input(self):
-        x = graphson_io.readObject(json.dumps({
+        x = self.graphson_reader.readObject(json.dumps({
             "@type": "g:Int32",
             "@value": 31
         }))
         assert isinstance(x, int)
         assert 31 == x
         ##
-        x = graphson_io.readObject(json.dumps({
+        x = self.graphson_reader.readObject(json.dumps({
             "@type": "g:Int64",
             "@value": 31
         }))
         assert isinstance(x, long)
         assert long(31) == x
         ##
-        x = graphson_io.readObject(json.dumps({
+        x = self.graphson_reader.readObject(json.dumps({
             "@type": "g:Float",
             "@value": 31.3
         }))
         assert isinstance(x, float)
         assert 31.3 == x
         ##
-        x = graphson_io.readObject(json.dumps({
+        x = self.graphson_reader.readObject(json.dumps({
             "@type": "g:Double",
             "@value": 31.2
         }))
@@ -69,7 +69,7 @@ class TestGraphSONIO(TestCase):
         assert 31.2 == x
 
     def test_graph(self):
-        vertex = graphson_io.readObject(
+        vertex = self.graphson_reader.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
@@ -78,7 +78,7 @@ class TestGraphSONIO(TestCase):
         assert vertex == Vertex(1)
 
     def test_path(self):
-        path = graphson_io.readObject(
+        path = self.graphson_reader.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)
@@ -91,28 +91,65 @@ class TestGraphSONIO(TestCase):
         assert "lop" == path[2]
         assert 3 == len(path)
 
+    def test_custom_mapping(self):
+
+        # extended mapping
+        class X(object):
+            pass
+
+        type_string = "test:Xtype"
+        override_string = "g:Int64"
+        serdes = Mock()
+
+        reader = GraphSONReader(deserializer_map={type_string: serdes})
+        assert type_string in reader.deserializers
+
+        # base dicts are not modified
+        assert type_string not in gremlin_python.structure.io.graphson._deserializers
+
+        x = X()
+        o = reader.toObject({_GraphSONIO.TYPE_KEY: type_string, _GraphSONIO.VALUE_KEY: x})
+        serdes.objectify.assert_called_once_with(x, reader)
+        assert o is serdes.objectify()
+
+        # overridden mapping
+        type_string = "g:Int64"
+        serdes = Mock()
+        reader = GraphSONReader(deserializer_map={type_string: serdes, override_string: serdes})
+        assert gremlin_python.structure.io.graphson._deserializers[type_string] is not reader.deserializers[type_string]
+
+        value = 3
+        o = reader.toObject({_GraphSONIO.TYPE_KEY: type_string, _GraphSONIO.VALUE_KEY: value})
+        serdes.objectify.assert_called_once_with(value, reader)
+        assert o is serdes.objectify()
+
+
+class TestGraphSONWriter(TestCase):
+
+    graphson_writer = GraphSONWriter()
+
     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)
+        assert {"@type":"g:Int64","@value":2} == json.loads(self.graphson_writer.writeObject(long(2)))
+        assert {"@type":"g:Int32","@value":1} == json.loads(self.graphson_writer.writeObject(1))
+        assert {"@type":"g:Double","@value":3.2} == json.loads(self.graphson_writer.writeObject(3.2))
+        assert """true""" == self.graphson_writer.writeObject(True)
 
     def test_numbers(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)
+        assert {"@type": "g:Int64", "@value": 2} == json.loads(self.graphson_writer.writeObject(long(2)))
+        assert {"@type": "g:Int32", "@value": 1} == json.loads(self.graphson_writer.writeObject(1))
+        assert {"@type": "g:Double", "@value": 3.2} == json.loads(self.graphson_writer.writeObject(3.2))
+        assert """true""" == self.graphson_writer.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"}}]}}""" == graphson_io.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"}}]}}""" == self.graphson_writer.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(graphson_io.writeObject(SubgraphStrategy))
+        assert {"@type": "g:SubgraphStrategy", "@value": {}} == json.loads(self.graphson_writer.writeObject(SubgraphStrategy))
         assert {"@type": "g:SubgraphStrategy", "@value": {
             "vertices": {"@type": "g:Bytecode", "@value": {"step": [["has", "name", "marko"]]}}}} == json.loads(
-            graphson_io.writeObject(SubgraphStrategy(vertices=__.has("name", "marko"))))
+            self.graphson_writer.writeObject(SubgraphStrategy(vertices=__.has("name", "marko"))))
 
     def test_custom_mapping(self):
 
@@ -120,42 +157,28 @@ class TestGraphSONIO(TestCase):
         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)
+        writer = GraphSONWriter(serializer_map={X: serdes})
+        assert X in writer.serializers
 
         # base dicts are not modified
-        self.assertNotIn(X, gremlin_python.structure.io.graphson._serializers)
-        self.assertNotIn(type_string, gremlin_python.structure.io.graphson._deserializers)
+        assert X not in gremlin_python.structure.io.graphson._serializers
 
         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())
+        d = writer.toDict(obj)
+        serdes.dictify.assert_called_once_with(obj, writer)
+        assert d is serdes.dictify()
 
         # 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])
+        writer = GraphSONWriter(serializer_map={int: serdes})
+        assert gremlin_python.structure.io.graphson._serializers[int] is not writer.serializers[int]
 
         value = 3
-        d = gio.toDict(value)
-        serdes.dictify.assert_called_once_with(value, gio)
-        self.assertIs(d, serdes.dictify())
+        d = writer.toDict(value)
+        serdes.dictify.assert_called_once_with(value, writer)
+        assert d is 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/0e211d6b/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 d5305dc..a16ce30 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,9 @@ 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 GraphSONIO");
-            jythonEngine.eval("graphson_io = GraphSONIO()");
+            jythonEngine.eval("from gremlin_python.structure.io.graphson import GraphSONReader, GraphSONWriter");
+            jythonEngine.eval("graphson_reader = GraphSONReader()");
+            jythonEngine.eval("graphson_writer = GraphSONWriter()");
             return jythonEngine;
         } catch (final ScriptException e) {
             throw new IllegalStateException(e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0e211d6b/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 e57afd2..cdeb407 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("graphson_io.writeObject(" + this.pythonTranslator.translate(bytecode) + ")", bindings).toString();
+            final String graphsonBytecode = jythonEngine.eval("graphson_writer.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/0e211d6b/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 7bbf364..86bdd21 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(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Vertex)"));
+        assertEquals(vertex.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Edge)"));
+        assertEquals(edge.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),VertexProperty)"));
+        assertEquals(vertexProperty.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),Property)"));
+        assertEquals(property.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(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)"));
+        assertEquals(traverser.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertEquals(BigInteger.valueOf(3L), jythonEngine.eval("graphson_reader.readObject(x).bulk")); // jython uses big integer in Java
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x).object,Vertex)"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),Traverser)"));
     }
 
     @Test
     public void shouldDeserializeNumbers() throws Exception {
         jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1));
-        assertEquals("1", jythonEngine.eval("str(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),int)"));
+        assertEquals("1", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),int)"));
         //
         jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1L));
-        assertEquals("1", jythonEngine.eval("str(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),long)"));
+        assertEquals("1", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),long)"));
         //
         jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.2f));
-        assertEquals("1.2", jythonEngine.eval("str(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),float)"));
+        assertEquals("1.2", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),float)"));
         //
         jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.3d));
-        assertEquals("1.3", jythonEngine.eval("str(graphson_io.readObject(x))"));
-        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_io.readObject(x),float)"));
+        assertEquals("1.3", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(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)"));
+        assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertEquals(2, jythonEngine.eval("graphson_reader.readObject(x)['a']"));
+        assertEquals(2.3d, jythonEngine.eval("graphson_reader.readObject(x)['b']")); // jython is smart about double
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)['a'],int)"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.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(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)"));
+        assertEquals("[v[1], u'hello', {u'a': 2, u'b': 2.3}, True]", jythonEngine.eval("str(graphson_reader.readObject(x))"));
+        assertEquals(g.V(1).next().toString(), jythonEngine.eval("str(graphson_reader.readObject(x)[0])"));
+        assertEquals("hello", jythonEngine.eval("graphson_reader.readObject(x)[1]"));
+        assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_reader.readObject(x)[2])"));
+        assertTrue((Boolean) jythonEngine.eval("graphson_reader.readObject(x)[3]"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[0],Vertex)"));
+        // assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[1],str)")); // its python unicode jython object
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[2],dict)"));
+        assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[3],bool)"));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0e211d6b/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 01e8c23..58211c6 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,14 +56,14 @@ public class GraphSONWriterTest {
 
     @Test
     public void shouldSerializeNumbers() throws Exception {
-        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(1, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(1)").toString(), Object.class));
+        assertEquals(mapper.writeValueAsString(1), jythonEngine.eval("graphson_writer.writeObject(1)").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(2L, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(2L)").toString(), Object.class));
+        assertEquals(mapper.writeValueAsString(2L), jythonEngine.eval("graphson_writer.writeObject(2L)").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(" ", ""));
+        assertEquals(3.4, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(3.4)").toString(), Object.class));
+        assertEquals(mapper.writeValueAsString(3.4), jythonEngine.eval("graphson_writer.writeObject(3.4)").toString().replace(" ", ""));
     }
 
     @Test
@@ -71,60 +71,60 @@ public class GraphSONWriterTest {
         final Map<String, Number> map = new LinkedHashMap<>();
         map.put("a", 2);
         map.put("b", 2.3);
-        assertEquals(map, mapper.readValue(jythonEngine.eval("graphson_io.writeObject({'a':2,'b':2.3})").toString(), Object.class));
+        assertEquals(map, mapper.readValue(jythonEngine.eval("graphson_writer.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("graphson_io.writeObject([Traverser('hello',3L),'hello',{'a':2,'b':2.3},True])").toString(), Object.class));
+        assertEquals(list, mapper.readValue(jythonEngine.eval("graphson_writer.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("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());
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Traverser('hello',3L))").toString(), Object.class));
+        assertEquals(3L, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Traverser('hello',3L))").toString(), Traverser.class).bulk());
+        assertEquals("hello", mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Traverser('hello',3L))").toString(), Traverser.class).get());
     }
 
     @Test
     public void shouldSerializeBytecode() throws Exception {
-        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(P.eq(7L), mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(P.eq(7L))").toString(), Object.class));
+        // TODO: assertEquals(mapper.writeValueAsString(P.between(1, 2).and(P.eq(7L))), jythonEngine.eval("graphson_writer.writeObject(P.eq(7L)._and(P.between(1,2)))").toString().replace(" ",""));
+        assertEquals(AndP.class, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(P.eq(7L).and_(P.between(1,2)))").toString(), Object.class).getClass());
         //
-        assertEquals(new Bytecode.Binding<>("a", 5L), mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Binding('a',5L))").toString(), Object.class));
+        assertEquals(new Bytecode.Binding<>("a", 5L), mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Binding('a',5L))").toString(), Object.class));
         //
         for (final Column t : Column.values()) {
-            assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(Column." + t.name() + ")").toString(), Object.class));
+            assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Column." + t.name() + ")").toString(), Object.class));
         }
         for (final T t : T.values()) {
-            assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_io.writeObject(T." + t.name() + ")").toString(), Object.class));
+            assertEquals(t, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(T." + t.name() + ")").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));
+        assertEquals(Pop.first, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Pop.first)").toString(), Object.class));
+        assertEquals(Pop.last, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Pop.last)").toString(), Object.class));
+        assertEquals(Pop.all, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Pop.all_)").toString(), Object.class));
+        assertEquals(Scope.global, mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(Scope.global_)").toString(), Object.class));
+        assertEquals(Scope.local, mapper.readValue(jythonEngine.eval("graphson_writer.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("graphson_io.writeObject(lambda : 'z : 1+2')").toString(), Object.class));
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(lambda : 'z : 1+2')").toString(), Object.class));
         assertEquals(
                 Lambda.function("lambda z : z+ 7", "gremlin-python"),
-                mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z : z+ 7')").toString(), Object.class));
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(lambda : 'lambda z : z+ 7')").toString(), Object.class));
         assertEquals(
                 Lambda.supplier("lambda : 23", "gremlin-python"),
-                mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda : 23')").toString(), Object.class));
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(lambda : 'lambda : 23')").toString(), Object.class));
         assertEquals(
                 Lambda.consumer("lambda z : z + 23", "gremlin-python"),
-                mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z : z + 23')").toString(), Object.class));
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(lambda : 'lambda z : z + 23')").toString(), Object.class));
         assertEquals(
                 Lambda.biFunction("lambda z,y : z - y + 2", "gremlin-python"),
-                mapper.readValue(jythonEngine.eval("graphson_io.writeObject(lambda : 'lambda z,y : z - y + 2')").toString(), Object.class));
+                mapper.readValue(jythonEngine.eval("graphson_writer.writeObject(lambda : 'lambda z,y : z - y + 2')").toString(), Object.class));
     }
 
 }