From 42070aea2a55021ec7add1145cb29ea22fe732e5 Mon Sep 17 00:00:00 2001 From: Ken Hu <106191785+kenhuuu@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:12:23 -0700 Subject: [PATCH] add initial python model --- .../main/python/tests/structure/io/model.py | 100 ++++++++ .../structure/io/test_graphbinaryv4model.py | 224 ++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 gremlin-python/src/main/python/tests/structure/io/model.py create mode 100644 gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py diff --git a/gremlin-python/src/main/python/tests/structure/io/model.py b/gremlin-python/src/main/python/tests/structure/io/model.py new file mode 100644 index 00000000000..21aa3b11160 --- /dev/null +++ b/gremlin-python/src/main/python/tests/structure/io/model.py @@ -0,0 +1,100 @@ +import datetime +import uuid +from gremlin_python.statics import timestamp, short, long, bigint, BigDecimal, SingleByte, SingleChar, ByteBufferType +from gremlin_python.structure.graph import Vertex, Edge, Property, VertexProperty, Path +from gremlin_python.structure.io.graphbinaryV4 import GraphBinaryWriter, GraphBinaryReader +from gremlin_python.process.traversal import Barrier, Binding, Bytecode, Merge, Direction, Traverser, T +from gremlin_python.structure.io.util import HashableDict, Marker + +unsupported = {"tinker-graph", "max-offsetdatetime", "min-offsetdatetime"} +model = {} + +model["pos-bigdecimal"] = BigDecimal(33, 123456789987654321123456789987654321) +model["neg-bigdecimal"] = BigDecimal(33, -123456789987654321123456789987654321) +model["pos-biginteger"] = bigint(123456789987654321123456789987654321) +model["neg-biginteger"] = bigint(-123456789987654321123456789987654321) +model["min-byte"] = SingleByte(-128) +model["max-byte"] = SingleByte(127) +model["empty-binary"] = ByteBufferType("", "utf8") +model["str-binary"] = ByteBufferType("some bytes for you", "utf8") +model["max-double"] = 1.7976931348623157E308 +model["min-double"] = 4.9E-324 +model["neg-max-double"] = -1.7976931348623157E308 +model["neg-min-double"] = -4.9E-324 +model["nan-double"] = float('nan') +model["pos-inf-double"] = float('inf') +model["neg-inf-double"] = float('-inf') +model["neg-zero-double"] = -0.0 +model["zero-duration"] = datetime.timedelta() +#model["forever-duration"] = datetime.timedelta(seconds=2**63-1, microseconds=999999999) +model["traversal-edge"] = Edge( + 13, + Vertex(1, 'person'), + "develops", + Vertex(10, "software"), + [Property("since", 2009, None)] +) +model["no-prop-edge"] = Edge( + 13, + Vertex(1, 'person'), + "develops", + Vertex(10, "software") +) +model["max-float"] = float(3.4028235E38) +model["min-float"] = float(1.4E-45) +model["neg-max-float"] = float(-3.4028235E38) +model["neg-min-float"] = float(-1.4E-45) +model["nan-float"] = float('nan') +model["pos-inf-float"] = float('inf') +model["neg-inf-float"] = float('-inf') +model["neg-zero-float"] = float(-0.0) +model["max-int"] = 2147483647 +model["min-int"] = -2**31 +model["max-long"] = long(2**63-1) +model["min-long"] = long(-2**63) +model["var-type-list"] = [1, "person", True, None] +model["empty-list"] = [] +model["var-type-map"] = { + "test": 123, + datetime.datetime.fromtimestamp(1481295): "red", + (1,2,3): datetime.datetime.fromtimestamp(1481295), + None: None +} +model["empty-map"] = {} +model["traversal-path"] = Path( + [{}, {}, {}], + [Vertex(1, "person"), Vertex(10, "software"), Vertex(11, "software")] +) +model["empty-path"] = Path([], []) +model["prop-path"] = Path( + [{}, {}, {}], + [ + Vertex(1, "person", VertexProperty( + 123, + "name", + "stephen", + [ + VertexProperty(0, "name", "marko", None), + VertexProperty(6, "location", [], None) + ] + )), + Vertex(10, "software"), + Vertex(11, "software") + ] +) +model["edge-property"] = Property("since", 2009, None) +model["null-property"] = Property("", None, None) +model["var-type-set"] = {1, "person", True, None} +model["empty-set"] = set() +model["max-short"] = short(32767) +model["min-short"] = short(-32768) +# model["vertex-traverser"] +model["bulked-traverser"] = Traverser(Vertex(11, "software", [VertexProperty(5, "name", "tinkergraph", None)]), 7) +model["empty-traverser"] = Traverser(None, 0) +model["specified-uuid"] = uuid.UUID("41d2e28a-20a4-4ab0-b379-d810dede3786") +model["nil-uuid"] = uuid.UUID(int = 0) +#model["traversal-vertex"] +model["no-prop-vertex"] = Vertex(1, "person") +model["id-t"] = T.id +model["out-direction"] = Direction.OUT +#model["zero-date"] = datetime.datetime(1970, 1, 1) \ No newline at end of file diff --git a/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py b/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py new file mode 100644 index 00000000000..3df43450240 --- /dev/null +++ b/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py @@ -0,0 +1,224 @@ +from gremlin_python.structure.io.graphbinaryV4 import GraphBinaryWriter, GraphBinaryReader +from os import environ + +from .model import model, unsupported + +gremlin_test_dir = "gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/graphbinary/" +test_resource_directory = environ.get('IO_TEST_DIRECTORY', '../' + gremlin_test_dir) +writer = GraphBinaryWriter() +reader = GraphBinaryReader() + +def get_entry(title): + return model[title] + +def read_file_by_name(resource_name): + full_name = test_resource_directory + resource_name + "-" + "v4" + ".gbin" + with open(full_name, 'rb') as resource_file: + return bytearray(resource_file.read()) + + +def test_pos_bigdecimal(): + resource_name = "pos-bigdecimal" + resource_bytes = read_file_by_name(resource_name) + + model = get_entry(resource_name) + read = reader.read_object(resource_bytes) + assert model.scale == read.scale + assert model.unscaled_value == read.unscaled_value + + written = writer.write_object(model) + assert resource_bytes == written + +def test_neg_bigdecimal(): + resource_name = "pos-bigdecimal" + resource_bytes = read_file_by_name(resource_name) + + model = get_entry(resource_name) + read = reader.read_object(resource_bytes) + assert model.scale == read.scale + assert model.unscaled_value == read.unscaled_value + + written = writer.write_object(model) + assert resource_bytes == written + +def test_pos_biginteger(): + run("pos-biginteger") + +def test_neg_biginteger(): + run("neg-biginteger") + +def test_min_byte(): + run("min-byte") + +def test_max_byte(): + run("max-byte") + +def test_empty_binary(): + run("empty-binary") + +def test_str_binary(): + run("str-binary") + +def test_max_double(): + run("max-double") + +def test_min_double(): + run("min-double") + +def test_neg_max_double(): + run("neg-max-double") + +def test_neg_min_double(): + run("neg-min-double") + +def test_nan_double(): + run("nan-double") + +def test_pos_inf_double(): + run("pos-inf-double") + +def test_neg_inf_double(): + run("neg-inf-double") + +def test_neg_zero_double(): + run("neg-zero-double") + +def test_zero_duration(): + run("zero-duration") + +#def test_forever_duration(): +# run("forever-duration") + +def test_traversal_edge(): + run("traversal-edge") + +def test_no_prop_edge(): + run("no-prop-edge") + +def test_max_float(): + run("max-float") + +def test_min_float(): + run("min-float") + +def test_neg_max_float(): + run("neg-max-float") + +def test_neg_min_float(): + run("neg-min-float") + +def test_nan_float(): + run("nan-float") + +def test_pos_inf_float(): + run("pos-inf-float") + +def test_neg_inf_float(): + run("neg-inf-float") + +def test_neg_zero_float(): + run("neg-zero-float") + +def test_max_int(): + run("max-int") + +def test_min_int(): + run("min-int") + +def test_max_long(): + run("max-long") + +def test_min_long(): + run("min-long") + +def test_var_type_list(): + run("var-type-list") + +def test_empty_list(): + run("empty-list") + +def test_var_type_map(): + run("var-type-map") + +def test_empty_map(): + run("empty-map") + +def test_max_offsetdatetime(): + run("max-offsetdatetime") + +def test_min_offsetdatetime(): + run("min-offsetdatetime") + +def test_traversal_path(): + run("traversal-path") + +#TODO: come back +def test_empty_path(): + run("empty-path") + +def test_prop_path(): + run("prop-path") + +def test_zero_date(): + run("zero-date") + +def test_edge_property(): + run("edge-property") + +def test_null_property(): + run("null-property") + +def test_var_type_set(): + run("var-type-set") + +def test_empty_set(): + run("empty-set") + +def test_max_short(): + run("max-short") + +def test_min_short(): + run("min-short") + +def test_tinker_graph(): + run("tinker-graph") + +def test_vertex_traverser(): + run("vertex-traverser") + +def test_bulked_traverser(): + run("bulked-traverser") + +def test_empty_traverser(): + run("empty-traverser") + +def test_specified_uuid(): + run("specified-uuid") + +def test_nil_uuid(): + run("nil-uuid") + +def test_no_prop_vertex(): + run("no-prop-vertex") + +def test_id_t(): + run("id-t") + +def test_out_direction(): + run("out-direction") + +def run(resource_name): + if resource_name in unsupported: + return + + resource_bytes = read_file_by_name(resource_name) + + model = get_entry(resource_name) + read = reader.read_object(resource_bytes) + assert model == read + + written = writer.write_object(model) + assert resource_bytes == written + + round_tripped = writer.write_object(reader.read_object(resource_bytes)) + assert resource_bytes == round_tripped \ No newline at end of file