You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2021/06/08 11:19:10 UTC
[tinkerpop] 01/01: TINKERPOP-2578 Coerced set to list for P
within/without in Python
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch TINKERPOP-2578
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 3fc0935b3908f8352aca4d3dbd488187a52da161
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Tue Jun 8 07:17:10 2021 -0400
TINKERPOP-2578 Coerced set to list for P within/without in Python
This change sets up P to better serialize instances to the form expected for different serialization types.
---
CHANGELOG.asciidoc | 1 +
.../io/graphson/GraphSONMapperEmbeddedTypeTest.java | 21 +++++++++++++++++++--
gremlin-python/glv/TraversalSource.template | 4 ++++
.../main/jython/gremlin_python/process/traversal.py | 4 ++++
gremlin-python/src/main/jython/setup.py | 5 ++---
.../jython/tests/structure/io/test_graphsonV3d0.py | 2 ++
6 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 5b3f519..d718640 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -23,6 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
[[release-3-4-12]]
=== TinkerPop 3.4.12 (Release Date: NOT OFFICIALLY RELEASED YET)
+* Coerced single `set` arguments to `P.within` and `P.without` to `list` in Python which serializes to a more expected form for `P` instances.
* Fixed bug in the `vertexLabelKey` validation for `GraphMLWriter` which was inadvertently validating the `edgeLabelKey`.
* Changed `IndexStep` to make it easier for providers to determine the type of indexer being used.
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
index c120224..dd25ec9 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
@@ -48,6 +48,7 @@ import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -385,7 +386,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
}
@Test
- public void shouldHandlePMultiValueAsCollection() throws Exception {
+ public void shouldHandlePMultiValueAsList() throws Exception {
assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
final P o = P.within(Arrays.asList(1,2,3));
@@ -393,8 +394,24 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
}
@Test
+ public void shouldHandlePMultiValueAsSet() throws Exception {
+ assumeThat(version, startsWith("v3"));
+
+ final P o = P.within(new HashSet<>(Arrays.asList(1,2,3)));
+ assertEquals(o, serializeDeserialize(mapper, o, P.class));
+ }
+
+ @Test
+ public void shouldHandlePBetween() throws Exception {
+ assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+
+ final P o = P.between(1, 100);
+ assertEquals(o, serializeDeserialize(mapper, o, P.class));
+ }
+
+ @Test
public void shouldReadPWithJsonArray() throws Exception {
- // for some reason v3 is forgiving about the naked json array - leaving this here for backward compaitiblity,
+ // for some reason v3 is forgiving about the naked json array - leaving this here for backward compatibility,
// but should be a g:List (i think)
assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
diff --git a/gremlin-python/glv/TraversalSource.template b/gremlin-python/glv/TraversalSource.template
index 3b7ee72..24b5307 100644
--- a/gremlin-python/glv/TraversalSource.template
+++ b/gremlin-python/glv/TraversalSource.template
@@ -167,6 +167,8 @@ class P(object):
def within(*args):
if len(args) == 1 and type(args[0]) == list:
return P("within", args[0])
+ elif len(args) == 1 and type(args[0]) == set:
+ return P("within", list(args[0]))
else:
return P("within", list(args))
@@ -174,6 +176,8 @@ class P(object):
def without(*args):
if len(args) == 1 and type(args[0]) == list:
return P("without", args[0])
+ elif len(args) == 1 and type(args[0]) == set:
+ return P("without", list(args[0]))
else:
return P("without", list(args))
diff --git a/gremlin-python/src/main/jython/gremlin_python/process/traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/traversal.py
index ff0d121..212f3d4 100644
--- a/gremlin-python/src/main/jython/gremlin_python/process/traversal.py
+++ b/gremlin-python/src/main/jython/gremlin_python/process/traversal.py
@@ -260,6 +260,8 @@ class P(object):
def within(*args):
if len(args) == 1 and type(args[0]) == list:
return P("within", args[0])
+ elif len(args) == 1 and type(args[0]) == set:
+ return P("within", list(args[0]))
else:
return P("within", list(args))
@@ -267,6 +269,8 @@ class P(object):
def without(*args):
if len(args) == 1 and type(args[0]) == list:
return P("without", args[0])
+ elif len(args) == 1 and type(args[0]) == set:
+ return P("without", list(args[0]))
else:
return P("without", list(args))
diff --git a/gremlin-python/src/main/jython/setup.py b/gremlin-python/src/main/jython/setup.py
index ae4609d..a028549 100644
--- a/gremlin-python/src/main/jython/setup.py
+++ b/gremlin-python/src/main/jython/setup.py
@@ -48,15 +48,14 @@ install_requires = [
'aenum>=1.4.5,<3.0.0',
'tornado>=4.4.1,<6.0',
'six>=1.10.0,<2.0.0',
- 'isodate>=0.6.0,<1.0.0',
- 'pyparsing>=2.4.7,<3.0.0'
+ 'isodate>=0.6.0,<1.0.0'
]
if sys.version_info < (3, 2):
install_requires += ['futures>=3.0.5,<4.0.0']
if sys.version_info < (3, 5):
- install_requires += ['pyparsing>=2.4.6,<3.0.0']
+ install_requires += ['pyparsing>=2.4.7,<3.0.0']
setup(
name='gremlinpython',
diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
index f3948fd..b0628c3 100644
--- a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
+++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
@@ -398,11 +398,13 @@ class TestGraphSONWriter(object):
result = {'@type': 'g:P', '@value': {'predicate': 'within', 'value': {'@type': 'g:List', '@value': [
{"@type": "g:Int32", "@value": 1}, {"@type": "g:Int32", "@value": 2}]}}}
assert result == json.loads(self.graphson_writer.writeObject(P.within([1, 2])))
+ assert result == json.loads(self.graphson_writer.writeObject(P.within({1, 2})))
assert result == json.loads(self.graphson_writer.writeObject(P.within(1, 2)))
result = {'@type': 'g:P', '@value': {'predicate': 'within', 'value': {'@type': 'g:List', '@value': [
{"@type": "g:Int32", "@value": 1}]}}}
assert result == json.loads(self.graphson_writer.writeObject(P.within([1])))
+ assert result == json.loads(self.graphson_writer.writeObject(P.within({1})))
assert result == json.loads(self.graphson_writer.writeObject(P.within(1)))
def test_strategies(self):