This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2279 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 897874256ef90345e380ecca0ed806708dfd591b Author: Stephen Mallette <[email protected]> AuthorDate: Mon Jul 22 13:51:55 2019 -0400 Added int graphbinary serialization for python Included tests for heterogenous lists now that we have two primitives that work. --- .../gremlin_python/structure/io/graphbinaryV1.py | 25 ++++++++++++++++++---- .../tests/structure/io/test_graphbinaryV1.py | 10 +++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphbinaryV1.py b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphbinaryV1.py index 5e06da4..9c9ab30 100644 --- a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphbinaryV1.py +++ b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphbinaryV1.py @@ -48,6 +48,7 @@ _deserializers = {} class DataType(Enum): + int = 0x01 string = 0x03 list = 0x09 @@ -131,6 +132,10 @@ class _GraphBinaryTypeIO(object): return ba @classmethod + def read_int(cls, buff): + return struct.unpack(">i", buff.read(4))[0] + + @classmethod def unmangleKeyword(cls, symbol): return cls.symbolMap.get(symbol, symbol) @@ -141,6 +146,20 @@ class _GraphBinaryTypeIO(object): raise NotImplementedError() +class IntIO(_GraphBinaryTypeIO): + + python_type = IntType + graphbinary_type = DataType.int + + @classmethod + def dictify(cls, n, writer): + return cls.as_bytes(cls.graphbinary_type, None, struct.pack(">i", n)) + + @classmethod + def objectify(cls, b, reader): + return cls.read_int(b) + + class StringIO(_GraphBinaryTypeIO): python_type = str @@ -152,8 +171,7 @@ class StringIO(_GraphBinaryTypeIO): @classmethod def objectify(cls, b, reader): - size = struct.unpack(">i", b.read(4))[0] - return b.read(size) + return b.read(cls.read_int(b)) class ListIO(_GraphBinaryTypeIO): @@ -171,8 +189,7 @@ class ListIO(_GraphBinaryTypeIO): @classmethod def objectify(cls, buff, reader): - x = buff.read(4) - size = struct.unpack(">i", x)[0] + size = cls.read_int(buff) the_list = [] while size > 0: the_list.append(reader.readObject(buff)) diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_graphbinaryV1.py b/gremlin-python/src/main/jython/tests/structure/io/test_graphbinaryV1.py index 1fd2a19..b95b0e0 100644 --- a/gremlin-python/src/main/jython/tests/structure/io/test_graphbinaryV1.py +++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphbinaryV1.py @@ -43,6 +43,11 @@ class TestGraphSONWriter(object): graphbinary_writer = GraphBinaryWriter() graphbinary_reader = GraphBinaryReader() + def test_int(self): + x = 100 + output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) + assert x == output + def test_string(self): x = "serialize this!" output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) @@ -52,3 +57,8 @@ class TestGraphSONWriter(object): x = ["serialize this!", "serialize that!", "stop telling me what to serialize"] output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) assert x == output + + def test_heterogeneous_list(self): + x = ["serialize this!", 0, "serialize that!", 1, "stop telling me what to serialize", 2] + output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) + assert x == output
