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 6e7a2efbf7090b5113b5f6d060744a6bc148dd29 Author: Stephen Mallette <[email protected]> AuthorDate: Mon Aug 19 15:51:21 2019 -0400 Added SingleChar support to python graphbinary --- .../gremlin_python/structure/io/graphbinaryV1.py | 29 +++++++++++++++++++++- .../tests/structure/io/test_functionalityio.py | 24 ++++++++++++++++++ .../tests/structure/io/test_graphbinaryV1.py | 8 ++++++ 3 files changed, 60 insertions(+), 1 deletion(-) 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 e37ad8e3..b29b3d9 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 @@ -30,7 +30,7 @@ import logging from aenum import Enum from gremlin_python import statics from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, TypeType, DictType, ListType, SetType, \ - SingleByte, ByteBufferType, GremlinType + SingleByte, ByteBufferType, GremlinType, SingleChar from gremlin_python.process.traversal import Barrier, Binding, Bytecode, Cardinality, Column, Direction, Operator, \ Order, Pick, Pop, P, Scope, TextP, Traversal, Traverser, \ TraversalStrategy, T @@ -93,6 +93,7 @@ class DataType(Enum): tree = 0x2b # no tree object in Python yet metrics = 0x2c traversalmetrics = 0x2d + char = 0x80 custom = 0x00 #todo @@ -328,6 +329,31 @@ class DoubleIO(FloatIO): return cls.is_null(buff, reader, lambda b, r: struct.unpack(cls.byte_format, b.read(8))[0], nullable) +class CharIO(_GraphBinaryTypeIO): + python_type = SingleChar + graphbinary_type = DataType.char + + @classmethod + def dictify(cls, obj, writer, as_value=False, nullable=True): + ba = obj.encode("utf-8") + return cls.as_bytes(cls.graphbinary_type, as_value, nullable, ba) + + @classmethod + def objectify(cls, buff, reader, nullable=True): + return cls.is_null(buff, reader, cls._read_char, nullable) + + @classmethod + def _read_char(cls, b, r): + max_bytes = 4 + x = b.read(1) + while max_bytes > 0: + max_bytes = max_bytes - 1 + try: + return x.decode("utf-8") + except UnicodeDecodeError: + x += b.read(1) + + class StringIO(_GraphBinaryTypeIO): python_type = str @@ -963,3 +989,4 @@ class TraversalStrategySerializer(_GraphBinaryTypeIO): @classmethod def _convert(cls, v): return v.bytecode if isinstance(v, Traversal) else v + diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_functionalityio.py b/gremlin-python/src/main/jython/tests/structure/io/test_functionalityio.py index 54dd35e..1aed19a 100644 --- a/gremlin-python/src/main/jython/tests/structure/io/test_functionalityio.py +++ b/gremlin-python/src/main/jython/tests/structure/io/test_functionalityio.py @@ -20,6 +20,7 @@ under the License. import datetime import uuid +from gremlin_python.driver.serializer import GraphSONSerializersV2d0 from gremlin_python.structure.graph import Graph from gremlin_python.statics import * @@ -62,3 +63,26 @@ def test_uuid(remote_connection): assert uid_prop.value == uid finally: g.V(vid).drop().iterate() + + +def test_odd_bits(remote_connection): + if not isinstance(remote_connection._client._message_serializer, GraphSONSerializersV2d0): + g = Graph().traversal().withRemote(remote_connection) + char_lower = str.__new__(SingleChar, chr(78)) + resp = g.addV('test_vertex').property('char_lower', char_lower).toList() + vid = resp[0].id + try: + v = g.V(vid).values('char_lower').toList()[0] + assert v == char_lower + finally: + g.V(vid).drop().iterate() + + if six.PY3: + char_upper = str.__new__(SingleChar, chr(57344)) + resp = g.addV('test_vertex').property('char_upper', char_upper).toList() + vid = resp[0].id + try: + v = g.V(vid).values('char_upper').toList()[0] + assert v == char_upper + finally: + g.V(vid).drop().iterate() 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 917e7f2..4a2a2f3 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 @@ -196,4 +196,12 @@ class TestGraphSONWriter(object): output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) assert x == output + def test_char(self): + x = str.__new__(SingleChar, chr(76)) + output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) + assert x == output + if six.PY3: + x = str.__new__(SingleChar, chr(57344)) + output = self.graphbinary_reader.readObject(self.graphbinary_writer.writeObject(x)) + assert x == output
