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/06/09 15:26:05 UTC

[2/2] incubator-tinkerpop git commit: Have GroovyTranslator implemented and connected with ProcessStandard and ProcessComputer suites. Moved packages around -- now its tinkerpop.gremlin.python -- tinkerpop.gremlin.groovy. Things are looking good.

Have GroovyTranslator implemented and connected with ProcessStandard and ProcessComputer suites. Moved packages around -- now its tinkerpop.gremlin.python -- tinkerpop.gremlin.groovy. Things are looking good.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 97b12a405465ae0730007bd69c187c7a5749ac3d
Parents: 47e7122
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 9 09:26:04 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 9 09:26:04 2016 -0600

----------------------------------------------------------------------
 .../gremlin/process/traversal/dsl/graph/__.java |  15 +-
 .../traversal/util/TranslatorHelper.java        |  48 +++
 .../AbstractImportCustomizerProvider.java       |   1 -
 .../gremlin/groovy/GroovyTranslator.java        | 156 ++++++++
 .../traversal/dsl/graph/GroovyTranslator.java   | 153 --------
 .../python/GremlinPythonGenerator.groovy        | 377 -------------------
 .../python/GremlinPythonGenerator.groovy        | 377 +++++++++++++++++++
 .../variant/python/PythonTranslator.java        | 258 -------------
 .../gremlin/python/PythonTranslator.java        | 222 +++++++++++
 .../tinkerpop/gremlin/VariantGraphProvider.java | 137 +++++++
 .../gremlin/groovy/GroovyComputerProvider.java  |  37 ++
 .../groovy/GroovyProcessComputerTest.java       |  33 ++
 .../groovy/GroovyProcessStandardTest.java       |  33 ++
 .../gremlin/groovy/GroovyProvider.java          |  39 ++
 .../process/variant/VariantGraphProvider.java   | 137 -------
 .../variant/python/PythonComputerProvider.java  |  36 --
 .../python/PythonProcessComputerTest.java       |  34 --
 .../python/PythonProcessStandardTest.java       |  34 --
 .../process/variant/python/PythonProvider.java  |  40 --
 .../gremlin/python/PythonComputerProvider.java  |  37 ++
 .../python/PythonProcessComputerTest.java       |  34 ++
 .../python/PythonProcessStandardTest.java       |  34 ++
 .../gremlin/python/PythonProvider.java          |  75 ++++
 23 files changed, 1274 insertions(+), 1073 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index c4f83da..b3c6241 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -51,7 +51,7 @@ import java.util.function.Supplier;
  */
 public class __ {
 
-    private static Supplier<GraphTraversal> ANONYMOUS_GRAPH_TRAVERSAL = null;
+    private static ThreadLocal<Supplier<GraphTraversal>> ANONYMOUS_GRAPH_TRAVERSAL = null;
 
     protected __() {
     }
@@ -59,11 +59,20 @@ public class __ {
     //////////////////////////////////////////////////////////////////////
 
     public static void setAnonymousGraphTraversalSupplier(final Supplier<GraphTraversal> anonymousGraphTraversalSupplier) {
-        ANONYMOUS_GRAPH_TRAVERSAL = anonymousGraphTraversalSupplier;
+        if (null == ANONYMOUS_GRAPH_TRAVERSAL) {
+            if (null == anonymousGraphTraversalSupplier)
+                return;
+            else
+                ANONYMOUS_GRAPH_TRAVERSAL = ThreadLocal.withInitial(() -> DefaultGraphTraversal::new);
+        }
+        if (null == anonymousGraphTraversalSupplier)
+            ANONYMOUS_GRAPH_TRAVERSAL.remove();
+        else
+            ANONYMOUS_GRAPH_TRAVERSAL.set(anonymousGraphTraversalSupplier);
     }
 
     public static <A> GraphTraversal<A, A> start() {
-        return null == ANONYMOUS_GRAPH_TRAVERSAL ? new DefaultGraphTraversal<>() : ANONYMOUS_GRAPH_TRAVERSAL.get();
+        return null == ANONYMOUS_GRAPH_TRAVERSAL ? new DefaultGraphTraversal<>() : ANONYMOUS_GRAPH_TRAVERSAL.get().get();
     }
 
     public static <A> GraphTraversal<A, A> __(final A... starts) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
new file mode 100644
index 0000000..4a58dcd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TranslatorHelper {
+
+    private TranslatorHelper() {
+        // static methods only so don't allow construction
+    }
+
+    public static List<Object> flattenArguments(final Object... arguments) {
+        if (arguments.length == 0)
+            return Collections.emptyList();
+        final List<Object> flatArguments = new ArrayList<>();
+        for (final Object object : arguments) {
+            if (object instanceof Object[]) {
+                Collections.addAll(flatArguments, (Object[]) object);
+            } else
+                flatArguments.add(object);
+        }
+        return flatArguments;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 11400ba..61884b1 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -23,7 +23,6 @@ import groovy.json.JsonBuilder;
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.groovy.function.GFunction;
 import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader;
-import org.apache.tinkerpop.gremlin.groovy.process.traversal.dsl.graph.GroovyTranslator;
 import org.apache.tinkerpop.gremlin.process.computer.Computer;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.bulkdumping.BulkDumperVertexProgram;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
new file mode 100644
index 0000000..379c361
--- /dev/null
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
@@ -0,0 +1,156 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.groovy;
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GroovyTranslator implements Translator<GraphTraversal> {
+
+    private StringBuilder traversalScript;
+    private final String alias;
+
+    public GroovyTranslator(final String alias) {
+        this.alias = alias;
+        this.traversalScript = new StringBuilder(this.alias);
+
+    }
+
+    @Override
+    public String getScriptEngine() {
+        return "gremlin-groovy";
+    }
+
+    @Override
+    public String getAlias() {
+        return this.alias;
+    }
+
+    @Override
+    public void addStep(final String stepName, final Object... arguments) {
+        final List<Object> objects = TranslatorHelper.flattenArguments(arguments);
+        if (objects.isEmpty())
+            this.traversalScript.append(".").append(stepName).append("()");
+        else {
+            this.traversalScript.append(".");
+            String temp = stepName + "(";
+            for (final Object object : objects) {
+                temp = temp + convertToString(object) + ",";
+            }
+            this.traversalScript.append(temp.substring(0, temp.length() - 1) + ")");
+        }
+    }
+
+    @Override
+    public GraphTraversal __() {
+        return new ScriptGraphTraversal(EmptyGraph.instance(), new GroovyTranslator("__"));
+    }
+
+    @Override
+    public String getTraversalScript() {
+        final String traversal = this.traversalScript.toString();
+        if (traversal.contains("$"))
+            throw new VerificationException("Lambdas are currently not supported: " + traversal, EmptyTraversal.instance());
+        return traversal;
+    }
+
+    @Override
+    public GroovyTranslator clone() {
+        try {
+            final GroovyTranslator clone = (GroovyTranslator) super.clone();
+            clone.traversalScript = new StringBuilder(this.traversalScript);
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    public static final GroovyTranslator of(final String alias) {
+        return new GroovyTranslator(alias);
+    }
+
+    ///////
+
+    private static String convertToString(final Object object) {
+        if (object instanceof String)
+            return "\"" + object + "\"";
+        else if (object instanceof List) {
+            final List<String> list = new ArrayList<>(((List) object).size());
+            for (final Object item : (List) object) {
+                list.add(convertToString(item));
+            }
+            return list.toString();
+        } else if (object instanceof Long)
+            return object + "L";
+        else if (object instanceof Double)
+            return object + "d";
+        else if (object instanceof Float)
+            return object + "f";
+        else if (object instanceof Integer)
+            return "(int) " + object;
+        else if (object instanceof Class)
+            return ((Class) object).getCanonicalName();
+        else if (object instanceof P)
+            return convertPToString((P) object, new StringBuilder()).toString();
+        else if (object instanceof SackFunctions.Barrier)
+            return "SackFunctions.Barrier." + object.toString();
+        else if (object instanceof VertexProperty.Cardinality)
+            return "VertexProperty.Cardinality." + object.toString();
+        else if (object instanceof Enum)
+            return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
+        else if (object instanceof Element)
+            return convertToString(((Element) object).id()); // hack
+        else if (object instanceof ScriptGraphTraversal)
+            return ((ScriptGraphTraversal) object).getTraversalScript();
+        else
+            return null == object ? "null" : object.toString();
+    }
+
+    private static StringBuilder convertPToString(final P p, final StringBuilder current) {
+        if (p instanceof ConnectiveP) {
+            final List<P<?>> list = ((ConnectiveP) p).getPredicates();
+            for (int i = 0; i < list.size(); i++) {
+                convertPToString(list.get(i), current);
+                if (i < list.size() - 1)
+                    current.append(p instanceof OrP ? ".or(" : ".and(");
+            }
+            current.append(")");
+        } else
+            current.append("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+        return current;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
deleted file mode 100644
index 639fa04..0000000
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.tinkerpop.gremlin.groovy.process.traversal.dsl.graph;
-
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GroovyTranslator implements Translator<GraphTraversal> {
-
-    private StringBuilder traversalScript;
-    private final String alias;
-
-    public GroovyTranslator(final String alias) {
-        this.alias = alias;
-        this.traversalScript = new StringBuilder(this.alias);
-
-    }
-
-    @Override
-    public String getScriptEngine() {
-        return "gremlin-groovy";
-    }
-
-    @Override
-    public String getAlias() {
-        return this.alias;
-    }
-
-    @Override
-    public void addStep(final String stepName, final Object... arguments) {
-        // flatten the arguments into a single array
-        final Object[] objects = Stream.of(arguments)
-                .flatMap(arg ->
-                        IteratorUtils.stream(arg instanceof Object[] ?
-                                new ArrayIterator<>((Object[]) arg) :
-                                IteratorUtils.of(arg)))
-                .toArray();
-        if (objects.length == 0)
-            this.traversalScript.append(".").append(stepName).append("()");
-        else {
-            this.traversalScript.append(".");
-            String temp = stepName + "(";
-            for (final Object object : objects) {
-                temp = temp + convertToString(object) + ",";
-            }
-            this.traversalScript.append(temp.substring(0, temp.length() - 1) + ")");
-        }
-    }
-
-    @Override
-    public GraphTraversal __() {
-        return new ScriptGraphTraversal(EmptyGraph.instance(), new GroovyTranslator("__"));
-    }
-
-    @Override
-    public String getTraversalScript() {
-        return this.traversalScript.toString();
-    }
-
-    @Override
-    public GroovyTranslator clone() {
-        try {
-            final GroovyTranslator clone = (GroovyTranslator) super.clone();
-            clone.traversalScript = new StringBuilder(this.traversalScript);
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    public static final GroovyTranslator of(final String alias) {
-        return new GroovyTranslator(alias);
-    }
-
-    ///////
-
-    private static String convertToString(final Object object) {
-        if (object instanceof String)
-            return "\"" + object + "\"";
-        else if (object instanceof List) {
-            final List list = new ArrayList<>(((List) object).size());
-            for (final Object item : (List) object) {
-                list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
-            }
-            return list.toString();
-        } else if (object instanceof Long)
-            return object + "L";
-        else if (object instanceof Double)
-            return object + "d";
-        else if (object instanceof Float)
-            return object + "f";
-        else if (object instanceof Integer)
-            return "(int) " + object;
-        else if (object instanceof Class)
-            return ((Class) object).getCanonicalName();
-        else if (object instanceof P)
-            return convertPToString((P) object, new StringBuilder()).toString();
-        else if (object instanceof Enum)
-            return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
-        else if (object instanceof Element)
-            return convertToString(((Element) object).id()); // hack
-        else if (object instanceof ScriptGraphTraversal)
-            return ((ScriptGraphTraversal) object).getTraversalScript();
-        else
-            return null == object ? "null" : object.toString();
-    }
-
-    private static StringBuilder convertPToString(final P p, final StringBuilder current) {
-        if (p instanceof ConnectiveP) {
-            final List<P<?>> list = ((ConnectiveP) p).getPredicates();
-            for (int i = 0; i < list.size(); i++) {
-                convertPToString(list.get(i), current);
-                if (i < list.size() - 1)
-                    current.append(p instanceof OrP ? "._or(" : "._and(");
-            }
-            current.append(")");
-        } else
-            current.append("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
-        return current;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
deleted file mode 100644
index 882c6fc..0000000
--- a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tinkerpop.gremlin.process.variant.python
-
-import org.apache.tinkerpop.gremlin.process.computer.Computer
-import org.apache.tinkerpop.gremlin.process.traversal.Operator
-import org.apache.tinkerpop.gremlin.process.traversal.Order
-import org.apache.tinkerpop.gremlin.process.traversal.P
-import org.apache.tinkerpop.gremlin.process.traversal.Pop
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions
-import org.apache.tinkerpop.gremlin.process.traversal.Scope
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy
-import org.apache.tinkerpop.gremlin.structure.Column
-import org.apache.tinkerpop.gremlin.structure.Direction
-import org.apache.tinkerpop.gremlin.structure.T
-import org.apache.tinkerpop.gremlin.structure.VertexProperty
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-class GremlinPythonGenerator {
-
-    public static void create(final String gremlinPythonFile) {
-
-        final StringBuilder pythonClass = new StringBuilder()
-
-        pythonClass.append("""'''
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-'''
-""")
-
-        final Map<String, String> methodMap = [global: "_global", as: "_as", in: "_in", and: "_and", or: "_or", is: "_is", not: "_not", from: "_from"]
-                .withDefault { it }
-        final Map<String, String> invertedMethodMap = [:].withDefault { it };
-        methodMap.entrySet().forEach { invertedMethodMap.put(it.value, it.key) }
-
-        final List<String> NO_QUOTE = [VertexProperty.Cardinality, Column, Direction, Operator, Order, P, Pop, Scope, SackFunctions.Barrier, T,
-                                       ReadOnlyStrategy, Computer]
-                .collect { it.getSimpleName() }.unique().sort { a, b -> a <=> b };
-        final Map<String, String> enumMap = [Cardinality: "VertexProperty.Cardinality", Barrier: "SackFunctions.Barrier"]
-                .withDefault { it }
-
-        pythonClass.append("from collections import OrderedDict\n")
-        pythonClass.append("import inspect\n\n")
-        pythonClass.append("statics = OrderedDict()\n\n")
-        pythonClass.append("""
-class B(object):
-  def __init__(self, symbol, value="~empty"):
-    self.symbol = symbol
-    if value == "~empty":
-      self.value = inspect.currentframe().f_back.f_locals[symbol]
-    else:
-      self.value = value
-  def __repr__(self):
-    return self.symbol
-
-class Helper(object):
-  @staticmethod
-  def stringOrObject(arg):
-    if (type(arg) is str and
-""")
-        NO_QUOTE.forEach { pythonClass.append("      not(arg.startswith(\"${enumMap[it]}.\")) and\n") }
-        pythonClass.append("      not(len(arg)==0)):\n")
-        pythonClass.append("""         return "\\"" + arg + "\\""
-    elif type(arg) is bool:
-      return str(arg).lower()
-    elif type(arg) is long:
-      return str(arg) + "L"
-    elif type(arg) is float:
-      return str(arg) + "f"
-    else:
-      return str(arg)
-  @staticmethod
-  def stringify(*args):
-    if len(args) == 0:
-      return ""
-    elif len(args) == 1:
-      return Helper.stringOrObject(args[0])
-    else:
-      return ", ".join(Helper.stringOrObject(i) for i in args)
-""").append("\n\n");
-
-//////////////////////////
-// GraphTraversalSource //
-//////////////////////////
-        pythonClass.append(
-                """class PythonGraphTraversalSource(object):
-  def __init__(self, traversal_source_string, remote_connection=None):
-    self.traversal_source_string = traversal_source_string
-    self.remote_connection = remote_connection
-  def __repr__(self):
-    if self.remote_connection is None:
-      return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
-    else:
-      return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
-""")
-        GraphTraversalSource.getMethods()
-                .collect { it.name }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .each { method ->
-            final Class<?> returnType = (GraphTraversalSource.getMethods() as Set).findAll {
-                it.name.equals(method)
-            }.collect {
-                it.returnType
-            }[0]
-            if (null != returnType) {
-                if (Traversal.isAssignableFrom(returnType)) {
-                    pythonClass.append(
-                            """  def ${method}(self, *args):
-    return PythonGraphTraversal(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
-""")
-                } else if (TraversalSource.isAssignableFrom(returnType)) {
-                    pythonClass.append(
-                            """  def ${method}(self, *args):
-    return PythonGraphTraversalSource(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
-""")
-                }
-            }
-        }
-        pythonClass.append("\n\n")
-
-////////////////////
-// GraphTraversal //
-////////////////////
-        pythonClass.append(
-                """class PythonGraphTraversal(object):
-  def __init__(self, traversal_string, remote_connection=None):
-    self.traversal_string = traversal_string
-    self.remote_connection = remote_connection
-    self.results = None
-    self.last_traverser = None
-    self.bindings = {}
-  def __repr__(self):
-    return self.traversal_string
-  def __getitem__(self,index):
-    if type(index) is int:
-      return self.range(index,index+1)
-    elif type(index) is slice:
-      return self.range(index.start,index.stop)
-    else:
-      raise TypeError("Index must be int or slice")
-  def __getattr__(self,key):
-    return self.values(key)
-  def __iter__(self):
-        return self
-  def toList(self):
-    return list(iter(self))
-  def next(self):
-     if self.results is None:
-        self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
-     if self.last_traverser is None:
-         self.last_traverser = self.results.next()
-     object = self.last_traverser.object
-     self.last_traverser.bulk = self.last_traverser.bulk - 1
-     if self.last_traverser.bulk <= 0:
-         self.last_traverser = None
-     return object
-""")
-        GraphTraversal.getMethods()
-                .collect { methodMap[it.name] }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .each { method ->
-            final Class<?> returnType = (GraphTraversal.getMethods() as Set).findAll {
-                it.name.equals(invertedMethodMap[method])
-            }.collect { it.returnType }[0]
-            if (null != returnType && Traversal.isAssignableFrom(returnType)) {
-                pythonClass.append(
-                        """  def ${method}(self, *args):
-    self.traversal_string = self.traversal_string + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
-    for arg in args:
-      if type(arg) is B:
-        self.bindings[arg.symbol] = arg.value
-    return self
-""")
-            }
-        };
-        pythonClass.append("\n\n")
-
-////////////////////////
-// AnonymousTraversal //
-////////////////////////
-        pythonClass.append("class __(object):\n");
-        __.getMethods()
-                .findAll { Traversal.isAssignableFrom(it.returnType) }
-                .collect { methodMap[it.name] }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .each { method ->
-            pythonClass.append(
-                    """  @staticmethod
-  def ${method}(*args):
-    return PythonGraphTraversal("__").${method}(*args)
-""")
-        };
-        pythonClass.append("\n\n")
-
-        __.class.getMethods()
-                .findAll { Traversal.class.isAssignableFrom(it.getReturnType()) }
-                .findAll { !it.name.equals("__") }
-                .collect { methodMap[it.name] }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .forEach {
-            pythonClass.append("def ${it}(*args):\n").append("      return __.${it}(*args)\n\n")
-            pythonClass.append("statics['${it}'] = ${it}\n")
-        }
-        pythonClass.append("\n\n")
-
-///////////
-// Enums //
-///////////
-        pythonClass.append("class Cardinality(object):\n");
-        VertexProperty.Cardinality.values().each { value ->
-            pythonClass.append("   ${value} = \"VertexProperty.Cardinality.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("class Column(object):\n");
-        Column.values().each { value ->
-            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Column.values().each { value ->
-            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("class Direction(object):\n");
-        Direction.values().each { value ->
-            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Direction.values().each { value ->
-            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("class Operator(object):\n");
-        Operator.values().each { value ->
-            pythonClass.append("   ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Operator.values().each { value ->
-            pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("class Order(object):\n");
-        Order.values().each { value ->
-            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Order.values().each { value ->
-            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-
-        pythonClass.append("""class P(object):
-   def __init__(self, pString):
-      self.pString = pString
-   def __repr__(self):
-      return self.pString
-""")
-        P.getMethods()
-                .findAll { P.class.isAssignableFrom(it.returnType) }
-                .findAll { !it.name.equals("or") && !it.name.equals("and") }
-                .collect { methodMap[it.name] }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .each { method ->
-            pythonClass.append(
-                    """   @staticmethod
-   def ${method}(*args):
-      return P("P.${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")")
-""")
-        };
-        pythonClass.append("""   def _and(self, arg):
-      return P(self.pString + ".and(" + Helper.stringify(arg) + ")")
-   def _or(self, arg):
-      return P(self.pString + ".or(" + Helper.stringify(arg) + ")")
-""")
-        pythonClass.append("\n")
-        P.class.getMethods()
-                .findAll { P.class.isAssignableFrom(it.getReturnType()) }
-                .collect { methodMap[it.name] }
-                .unique()
-                .sort { a, b -> a <=> b }
-                .forEach {
-            pythonClass.append("def ${it}(*args):\n").append("      return P.${it}(*args)\n\n")
-            pythonClass.append("statics['${it}'] = ${it}\n")
-        }
-        pythonClass.append("\n")
-        //////////////
-        pythonClass.append("class Pop(object):\n");
-        Pop.values().each { value ->
-            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Pop.values().each { value ->
-            pythonClass.append("statics['${value}'] =  ${value.getDeclaringClass().getSimpleName()}.${value.name()}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("""class Barrier(object):
-   normSack = "SackFunctions.Barrier.normSack"
-""");
-        pythonClass.append("\n")
-        pythonClass.append("statics['normSack'] = Barrier.normSack\n\n")
-        //////////////
-        pythonClass.append("class Scope(object):\n");
-        Scope.values().each { value ->
-            pythonClass.append("   ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        Scope.values().each { value ->
-            pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
-        }
-        pythonClass.append("\n");
-        //////////////
-        pythonClass.append("class T(object):\n");
-        T.values().each { value ->
-            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
-        }
-        pythonClass.append("\n");
-        T.values().each { value ->
-            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
-        }
-        pythonClass.append("\n");
-
-        pythonClass.append("statics = OrderedDict(reversed(list(statics.items())))\n")
-
-// save to a python file
-        final File file = new File(gremlinPythonFile);
-        file.delete()
-        pythonClass.eachLine { file.append(it + "\n") }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
new file mode 100644
index 0000000..f35c888
--- /dev/null
+++ b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
@@ -0,0 +1,377 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.python
+
+import org.apache.tinkerpop.gremlin.process.computer.Computer
+import org.apache.tinkerpop.gremlin.process.traversal.Operator
+import org.apache.tinkerpop.gremlin.process.traversal.Order
+import org.apache.tinkerpop.gremlin.process.traversal.P
+import org.apache.tinkerpop.gremlin.process.traversal.Pop
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy
+import org.apache.tinkerpop.gremlin.structure.Column
+import org.apache.tinkerpop.gremlin.structure.Direction
+import org.apache.tinkerpop.gremlin.structure.T
+import org.apache.tinkerpop.gremlin.structure.VertexProperty
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+class GremlinPythonGenerator {
+
+    public static void create(final String gremlinPythonFile) {
+
+        final StringBuilder pythonClass = new StringBuilder()
+
+        pythonClass.append("""'''
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+'''
+""")
+
+        final Map<String, String> methodMap = [global: "_global", as: "_as", in: "_in", and: "_and", or: "_or", is: "_is", not: "_not", from: "_from"]
+                .withDefault { it }
+        final Map<String, String> invertedMethodMap = [:].withDefault { it };
+        methodMap.entrySet().forEach { invertedMethodMap.put(it.value, it.key) }
+
+        final List<String> NO_QUOTE = [VertexProperty.Cardinality, Column, Direction, Operator, Order, P, Pop, Scope, SackFunctions.Barrier, T,
+                                       ReadOnlyStrategy, Computer]
+                .collect { it.getSimpleName() }.unique().sort { a, b -> a <=> b };
+        final Map<String, String> enumMap = [Cardinality: "VertexProperty.Cardinality", Barrier: "SackFunctions.Barrier"]
+                .withDefault { it }
+
+        pythonClass.append("from collections import OrderedDict\n")
+        pythonClass.append("import inspect\n\n")
+        pythonClass.append("statics = OrderedDict()\n\n")
+        pythonClass.append("""
+class B(object):
+  def __init__(self, symbol, value="~empty"):
+    self.symbol = symbol
+    if value == "~empty":
+      self.value = inspect.currentframe().f_back.f_locals[symbol]
+    else:
+      self.value = value
+  def __repr__(self):
+    return self.symbol
+
+class Helper(object):
+  @staticmethod
+  def stringOrObject(arg):
+    if (type(arg) is str and
+""")
+        NO_QUOTE.forEach { pythonClass.append("      not(arg.startswith(\"${enumMap[it]}.\")) and\n") }
+        pythonClass.append("      not(len(arg)==0)):\n")
+        pythonClass.append("""         return "\\"" + arg + "\\""
+    elif type(arg) is bool:
+      return str(arg).lower()
+    elif type(arg) is long:
+      return str(arg) + "L"
+    elif type(arg) is float:
+      return str(arg) + "f"
+    else:
+      return str(arg)
+  @staticmethod
+  def stringify(*args):
+    if len(args) == 0:
+      return ""
+    elif len(args) == 1:
+      return Helper.stringOrObject(args[0])
+    else:
+      return ", ".join(Helper.stringOrObject(i) for i in args)
+""").append("\n\n");
+
+//////////////////////////
+// GraphTraversalSource //
+//////////////////////////
+        pythonClass.append(
+                """class PythonGraphTraversalSource(object):
+  def __init__(self, traversal_source_string, remote_connection=None):
+    self.traversal_source_string = traversal_source_string
+    self.remote_connection = remote_connection
+  def __repr__(self):
+    if self.remote_connection is None:
+      return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
+    else:
+      return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
+""")
+        GraphTraversalSource.getMethods()
+                .collect { it.name }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .each { method ->
+            final Class<?> returnType = (GraphTraversalSource.getMethods() as Set).findAll {
+                it.name.equals(method)
+            }.collect {
+                it.returnType
+            }[0]
+            if (null != returnType) {
+                if (Traversal.isAssignableFrom(returnType)) {
+                    pythonClass.append(
+                            """  def ${method}(self, *args):
+    return PythonGraphTraversal(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
+""")
+                } else if (TraversalSource.isAssignableFrom(returnType)) {
+                    pythonClass.append(
+                            """  def ${method}(self, *args):
+    return PythonGraphTraversalSource(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
+""")
+                }
+            }
+        }
+        pythonClass.append("\n\n")
+
+////////////////////
+// GraphTraversal //
+////////////////////
+        pythonClass.append(
+                """class PythonGraphTraversal(object):
+  def __init__(self, traversal_string, remote_connection=None):
+    self.traversal_string = traversal_string
+    self.remote_connection = remote_connection
+    self.results = None
+    self.last_traverser = None
+    self.bindings = {}
+  def __repr__(self):
+    return self.traversal_string
+  def __getitem__(self,index):
+    if type(index) is int:
+      return self.range(index,index+1)
+    elif type(index) is slice:
+      return self.range(index.start,index.stop)
+    else:
+      raise TypeError("Index must be int or slice")
+  def __getattr__(self,key):
+    return self.values(key)
+  def __iter__(self):
+        return self
+  def toList(self):
+    return list(iter(self))
+  def next(self):
+     if self.results is None:
+        self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
+     if self.last_traverser is None:
+         self.last_traverser = self.results.next()
+     object = self.last_traverser.object
+     self.last_traverser.bulk = self.last_traverser.bulk - 1
+     if self.last_traverser.bulk <= 0:
+         self.last_traverser = None
+     return object
+""")
+        GraphTraversal.getMethods()
+                .collect { methodMap[it.name] }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .each { method ->
+            final Class<?> returnType = (GraphTraversal.getMethods() as Set).findAll {
+                it.name.equals(invertedMethodMap[method])
+            }.collect { it.returnType }[0]
+            if (null != returnType && Traversal.isAssignableFrom(returnType)) {
+                pythonClass.append(
+                        """  def ${method}(self, *args):
+    self.traversal_string = self.traversal_string + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
+    return self
+""")
+            }
+        };
+        pythonClass.append("\n\n")
+
+////////////////////////
+// AnonymousTraversal //
+////////////////////////
+        pythonClass.append("class __(object):\n");
+        __.getMethods()
+                .findAll { Traversal.isAssignableFrom(it.returnType) }
+                .collect { methodMap[it.name] }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .each { method ->
+            pythonClass.append(
+                    """  @staticmethod
+  def ${method}(*args):
+    return PythonGraphTraversal("__").${method}(*args)
+""")
+        };
+        pythonClass.append("\n\n")
+
+        __.class.getMethods()
+                .findAll { Traversal.class.isAssignableFrom(it.getReturnType()) }
+                .findAll { !it.name.equals("__") }
+                .collect { methodMap[it.name] }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .forEach {
+            pythonClass.append("def ${it}(*args):\n").append("      return __.${it}(*args)\n\n")
+            pythonClass.append("statics['${it}'] = ${it}\n")
+        }
+        pythonClass.append("\n\n")
+
+///////////
+// Enums //
+///////////
+        pythonClass.append("class Cardinality(object):\n");
+        VertexProperty.Cardinality.values().each { value ->
+            pythonClass.append("   ${value} = \"VertexProperty.Cardinality.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("class Column(object):\n");
+        Column.values().each { value ->
+            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Column.values().each { value ->
+            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("class Direction(object):\n");
+        Direction.values().each { value ->
+            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Direction.values().each { value ->
+            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("class Operator(object):\n");
+        Operator.values().each { value ->
+            pythonClass.append("   ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Operator.values().each { value ->
+            pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("class Order(object):\n");
+        Order.values().each { value ->
+            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Order.values().each { value ->
+            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+
+        pythonClass.append("""class P(object):
+   def __init__(self, pString):
+      self.pString = pString
+   def __repr__(self):
+      return self.pString
+""")
+        P.getMethods()
+                .findAll { P.class.isAssignableFrom(it.returnType) }
+                .findAll { !it.name.equals("or") && !it.name.equals("and") }
+                .collect { methodMap[it.name] }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .each { method ->
+            pythonClass.append(
+                    """   @staticmethod
+   def ${method}(*args):
+      return P("P.${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")")
+""")
+        };
+        pythonClass.append("""   def _and(self, arg):
+      return P(self.pString + ".and(" + Helper.stringify(arg) + ")")
+   def _or(self, arg):
+      return P(self.pString + ".or(" + Helper.stringify(arg) + ")")
+""")
+        pythonClass.append("\n")
+        P.class.getMethods()
+                .findAll { P.class.isAssignableFrom(it.getReturnType()) }
+                .collect { methodMap[it.name] }
+                .unique()
+                .sort { a, b -> a <=> b }
+                .forEach {
+            pythonClass.append("def ${it}(*args):\n").append("      return P.${it}(*args)\n\n")
+            pythonClass.append("statics['${it}'] = ${it}\n")
+        }
+        pythonClass.append("\n")
+        //////////////
+        pythonClass.append("class Pop(object):\n");
+        Pop.values().each { value ->
+            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Pop.values().each { value ->
+            pythonClass.append("statics['${value}'] =  ${value.getDeclaringClass().getSimpleName()}.${value.name()}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("""class Barrier(object):
+   normSack = "SackFunctions.Barrier.normSack"
+""");
+        pythonClass.append("\n")
+        pythonClass.append("statics['normSack'] = Barrier.normSack\n\n")
+        //////////////
+        pythonClass.append("class Scope(object):\n");
+        Scope.values().each { value ->
+            pythonClass.append("   ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        Scope.values().each { value ->
+            pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
+        }
+        pythonClass.append("\n");
+        //////////////
+        pythonClass.append("class T(object):\n");
+        T.values().each { value ->
+            pythonClass.append("   ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+        }
+        pythonClass.append("\n");
+        T.values().each { value ->
+            pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+        }
+        pythonClass.append("\n");
+
+        pythonClass.append("statics = OrderedDict(reversed(list(statics.items())))\n")
+
+// save to a python file
+        final File file = new File(gremlinPythonFile);
+        file.delete()
+        pythonClass.eachLine { file.append(it + "\n") }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
deleted file mode 100644
index 3a0dbee..0000000
--- a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.tinkerpop.gremlin.process.variant.python;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
-import org.apache.tinkerpop.gremlin.structure.Column;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import javax.script.Bindings;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PythonTranslator implements Translator<GraphTraversal> {
-
-    private static boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
-    private static ScriptEngine JYTHON_ENGINE;
-    private static boolean IMPORT_STATICS = false;
-    ////
-    private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
-    private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
-    private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
-            .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
-            .map(arg -> ((Enum) arg).name())
-            .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
-
-    static {
-        if (isTesting) {
-            IMPORT_STATICS = new Random().nextBoolean();
-            try {
-                final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
-                final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
-                final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
-                final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
-                GremlinPythonGenerator.create(gremlinPythonModuleName);
-                JYTHON_ENGINE = ScriptEngineCache.get("jython");
-                JYTHON_ENGINE.eval("import sys");
-                JYTHON_ENGINE.eval("sys.path.append('" + gremlinPythonPackageName + "')");
-                JYTHON_ENGINE.eval("sys.path.append('" + gremlinDriverPackageName + "')");
-                JYTHON_ENGINE.eval("from gremlin_python import *");
-                JYTHON_ENGINE.eval("from gremlin_python import __");
-                if (IMPORT_STATICS)
-                    JYTHON_ENGINE.eval("for k in statics:\n  globals()[k] = statics[k]");
-            } catch (final ScriptException e) {
-                throw new IllegalStateException(e.getMessage(), e);
-            }
-        }
-    }
-
-    private StringBuilder traversalScript;
-    private final String alias;
-    private final String scriptEngine;
-
-    public PythonTranslator(final String scriptEngine, final String alias) {
-        this.scriptEngine = scriptEngine;
-        this.alias = alias;
-        this.traversalScript = new StringBuilder(this.alias);
-    }
-
-    @Override
-    public String getAlias() {
-        return this.alias;
-    }
-
-    @Override
-    public String getScriptEngine() {
-        return this.scriptEngine;
-    }
-
-    @Override
-    public GraphTraversal __() {
-        return new ScriptGraphTraversal(EmptyGraph.instance(), new PythonTranslator(this.scriptEngine, "__"));
-    }
-
-    @Override
-    public String getTraversalScript() {
-        if (isTesting && !this.alias.equals("__")) {
-            try {
-                if (traversalScript.toString().contains("$"))
-                    throw new VerificationException("Lambdas are currently not supported: " + this.traversalScript.toString(), EmptyTraversal.instance());
-
-                final Bindings jythonBindings = new SimpleBindings();
-                jythonBindings.put(this.alias, JYTHON_ENGINE.eval("PythonGraphTraversalSource(\"" + this.alias + "\", None)"));
-                JYTHON_ENGINE.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
-                return JYTHON_ENGINE.eval(this.traversalScript.toString()).toString();
-            } catch (final ScriptException e) {
-                throw new IllegalArgumentException(e.getMessage(), e);
-            }
-        } else {
-            return this.traversalScript.toString();
-        }
-    }
-
-    @Override
-    public void addStep(final String stepName, final Object... arguments) {
-        // flatten the arguments into a single array
-        final Object[] objects = Stream.of(arguments)
-                .flatMap(arg ->
-                        IteratorUtils.stream(arg instanceof Object[] ?
-                                new ArrayIterator<>((Object[]) arg) :
-                                IteratorUtils.of(arg)))
-                .toArray();
-        if (objects.length == 0)
-            this.traversalScript.append(".").append(convertStepName(stepName)).append("()");
-        else if (stepName.equals("range") && 2 == objects.length)
-            this.traversalScript.append("[").append(objects[0]).append(":").append(objects[1]).append("]");
-        else if (stepName.equals("limit") && 1 == objects.length)
-            this.traversalScript.append("[0:").append(objects[0]).append("]");
-        else if (stepName.equals("values") && 1 == objects.length && !traversalScript.toString().equals("__") && !STEP_NAMES.contains(objects[0].toString()))
-            this.traversalScript.append(".").append(objects[0]);
-        else {
-            this.traversalScript.append(".");
-            String temp = convertStepName(stepName) + "(";
-            for (final Object object : objects) {
-                temp = temp + convertToString(object) + ",";
-            }
-            this.traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
-        }
-        if (IMPORT_STATICS && this.traversalScript.toString().startsWith("__.")
-                && !NO_STATIC.stream().filter(name -> this.traversalScript.toString().contains(name)).findAny().isPresent())
-            traversalScript.delete(0, 3);
-        if (isTesting && !IMPORT_STATICS)
-            assert this.traversalScript.toString().startsWith(this.alias + ".");
-    }
-
-    @Override
-    public PythonTranslator clone() {
-        try {
-            final PythonTranslator clone = (PythonTranslator) super.clone();
-            clone.traversalScript = new StringBuilder(this.traversalScript);
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    ///////
-
-    private static String convertToString(final Object object) {
-        if (object instanceof String)
-            return "\"" + object + "\"";
-        else if (object instanceof List) {
-            final List list = new ArrayList<>(((List) object).size());
-            for (final Object item : (List) object) {
-                list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
-            }
-            return list.toString();
-        } else if (object instanceof Long)
-            return object + "L";
-        else if (object instanceof Class)
-            return ((Class) object).getCanonicalName();
-        else if (object instanceof SackFunctions.Barrier)
-            return convertStatic("Barrier.") + object.toString();
-        else if (object instanceof VertexProperty.Cardinality)
-            return "Cardinality." + object.toString();
-        else if (object instanceof Direction)
-            return convertStatic("Direction.") + object.toString();
-        else if (object instanceof Operator)
-            return convertStatic("Operator.") + convertStepName(object.toString()); // to catch and/or
-        else if (object instanceof Pop)
-            return convertStatic("Pop.") + object.toString();
-        else if (object instanceof Column)
-            return convertStatic("Column.") + object.toString();
-        else if (object instanceof P)
-            return convertPToString((P) object, new StringBuilder()).toString();
-        else if (object instanceof T)
-            return convertStatic("T.") + object.toString();
-        else if (object instanceof Order)
-            return convertStatic("Order.") + object.toString();
-        else if (object instanceof Scope)
-            return convertStatic("Scope.") + convertStepName(object.toString()); // to catch global
-        else if (object instanceof Element)
-            return convertToString(((Element) object).id()); // hack
-        else if (object instanceof ScriptGraphTraversal)
-            return ((ScriptGraphTraversal) object).getTraversalScript().toString();
-        else if (object instanceof Boolean)
-            return object.equals(Boolean.TRUE) ? "True" : "False";
-        else
-            return null == object ? "" : object.toString();
-    }
-
-    private static String convertStatic(final String name) {
-        return IMPORT_STATICS ? "" : name;
-    }
-
-    private static String convertStepName(final String stepName) {
-        if (PREFIX_NAMES.contains(stepName))
-            return "_" + stepName;
-        else
-            return stepName;
-    }
-
-    private static StringBuilder convertPToString(final P p, final StringBuilder current) {
-        if (p instanceof ConnectiveP) {
-            final List<P<?>> list = ((ConnectiveP) p).getPredicates();
-            for (int i = 0; i < list.size(); i++) {
-                convertPToString(list.get(i), current);
-                if (i < list.size() - 1)
-                    current.append(p instanceof OrP ? "._or(" : "._and(");
-            }
-            current.append(")");
-        } else
-            current.append(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
-        return current;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
new file mode 100644
index 0000000..9344ecc
--- /dev/null
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
@@ -0,0 +1,222 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.python;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PythonTranslator implements Translator<GraphTraversal> {
+
+    private static boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
+    ////
+    private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
+    private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
+    private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
+            .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
+            .map(arg -> ((Enum) arg).name())
+            .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
+
+    private StringBuilder traversalScript;
+    private final String alias;
+    private final String scriptEngine;
+    private final boolean importStatics;
+
+    public PythonTranslator(final String scriptEngine, final String alias, final boolean importStatics) {
+        this.scriptEngine = scriptEngine;
+        this.alias = alias;
+        this.traversalScript = new StringBuilder(this.alias);
+        this.importStatics = importStatics;
+    }
+
+    public static PythonTranslator of(final String scriptEngine, final String alias) {
+        return new PythonTranslator(scriptEngine, alias, false);
+    }
+
+    public static PythonTranslator of(final String scriptEngine, final String alias, final boolean importStatics) {
+        return new PythonTranslator(scriptEngine, alias, importStatics);
+    }
+
+    @Override
+    public String getAlias() {
+        return this.alias;
+    }
+
+    @Override
+    public String getScriptEngine() {
+        return this.scriptEngine;
+    }
+
+    @Override
+    public GraphTraversal __() {
+        return new ScriptGraphTraversal(EmptyGraph.instance(), new PythonTranslator(this.scriptEngine, "__", this.importStatics));
+    }
+
+    @Override
+    public String getTraversalScript() {
+        final String traversal = this.traversalScript.toString();
+        if (traversal.contains("$"))
+            throw new VerificationException("Lambdas are currently not supported: " + traversal, EmptyTraversal.instance());
+
+        if (isTesting && !this.alias.equals("__")) {
+            try {
+                final ScriptEngine jythonEngine = ScriptEngineCache.get("jython");
+                final Bindings jythonBindings = new SimpleBindings();
+                jythonBindings.put(this.alias, jythonEngine.eval("PythonGraphTraversalSource(\"" + this.alias + "\", None)"));
+                jythonEngine.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
+                return jythonEngine.eval(traversal).toString();
+            } catch (final ScriptException e) {
+                throw new IllegalArgumentException(e.getMessage(), e);
+            }
+        } else
+            return traversal;
+    }
+
+    @Override
+    public void addStep(final String stepName, final Object... arguments) {
+        // flatten the arguments into a single array
+        final List<Object> objects = TranslatorHelper.flattenArguments(arguments);
+        final int size = objects.size();
+        if (0 == size)
+            this.traversalScript.append(".").append(convertStepName(stepName)).append("()");
+        else if (stepName.equals("range") && 2 == size)
+            this.traversalScript.append("[").append(objects.get(0)).append(":").append(objects.get(1)).append("]");
+        else if (stepName.equals("limit") && 1 == size)
+            this.traversalScript.append("[0:").append(objects.get(0)).append("]");
+        else if (stepName.equals("values") && 1 == size && traversalScript.length() > 3 && !STEP_NAMES.contains(objects.get(0).toString()))
+            this.traversalScript.append(".").append(objects.get(0));
+        else {
+            this.traversalScript.append(".");
+            String temp = convertStepName(stepName) + "(";
+            for (final Object object : objects) {
+                temp = temp + convertToString(object) + ",";
+            }
+            this.traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
+        }
+
+        // clip off __.
+        if (this.importStatics && this.traversalScript.substring(0, 3).startsWith("__.")
+                && !NO_STATIC.stream().filter(name -> this.traversalScript.substring(3).startsWith(convertStepName(name))).findAny().isPresent()) {
+            this.traversalScript.delete(0, 3);
+        }
+        if (isTesting && !this.importStatics)
+            assert this.traversalScript.toString().startsWith(this.alias + ".");
+    }
+
+    @Override
+    public PythonTranslator clone() {
+        try {
+            final PythonTranslator clone = (PythonTranslator) super.clone();
+            clone.traversalScript = new StringBuilder(this.traversalScript);
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    ///////
+
+    private String convertToString(final Object object) {
+        if (object instanceof String)
+            return "\"" + object + "\"";
+        else if (object instanceof List) {
+            final List<String> list = new ArrayList<>(((List) object).size());
+            for (final Object item : (List) object) {
+                list.add(convertToString(item));
+            }
+            return list.toString();
+        } else if (object instanceof Long)
+            return object + "L";
+        else if (object instanceof Class)
+            return ((Class) object).getCanonicalName();
+        else if (object instanceof VertexProperty.Cardinality)
+            return "Cardinality." + object.toString();
+        else if (object instanceof Enum)
+            return convertStatic(((Enum) object).getDeclaringClass().getSimpleName() + ".") + convertStepName(object.toString());
+        else if (object instanceof P)
+            return convertPToString((P) object, new StringBuilder()).toString();
+        else if (object instanceof Element)
+            return convertToString(((Element) object).id()); // hack
+        else if (object instanceof ScriptGraphTraversal)
+            return ((ScriptGraphTraversal) object).getTraversalScript().toString();
+        else if (object instanceof Boolean)
+            return object.equals(Boolean.TRUE) ? "True" : "False";
+        else
+            return null == object ? "" : object.toString();
+    }
+
+    private String convertStatic(final String name) {
+        return this.importStatics ? "" : name;
+    }
+
+    private String convertStepName(final String stepName) {
+        if (PREFIX_NAMES.contains(stepName))
+            return "_" + stepName;
+        else
+            return stepName;
+    }
+
+    private StringBuilder convertPToString(final P p, final StringBuilder current) {
+        if (p instanceof ConnectiveP) {
+            final List<P<?>> list = ((ConnectiveP) p).getPredicates();
+            for (int i = 0; i < list.size(); i++) {
+                convertPToString(list.get(i), current);
+                if (i < list.size() - 1)
+                    current.append(p instanceof OrP ? "._or(" : "._and(");
+            }
+            current.append(")");
+        } else
+            current.append(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+        return current;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
new file mode 100644
index 0000000..1774d1a
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
@@ -0,0 +1,137 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.AbstractGraphProvider;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionComputerTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProgramTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerElement;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraphVariables;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerProperty;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertexProperty;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class VariantGraphProvider extends AbstractGraphProvider {
+
+    private static Set<String> SKIP_TESTS = new HashSet<>(Arrays.asList(
+            "testProfileStrategyCallback",
+            "testProfileStrategyCallbackSideEffect",
+            "g_withSideEffectXa_g_VX2XX_VX1X_out_whereXneqXaXX",
+            "g_withSackXBigInteger_TEN_powX1000X_assignX_V_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack",
+            "g_withSideEffectXa_setX_V_both_name_storeXaX_capXaX",
+            "shouldSupportJobChaining",
+            InjectTest.Traversals.class.getCanonicalName(),
+            ProgramTest.Traversals.class.getCanonicalName(),
+            CoreTraversalTest.class.getCanonicalName(),
+            TraversalInterruptionTest.class.getCanonicalName(),
+            TraversalInterruptionComputerTest.class.getCanonicalName(),
+            ElementIdStrategyProcessTest.class.getCanonicalName(),
+            EventStrategyProcessTest.class.getCanonicalName(),
+            ReadOnlyStrategyProcessTest.class.getCanonicalName(),
+            PartitionStrategyProcessTest.class.getCanonicalName(),
+            SubgraphStrategyProcessTest.class.getCanonicalName()));
+
+    private static final Set<Class> IMPLEMENTATION = new HashSet<Class>() {{
+        add(TinkerEdge.class);
+        add(TinkerElement.class);
+        add(TinkerGraph.class);
+        add(TinkerGraphVariables.class);
+        add(TinkerProperty.class);
+        add(TinkerVertex.class);
+        add(TinkerVertexProperty.class);
+    }};
+
+    @Override
+    public Map<String, Object> getBaseConfiguration(final String graphName, final Class<?> test, final String testMethodName,
+                                                    final LoadGraphWith.GraphData loadGraphWith) {
+
+        final TinkerGraph.DefaultIdManager idManager = selectIdMakerFromGraphData(loadGraphWith);
+        final String idMaker = (idManager.equals(TinkerGraph.DefaultIdManager.ANY) ? selectIdMakerFromGraphData(loadGraphWith) : idManager).name();
+        return new HashMap<String, Object>() {{
+            put(Graph.GRAPH, TinkerGraph.class.getName());
+            put(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, idMaker);
+            put(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, idMaker);
+            put(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, idMaker);
+            put("skipTest", SKIP_TESTS.contains(testMethodName) || SKIP_TESTS.contains(test.getCanonicalName()));
+            if (loadGraphWith == LoadGraphWith.GraphData.CREW)
+                put(TinkerGraph.GREMLIN_TINKERGRAPH_DEFAULT_VERTEX_PROPERTY_CARDINALITY, VertexProperty.Cardinality.list.name());
+        }};
+    }
+
+    @Override
+    public void clear(final Graph graph, final Configuration configuration) throws Exception {
+        if (graph != null)
+            graph.close();
+
+        // in the even the graph is persisted we need to clean up
+        final String graphLocation = configuration.getString(TinkerGraph.GREMLIN_TINKERGRAPH_GRAPH_LOCATION, null);
+        if (graphLocation != null) {
+            final File f = new File(graphLocation);
+            f.delete();
+        }
+    }
+
+    @Override
+    public Set<Class> getImplementations() {
+        return IMPLEMENTATION;
+    }
+
+    /**
+     * Test that load with specific graph data can be configured with a specific id manager as the data type to
+     * be used in the test for that graph is known.
+     */
+    protected TinkerGraph.DefaultIdManager selectIdMakerFromGraphData(final LoadGraphWith.GraphData loadGraphWith) {
+        if (null == loadGraphWith) return TinkerGraph.DefaultIdManager.ANY;
+        if (loadGraphWith.equals(LoadGraphWith.GraphData.CLASSIC))
+            return TinkerGraph.DefaultIdManager.INTEGER;
+        else if (loadGraphWith.equals(LoadGraphWith.GraphData.MODERN))
+            return TinkerGraph.DefaultIdManager.INTEGER;
+        else if (loadGraphWith.equals(LoadGraphWith.GraphData.CREW))
+            return TinkerGraph.DefaultIdManager.INTEGER;
+        else if (loadGraphWith.equals(LoadGraphWith.GraphData.GRATEFUL))
+            return TinkerGraph.DefaultIdManager.INTEGER;
+        else
+            throw new IllegalStateException(String.format("Need to define a new %s for %s", TinkerGraph.IdManager.class.getName(), loadGraphWith.name()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
new file mode 100644
index 0000000..e8e58d5
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.groovy;
+
+import org.apache.tinkerpop.gremlin.GraphProvider;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@GraphProvider.Descriptor(computer = TinkerGraphComputer.class)
+public class GroovyComputerProvider extends GroovyProvider {
+
+    @Override
+    public GraphTraversalSource traversal(final Graph graph) {
+        return super.traversal(graph).withComputer();
+    }
+}