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/08/17 17:24:06 UTC

tinkerpop git commit: Added JythonTranslator which is necessary for ensuring Java Traversal source in Jython has respective lambda representations. This allowed me to make the docs better around lambda handling in Python. Simplified lots of the Translato

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 587f68673 -> f1a0e9199


Added JythonTranslator which is necessary for ensuring Java Traversal source in Jython has respective lambda representations. This allowed me to make the docs better around lambda handling in Python. Simplified lots of the Translators as we don't need getAnonymousTraversal() anymore. Lambda in Python are done done.


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

Branch: refs/heads/TINKERPOP-1278
Commit: f1a0e9199cc7003dbf9954be9b57f5f6d3c733a2
Parents: 587f686
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Aug 17 11:23:56 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Aug 17 11:23:56 2016 -0600

----------------------------------------------------------------------
 docs/preprocessor/awk/init-code-blocks.awk      |   8 +-
 docs/preprocessor/install-plugins.sh            |   1 +
 docs/src/reference/gremlin-variants.asciidoc    |  24 ++--
 .../gremlin/jsr223/JavaTranslator.java          |  12 +-
 .../gremlin/process/traversal/Translator.java   |  21 +---
 .../graphson/GraphSONTraversalSerializers.java  |  13 +-
 .../tinkerpop/gremlin/util/function/Lambda.java |  24 ++--
 .../gremlin/groovy/GroovyTranslatorTest.java    |   4 +-
 .../jsr223/GremlinGroovyScriptEngine.java       |  11 +-
 .../gremlin/groovy/jsr223/GroovyTranslator.java |  19 +--
 .../jsr223/GremlinJythonScriptEngine.java       |  32 +++--
 .../gremlin/python/jsr223/JythonTranslator.java |  57 +++++++++
 .../gremlin/python/jsr223/PythonTranslator.java |  56 ++++-----
 .../jython/gremlin_python/process/graphson.py   |  15 ++-
 .../src/main/jython/gremlin_python/statics.py   |   2 +-
 .../python/driver/RESTRemoteConnectionTest.java | 121 -------------------
 .../driver/WebSocketRemoteConnectionTest.java   | 121 +++++++++++++++++++
 .../python/jsr223/JythonTranslatorTest.java     |  87 +++++++++++++
 .../jsr223/PythonGraphSONJavaTranslator.java    |   5 -
 .../gremlin/python/jsr223/PythonProvider.java   |   2 +-
 .../RemoteGraphGroovyTranslatorProvider.java    |   2 +-
 .../TinkerGraphGroovyTranslatorProvider.java    |   2 +-
 .../io/graphson/GraphSONTranslator.java         |   5 -
 23 files changed, 396 insertions(+), 248 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/docs/preprocessor/awk/init-code-blocks.awk
----------------------------------------------------------------------
diff --git a/docs/preprocessor/awk/init-code-blocks.awk b/docs/preprocessor/awk/init-code-blocks.awk
index 4759a65..4b52acd 100644
--- a/docs/preprocessor/awk/init-code-blocks.awk
+++ b/docs/preprocessor/awk/init-code-blocks.awk
@@ -51,7 +51,7 @@ BEGIN {
   print ":set max-iteration 100"
   if (lang == "python") {
     print "import static javax.script.ScriptContext.*"
-    print "import org.apache.tinkerpop.gremlin.python.jsr223.PythonTranslator"
+    print "import org.apache.tinkerpop.gremlin.python.jsr223.JythonTranslator"
     print "jython = new org.apache.tinkerpop.gremlin.python.jsr223.GremlinJythonScriptEngine()"
     print "jython.eval('import os')"
     print "jython.eval('os.chdir(\"" TP_HOME "\")')"
@@ -71,18 +71,18 @@ BEGIN {
     print "jythonBindings = jython.createBindings()"
     print "jythonBindings.put('g', jython.eval('RemoteGraph(None).traversal()'))"
     print "jythonBindings.put('h', g)"
-    print "jython.getContext().setBindings(jythonBindings, javax.script.ScriptContext.GLOBAL_SCOPE)"
+    print "jython.getContext().setBindings(jythonBindings, GLOBAL_SCOPE)"
     print "groovy = new org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine()"
     print "groovyBindings = groovy.createBindings()"
     print "groovyBindings.put('g', g)"
     print "groovyBindings.put('TinkerGraphComputer', TinkerGraphComputer)"
-    print "groovy.getContext().setBindings(groovyBindings, javax.script.ScriptContext.GLOBAL_SCOPE)"
+    print "groovy.getContext().setBindings(groovyBindings, GLOBAL_SCOPE)"
     print "def processTraversal(t, jython, groovy) {"
     print "  jython.getContext().getBindings(GLOBAL_SCOPE).put('j', jython.eval(t.replace('.toList()','')))"
     print "  if(jython.eval('isinstance(j, Traversal)')) {"
     print "    bytecode = GraphSONReader.build().create().mapper.readValue(jython.eval('GraphSONWriter.writeObject(j)').toString(), Bytecode.class)"
     print "    language = BytecodeHelper.getLambdaLanguage(bytecode).orElse('gremlin-groovy')"
-    print "    return language.equals('gremlin-groovy') ? groovy.eval(GroovyTranslator.of(\"g\").translate(bytecode) + '.toList()').toString() : jython.eval(PythonTranslator.of(\"h\").translate(bytecode) + '.toList()').toString()"
+    print "    return language.equals('gremlin-groovy') ? groovy.eval(GroovyTranslator.of(\"g\").translate(bytecode) + '.toList()').toString() : jython.eval(JythonTranslator.of(\"h\").translate(bytecode) + '.toList()').toString()"
     print "  } else {"
     print "    j = jython.getContext().getBindings(GLOBAL_SCOPE).get('j')"
     print "    return null == j ? 'null' : j.toString()"

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/docs/preprocessor/install-plugins.sh
----------------------------------------------------------------------
diff --git a/docs/preprocessor/install-plugins.sh b/docs/preprocessor/install-plugins.sh
index 2737ccb..d37489e 100755
--- a/docs/preprocessor/install-plugins.sh
+++ b/docs/preprocessor/install-plugins.sh
@@ -26,6 +26,7 @@ INSTALL_TEMPLATE="docs/preprocessor/install-plugins.groovy"
 INSTALL_FILE="${TMP_DIR}/install-plugins.groovy"
 
 plugins=("hadoop-gremlin" "spark-gremlin" "giraph-gremlin" "neo4j-gremlin")
+# plugins=()
 pluginsCount=${#plugins[@]}
 
 i=0

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/docs/src/reference/gremlin-variants.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index 4fce04a..dd1577a 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -186,20 +186,28 @@ The Lambda Solution
 Supporting link:https://en.wikipedia.org/wiki/Anonymous_function[anonymous functions] across languages is extremely difficult.
 As a simple solution, it is up to the Gremlin variant to decide lambdas (in any language) should be expressed and ultimately
 encoded in the standard `Bytecode` format. In Gremlin-Python, a link:https://docs.python.org/2/reference/expressions.html#lambda[Python lambda]
-should be a zero-arg callable that returns a string representation of a lambda. The default lambda language is `gremlin-jython`
-and can be changed via `statics.default_lambda_language.` When the lambda is represented in `Bytecode` its language is encoded
-such that the remote connection host can infer which translator to use. A zero-arg lambda yields a string representation of a lambda in Gremlin-Jython.
-For example, `g.V().out().map(lambda: "lambda x: x.get().value('name').length()").sum().toList()`.
+should be a zero-arg callable that returns a string representation of a lambda. The default lambda language is `gremlin-python`
+and can be changed via `gremlin_python.statics.default_lambda_language.` When the lambda is represented in `Bytecode` its language is encoded
+such that the remote connection host can infer which translator to use.
 
 [gremlin-python,modern]
 ----
+g.V().out().map(lambda: "lambda x: len(x.get().value('name'))").sum().toList()
+statics.default_lambda_language
 g.V().out().map(lambda: ("it.get().value('name').length()", "gremlin-groovy")).sum().toList()
 statics.default_lambda_language = 'gremlin-groovy'
 g.V().out().map(lambda: "it.get().value('name').length()").sum().toList()
+g.V().out().map(lambda: ("lambda x: len(x.get().value('name'))", "gremlin-python")).sum().toList()
+statics.default_lambda_language = 'gremlin-python'
+g.V().out().map(lambda: "x: len(x.get().value('name'))").sum().toList()
 ----
 
-1. A zero-arg lambda yields 2-tuple where the second element is the lambda language.
-2. The default lambda language can be statically changed.
-3. A zero-arg lambda yields a string representation of a closure in Gremlin-Groovy.
-
+1. A zero-arg lambda yields a string representation of a lambda in Gremlin-Python.
+2. The default lambda language is currently Gremlin-Python.
+2. A zero-arg lambda yields a 2-tuple where the second element is the language of the lambda (Gremlin-Groovy).
+3. The default lambda language can be statically changed.
+4. A zero-arg lambda yields a string representation of a closure in Gremlin-Groovy.
+5. A zero-arg lambda yields a 2-tuple where the second element is the language of the lambda (Gremlin-Python).
+6. The default lambda language is changed back to Gremlin-Python.
+7. If the `lambda`-prefix is not provided, then it is appended automatically in order to give a more natural look to the expression.
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
index ea23d11..43175f9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
@@ -44,13 +44,14 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
     private final Map<String, List<Method>> traversalSourceMethodCache = new HashMap<>();
     private final Map<String, List<Method>> traversalMethodCache = new HashMap<>();
 
-    private JavaTranslator(final S traversalSource, final Class anonymousSource) {
+    private JavaTranslator(final S traversalSource) {
         this.traversalSource = traversalSource;
-        this.anonymousTraversal = anonymousSource;
+        // todo: could produce an NPE later on. need a good model for when a traversal species doesn't support nesting.
+        this.anonymousTraversal = traversalSource.getAnonymousTraversalClass().orElse(null);
     }
 
     public static <S extends TraversalSource, T extends Traversal.Admin<?, ?>> JavaTranslator<S, T> of(final S traversalSource) {
-        return new JavaTranslator<>(traversalSource, traversalSource.getAnonymousTraversalClass().orElse(null));
+        return new JavaTranslator<>(traversalSource);
     }
 
     @Override
@@ -59,11 +60,6 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
     }
 
     @Override
-    public Class getAnonymousTraversal() {
-        return this.anonymousTraversal;
-    }
-
-    @Override
     public T translate(final Bytecode bytecode) {
         TraversalSource dynamicSource = this.traversalSource;
         Traversal.Admin<?, ?> traversal = null;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
index 7203db8..7e97fb3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
@@ -22,31 +22,22 @@ package org.apache.tinkerpop.gremlin.process.traversal;
 /**
  * A Translator will translate {@link Bytecode} into another representation. That representation may be a
  * Java instance via {@link StepTranslator} or a String script in some language via {@link ScriptTranslator}.
- * The parameterization of Translator is S (traversal source), A (anonymous traversal), and T (full translation).
+ * The parameterization of Translator is S (traversal source) and T (full translation).
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Translator<S, A, T> {
+public interface Translator<S, T> {
 
     /**
      * Get the {@link TraversalSource} representation rooting this translator.
-     * For string-based translators, this is typically a "g".
-     * For java-based translators, this is typically the {@link TraversalSource} instance which the {@link Traversal} will be built from.
+     * For string-based translators ({@link ScriptTranslator}), this is typically a "g".
+     * For java-based translators ({@link StepTranslator}), this is typically the {@link TraversalSource} instance which the {@link Traversal} will be built from.
      *
      * @return the traversal source representation
      */
     public S getTraversalSource();
 
     /**
-     * Get the anonymous traversal representation to be used by this translator.
-     * For string-based translators, this is typically "__".
-     * For java-based translators, this is typically the {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__} class for the respective traversal class�.
-     *
-     * @return the anonymous traversal representation
-     */
-    public A getAnonymousTraversal();
-
-    /**
      * Translate {@link Bytecode} into a new representation.
      * Typically, for language translations, the translation is to a string represenging the traversal in the respective scripting language.
      *
@@ -64,11 +55,11 @@ public interface Translator<S, A, T> {
 
     ///
 
-    public interface ScriptTranslator extends Translator<String, String, String> {
+    public interface ScriptTranslator extends Translator<String, String> {
 
     }
 
-    public interface StepTranslator<S extends TraversalSource, T extends Traversal.Admin<?, ?>> extends Translator<S, Class, T> {
+    public interface StepTranslator<S extends TraversalSource, T extends Traversal.Admin<?, ?>> extends Translator<S, T> {
 
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java
index 8023cd2..6fa8ef6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java
@@ -167,8 +167,7 @@ public final class GraphSONTraversalSerializers {
             jsonGenerator.writeStringField("@type", "Lambda");
             jsonGenerator.writeStringField("value", lambda.getLambdaScript());
             jsonGenerator.writeStringField("language", lambda.getLambdaLanguage());
-            if (!(lambda instanceof Lambda.UnknownArgLambda))
-                jsonGenerator.writeNumberField("arguments", lambda instanceof Lambda.ZeroArgLambda ? 0 : lambda instanceof Lambda.OneArgLambda ? 1 : 2);
+            jsonGenerator.writeNumberField("arguments", lambda.getLambdaArguments());
             jsonGenerator.writeEndObject();
         }
 
@@ -377,12 +376,12 @@ public final class GraphSONTraversalSerializers {
             assert node.get("@type").textValue().equals("Lambda");
             final String lambdaScript = node.get("value").textValue();
             final String lambdaLanguage = node.get("language").textValue();
-            final int arguments = node.has("argument") ? node.get("arguments").intValue() : -1;
-            if (-1 == arguments || arguments > 2)
-                return new Lambda.UnknownArgLambda(lambdaScript, lambdaLanguage);
-            else if (0 == arguments)
+            final int lambdaArguments = node.get("arguments").intValue();
+            if (-1 == lambdaArguments || lambdaArguments > 2)
+                return new Lambda.UnknownArgLambda(lambdaScript, lambdaLanguage, lambdaArguments);
+            else if (0 == lambdaArguments)
                 return new Lambda.ZeroArgLambda<>(lambdaScript, lambdaLanguage);
-            else if (1 == arguments)
+            else if (1 == lambdaArguments)
                 return new Lambda.OneArgLambda<>(lambdaScript, lambdaLanguage);
             else
                 return new Lambda.TwoArgLambda<>(lambdaScript, lambdaLanguage);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/Lambda.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/Lambda.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/Lambda.java
index 1f6455c..a259eb3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/Lambda.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/Lambda.java
@@ -36,13 +36,17 @@ public interface Lambda extends Serializable {
 
     public String getLambdaLanguage();
 
+    public int getLambdaArguments();
+
     public abstract static class AbstractLambda implements Lambda {
         private final String lambdaSource;
         private final String lambdaLanguage;
+        private final int lambdaArguments;
 
-        private AbstractLambda(final String lambdaSource, final String lambdaLanguage) {
+        private AbstractLambda(final String lambdaSource, final String lambdaLanguage, final int lambdaArguments) {
             this.lambdaSource = lambdaSource;
             this.lambdaLanguage = lambdaLanguage;
+            this.lambdaArguments = lambdaArguments;
         }
 
         @Override
@@ -56,18 +60,24 @@ public interface Lambda extends Serializable {
         }
 
         @Override
+        public int getLambdaArguments() {
+            return this.lambdaArguments;
+        }
+
+        @Override
         public String toString() {
             return this.lambdaSource;
         }
 
         @Override
         public int hashCode() {
-            return this.lambdaSource.hashCode() + this.lambdaLanguage.hashCode();
+            return this.lambdaSource.hashCode() + this.lambdaLanguage.hashCode() + this.lambdaArguments;
         }
 
         @Override
         public boolean equals(final Object object) {
             return object instanceof Lambda &&
+                    ((Lambda) object).getLambdaArguments() == this.getLambdaArguments() &&
                     ((Lambda) object).getLambdaScript().equals(this.lambdaSource) &&
                     ((Lambda) object).getLambdaLanguage().equals(this.lambdaLanguage);
         }
@@ -75,15 +85,15 @@ public interface Lambda extends Serializable {
 
     public static class UnknownArgLambda extends AbstractLambda {
 
-        public UnknownArgLambda(final String lambdaSource, final String lambdaLanguage) {
-            super(lambdaSource, lambdaLanguage);
+        public UnknownArgLambda(final String lambdaSource, final String lambdaLanguage, final int lambdaArguments) {
+            super(lambdaSource, lambdaLanguage, lambdaArguments);
         }
     }
 
     public static class ZeroArgLambda<A> extends AbstractLambda implements Supplier<A> {
 
         public ZeroArgLambda(final String lambdaSource, final String lambdaLanguage) {
-            super(lambdaSource, lambdaLanguage);
+            super(lambdaSource, lambdaLanguage, 0);
         }
 
         @Override
@@ -96,7 +106,7 @@ public interface Lambda extends Serializable {
     public static class OneArgLambda<A, B> extends AbstractLambda implements Function<A, B>, Predicate<A>, Consumer<A> {
 
         public OneArgLambda(final String lambdaSource, final String lambdaLanguage) {
-            super(lambdaSource, lambdaLanguage);
+            super(lambdaSource, lambdaLanguage, 1);
         }
 
         @Override
@@ -118,7 +128,7 @@ public interface Lambda extends Serializable {
     public static class TwoArgLambda<A, B, C> extends AbstractLambda implements BiFunction<A, B, C>, Comparator<A> {
 
         public TwoArgLambda(final String lambdaSource, final String lambdaLanguage) {
-            super(lambdaSource, lambdaLanguage);
+            super(lambdaSource, lambdaLanguage, 2);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
index 5ce48e5..15d7667 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
@@ -45,7 +45,7 @@ public class GroovyTranslatorTest extends AbstractGremlinTest {
     @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
     public void shouldSupportStringSupplierLambdas() throws Exception {
         GraphTraversalSource g = graph.traversal();
-        g = g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g", "__")));
+        g = g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g")));
         GraphTraversal.Admin<Vertex, Integer> t = g.withSideEffect("lengthSum", 0).withSack(1)
                 .V()
                 .filter(Lambda.predicate("it.get().label().equals('person')"))
@@ -85,6 +85,6 @@ public class GroovyTranslatorTest extends AbstractGremlinTest {
 
     @Test
     public void shouldHaveValidToString() {
-        assertEquals("translator[h:gremlin-groovy]", GroovyTranslator.of("h", "__").toString());
+        assertEquals("translator[h:gremlin-groovy]", GroovyTranslator.of("h").toString());
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
index 6d071fc..8866325 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
@@ -44,6 +44,7 @@ import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngineFactory;
 import org.apache.tinkerpop.gremlin.jsr223.ImportCustomizer;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.control.CompilationFailedException;
@@ -370,8 +371,14 @@ public class GremlinGroovyScriptEngine extends GroovyScriptEngineImpl
     @Override
     public Traversal.Admin eval(final Bytecode bytecode, final Bindings bindings) throws ScriptException {
         bindings.putAll(bytecode.getBindings());
-        // TODO: this is kinda bad because it makes the assumption that we will always alias to "g" (which is generally true, but maybe better to not hardcode?)
-        return (Traversal.Admin) this.eval(GroovyTranslator.of("g", "__").translate(bytecode), bindings);
+        String traversalSource = "g";
+        for (final Map.Entry<String, Object> entry : bindings.entrySet()) {
+            if (entry.getValue() instanceof TraversalSource) {
+                traversalSource = entry.getKey();
+                break;
+            }
+        }
+        return (Traversal.Admin) this.eval(GroovyTranslator.of(traversalSource).translate(bytecode), bindings);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
index 9349c90..4b93881 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
@@ -41,19 +41,13 @@ import java.util.List;
 public final class GroovyTranslator implements Translator.ScriptTranslator {
 
     private final String traversalSource;
-    private final String anonymousTraversal;
 
-    private GroovyTranslator(final String traversalSource, final String anonymousTraversal) {
+    private GroovyTranslator(final String traversalSource) {
         this.traversalSource = traversalSource;
-        this.anonymousTraversal = anonymousTraversal;
-    }
-
-    public static final GroovyTranslator of(final String traversalSource, final String anonymousTraversal) {
-        return new GroovyTranslator(traversalSource, anonymousTraversal);
     }
 
     public static final GroovyTranslator of(final String traversalSource) {
-        return new GroovyTranslator(traversalSource, "__");
+        return new GroovyTranslator(traversalSource);
     }
 
     ///////
@@ -78,11 +72,6 @@ public final class GroovyTranslator implements Translator.ScriptTranslator {
         return this.traversalSource;
     }
 
-    @Override
-    public String getAnonymousTraversal() {
-        return this.anonymousTraversal;
-    }
-
     ///////
 
     private String internalTranslate(final String start, final Bytecode bytecode) {
@@ -140,10 +129,10 @@ public final class GroovyTranslator implements Translator.ScriptTranslator {
         else if (object instanceof Computer) { // TODO: blow out
             return "";
         } else if (object instanceof Lambda) {
-            final String lambdaString = ((Lambda) object).getLambdaScript();
+            final String lambdaString = ((Lambda) object).getLambdaScript().trim();
             return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}";
         } else if (object instanceof Bytecode)
-            return this.internalTranslate(this.anonymousTraversal, (Bytecode) object);
+            return this.internalTranslate("__", (Bytecode) object);
         else
             return null == object ? "null" : object.toString();
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/GremlinJythonScriptEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/GremlinJythonScriptEngine.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/GremlinJythonScriptEngine.java
index a10cb3f..8d1ade4 100644
--- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/GremlinJythonScriptEngine.java
+++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/GremlinJythonScriptEngine.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngine;
 import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngineFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 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.util.CoreImports;
 import org.python.jsr223.PyScriptEngine;
@@ -33,6 +34,7 @@ import javax.script.ScriptContext;
 import javax.script.ScriptException;
 import java.io.Reader;
 import java.lang.reflect.Method;
+import java.util.Map;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -70,13 +72,21 @@ public class GremlinJythonScriptEngine implements GremlinScriptEngine {
                     "from java.lang import Long\n" +
                     "import org.apache.tinkerpop.gremlin.util.function.Lambda\n" + // todo: remove or remove imported subclass names? (choose)
                     "from org.apache.tinkerpop.gremlin.util.function.Lambda import AbstractLambda\n" +
+                    "from org.apache.tinkerpop.gremlin.util.function.Lambda import UnknownArgLambda\n" +
                     "from org.apache.tinkerpop.gremlin.util.function.Lambda import ZeroArgLambda\n" +
                     "from org.apache.tinkerpop.gremlin.util.function.Lambda import OneArgLambda\n" +
                     "from org.apache.tinkerpop.gremlin.util.function.Lambda import TwoArgLambda\n\n" +
 
+                    "class JythonUnknownArgLambda(UnknownArgLambda):\n" +
+                    "  def __init__(self,func,lang='gremlin-jython'):\n" +
+                    "    UnknownArgLambda.__init__(self, 'nothing', lang, -1)\n" +
+                    "    self.func = func\n" +
+                    "  def __repr__(self):\n" +
+                    "    return 'JythonUnknownArgLambda'\n\n" +
+
                     "class JythonZeroArgLambda(ZeroArgLambda):\n" +
-                    "  def __init__(self,func):\n" +
-                    "    AbstractLambda.__init__(self, 'nothing')\n" +
+                    "  def __init__(self,func,lang='gremlin-jython'):\n" +
+                    "    ZeroArgLambda.__init__(self, 'nothing', lang)\n" +
                     "    self.func = func\n" +
                     "  def __repr__(self):\n" +
                     "    return 'JythonZeroArgLambda'\n" +
@@ -84,8 +94,8 @@ public class GremlinJythonScriptEngine implements GremlinScriptEngine {
                     "    return self.func()\n\n" +
 
                     "class JythonOneArgLambda(OneArgLambda):\n" +
-                    "  def __init__(self,func):\n" +
-                    "    AbstractLambda.__init__(self, 'nothing')\n" +
+                    "  def __init__(self,func,lang='gremlin-jython'):\n" +
+                    "    OneArgLambda.__init__(self, 'nothing', lang)\n" +
                     "    self.func = func\n" +
                     "  def __repr__(self):\n" +
                     "    return 'JythonOneArgLambda'\n" +
@@ -99,8 +109,8 @@ public class GremlinJythonScriptEngine implements GremlinScriptEngine {
                     "    return self.func(a,b)\n\n" +
 
                     "class JythonTwoArgLambda(TwoArgLambda):\n" +
-                    "  def __init__(self,func):\n" +
-                    "    AbstractLambda.__init__(self, 'nothing')\n" +
+                    "  def __init__(self,func,lang='gremlin-jython'):\n" +
+                    "    TwoArgLambda.__init__(self, 'nothing', lang)\n" +
                     "    self.func = func\n" +
                     "  def __repr__(self):\n" +
                     "    return 'JythonTwoArgLambda'\n" +
@@ -118,8 +128,14 @@ public class GremlinJythonScriptEngine implements GremlinScriptEngine {
     @Override
     public Traversal.Admin eval(final Bytecode bytecode, final Bindings bindings) throws ScriptException {
         bindings.putAll(bytecode.getBindings());
-        // TODO: this is kinda bad because it makes the assumption that we will always alias to "g" (which is generally true, but maybe better to not hardcode?)
-        return (Traversal.Admin) this.eval(PythonTranslator.of("g", "__").translate(bytecode), bindings);
+        String traversalSource = "g";
+        for (final Map.Entry<String, Object> entry : bindings.entrySet()) {
+            if (entry.getValue() instanceof TraversalSource) {
+                traversalSource = entry.getKey();
+                break;
+            }
+        }
+        return (Traversal.Admin) this.eval(JythonTranslator.of(traversalSource).translate(bytecode), bindings);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslator.java
new file mode 100644
index 0000000..0eb8961
--- /dev/null
+++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslator.java
@@ -0,0 +1,57 @@
+/*
+ *  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.jsr223;
+
+import org.apache.tinkerpop.gremlin.util.function.Lambda;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class JythonTranslator extends PythonTranslator {
+
+    private JythonTranslator(final String traversalSource, final boolean importStatics) {
+        super(traversalSource, importStatics);
+    }
+
+    public static JythonTranslator of(final String traversalSource) {
+        return new JythonTranslator(traversalSource, false);
+    }
+
+    @Override
+    public String getTargetLanguage() {
+        return "gremlin-jython";
+    }
+
+    @Override
+    protected String convertLambdaToString(final Lambda lambda) {
+        String lambdaString = lambda.getLambdaScript().trim();
+        lambdaString = lambdaString.startsWith("lambda") ?
+                lambdaString :
+                "lambda " + lambdaString;
+        if (0 == lambda.getLambdaArguments())
+            return "JythonZeroArgLambda(" + lambdaString + ")";
+        else if (1 == lambda.getLambdaArguments())
+            return "JythonOneArgLambda(" + lambdaString + ")";
+        else if (2 == lambda.getLambdaArguments())
+            return "JythonTwoArgLambda(" + lambdaString + ")";
+        else
+            return "JythonUnknownArgLambda(" + lambdaString + ")";
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
index 20cc21b..0721c34 100644
--- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
+++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
@@ -40,7 +40,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -50,34 +50,28 @@ import java.util.stream.Stream;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class PythonTranslator implements Translator.ScriptTranslator {
+public class PythonTranslator implements Translator.ScriptTranslator {
 
     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> 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"))));
+            .collect(Collectors.toCollection(() -> new HashSet<>(Collections.singleton("not"))));
 
-    private String traversalSource;
-    private String anonymousTraversal;
+    private final String traversalSource;
     private final boolean importStatics;
 
-    private PythonTranslator(final String traversalSource, final String anonymousTraversal, final boolean importStatics) {
+    PythonTranslator(final String traversalSource, final boolean importStatics) {
         this.traversalSource = traversalSource;
-        this.anonymousTraversal = anonymousTraversal;
         this.importStatics = importStatics;
     }
 
-    public static final PythonTranslator of(final String traversalSource, final String anonymousTraversal, final boolean importStatics) {
-        return new PythonTranslator(traversalSource, anonymousTraversal, importStatics);
+    public static PythonTranslator of(final String traversalSource, final boolean importStatics) {
+        return new PythonTranslator(traversalSource, importStatics);
     }
 
-    public static final PythonTranslator of(final String traversalSource, final String anonymousTraversal) {
-        return new PythonTranslator(traversalSource, anonymousTraversal, false);
-    }
-
-    public static final PythonTranslator of(final String traversalSource) {
-        return new PythonTranslator(traversalSource, "__", false);
+    public static PythonTranslator of(final String traversalSource) {
+        return new PythonTranslator(traversalSource, false);
     }
 
     @Override
@@ -86,21 +80,13 @@ public final class PythonTranslator implements Translator.ScriptTranslator {
     }
 
     @Override
-    public String getAnonymousTraversal() {
-        return this.anonymousTraversal;
-    }
-
-    @Override
     public String translate(final Bytecode bytecode) {
-        final String traversal = this.internalTranslate(this.traversalSource, bytecode);
-        //if (this.importStatics)
-        //    assert !traversal.contains("__.");
-        return traversal;
+        return this.internalTranslate(this.traversalSource, bytecode);
     }
 
     @Override
     public String getTargetLanguage() {
-        return "jython";
+        return "gremlin-python";
     }
 
     @Override
@@ -134,7 +120,7 @@ public final class PythonTranslator implements Translator.ScriptTranslator {
                 traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
             }
             // clip off __.
-            if (this.importStatics && traversalScript.substring(0, 3).startsWith(this.anonymousTraversal + ".")
+            if (this.importStatics && traversalScript.substring(0, 3).startsWith("__.")
                     && !NO_STATIC.stream().filter(name -> traversalScript.substring(3).startsWith(SymbolHelper.toPython(name))).findAny().isPresent()) {
                 traversalScript.delete(0, 3);
             }
@@ -170,14 +156,13 @@ public final class PythonTranslator implements Translator.ScriptTranslator {
         else if (object instanceof Element)
             return convertToString(((Element) object).id()); // hack
         else if (object instanceof Bytecode)
-            return this.internalTranslate(this.anonymousTraversal, (Bytecode) object);
-        else if (object instanceof Computer) {
+            return this.internalTranslate("__", (Bytecode) object);
+        else if (object instanceof Computer)
             return "";
-        } else if (object instanceof Lambda) {
-            final String lambdaString = ((Lambda) object).getLambdaScript();
-            return lambdaString.startsWith("lambda") ? lambdaString : "lambda: \"" + lambdaString + "\"";
-        } else
-            return null == object ? "" : object.toString();
+        else if (object instanceof Lambda)
+            return convertLambdaToString((Lambda) object);
+        else
+            return null == object ? "None" : object.toString();
     }
 
     private String convertStatic(final String name) {
@@ -198,4 +183,9 @@ public final class PythonTranslator implements Translator.ScriptTranslator {
         return current;
     }
 
+    protected String convertLambdaToString(final Lambda lambda) {
+        final String lambdaString = lambda.getLambdaScript().trim();
+        return lambdaString.startsWith("lambda") ? lambdaString : "lambda " + lambdaString;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/main/jython/gremlin_python/process/graphson.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/process/graphson.py b/gremlin-python/src/main/jython/gremlin_python/process/graphson.py
index b353f2c..1474f26 100644
--- a/gremlin-python/src/main/jython/gremlin_python/process/graphson.py
+++ b/gremlin-python/src/main/jython/gremlin_python/process/graphson.py
@@ -109,13 +109,20 @@ class BindingSerializer(GraphSONSerializer):
 
 class LambdaSerializer(GraphSONSerializer):
     def _dictify(self, lambdaObject):
-        lambdaString = lambdaObject()
+        lambdaResult = lambdaObject()
         dict = {}
         dict["@type"] = "Lambda"
-        dict["value"] = lambdaString if isinstance(lambdaString, str) else lambdaString[0]
-        dict["language"] = statics.default_lambda_language if isinstance(lambdaString, str) else lambdaString[1]
-        if dict["language"] is "gremlin-jython":
+        script = lambdaResult if isinstance(lambdaResult, str) else lambdaResult[0]
+        language = statics.default_lambda_language if isinstance(lambdaResult, str) else lambdaResult[1]
+        dict["value"] = script
+        dict["language"] = language
+        if language == "gremlin-jython" or language == "gremlin-python":
+            if not script.strip().startswith("lambda"):
+                script = "lambda " + script
+                dict["value"] = script
             dict["arguments"] = eval(dict["value"]).func_code.co_argcount
+        else:
+            dict["arguments"] = -1
         return dict
 
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/main/jython/gremlin_python/statics.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/statics.py b/gremlin-python/src/main/jython/gremlin_python/statics.py
index cfdc217..293ff93 100644
--- a/gremlin-python/src/main/jython/gremlin_python/statics.py
+++ b/gremlin-python/src/main/jython/gremlin_python/statics.py
@@ -20,7 +20,7 @@ from aenum import Enum
 
 staticMethods = {}
 staticEnums = {}
-default_lambda_language = "gremlin-jython"
+default_lambda_language = "gremlin-python"
 
 
 def add_static(key, value):

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/RESTRemoteConnectionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/RESTRemoteConnectionTest.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/RESTRemoteConnectionTest.java
deleted file mode 100644
index a2275e5..0000000
--- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/RESTRemoteConnectionTest.java
+++ /dev/null
@@ -1,121 +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.python.driver;
-
-import org.apache.tinkerpop.gremlin.python.jsr223.JythonScriptEngineSetup;
-import org.apache.tinkerpop.gremlin.server.GremlinServer;
-import org.apache.tinkerpop.gremlin.server.Settings;
-import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class RESTRemoteConnectionTest {
-
-    private static final ScriptEngine jython = ScriptEngineCache.get("jython");
-
-    private final List<String> aliases = Arrays.asList("g", "j");
-
-    @BeforeClass
-    public static void setup() {
-        try {
-            JythonScriptEngineSetup.setup();
-            jython.getContext().getBindings(ScriptContext.ENGINE_SCOPE)
-                    .put("g", jython.eval("RemoteGraph(WebSocketRemoteConnection('ws://localhost:8182','g')).traversal()"));
-            jython.getContext().getBindings(ScriptContext.ENGINE_SCOPE)
-                    .put("j", jython.eval("RemoteGraph(WebSocketRemoteConnection('ws://localhost:8182','g')).traversal()"));
-            new GremlinServer(Settings.read(RESTRemoteConnectionTest.class.getResourceAsStream("gremlin-server-rest-modern.yaml"))).start().join();
-        } catch (final Exception ex) {
-            ex.printStackTrace();
-        }
-    }
-
-    @Test
-    @org.junit.Ignore
-    public void testGraphTraversalNext() throws Exception {
-        for (final String alias : this.aliases) {
-            final String result = (String) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next()");
-            assertTrue(result.equals("lop") || result.equals("ripple"));
-        }
-    }
-
-    @Test
-    @org.junit.Ignore
-    public void testGraphTraversalToList() throws Exception {
-        for (final String alias : this.aliases) {
-            final List<String> results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.toList()");
-            assertEquals(2, results.size());
-            assertTrue(results.contains("lop"));
-            assertTrue(results.contains("ripple"));
-        }
-    }
-
-    @Test
-    @org.junit.Ignore
-    public void testGraphTraversalToSet() throws Exception {
-        for (final String alias : this.aliases) {
-            final Set<String> results = (Set) jython.eval(alias + ".V().repeat(__.both()).times(4).hasLabel('software').name.toSet()");
-            assertEquals(2, results.size());
-            assertTrue(results.contains("lop"));
-            assertTrue(results.contains("ripple"));
-        }
-    }
-
-    @Test
-    @org.junit.Ignore
-    public void testGraphTraversalNextAmount() throws Exception {
-        for (final String alias : this.aliases) {
-            List<String> results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next(2)");
-            assertEquals(2, results.size());
-            assertTrue(results.contains("lop"));
-            assertTrue(results.contains("ripple"));
-            //
-            results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next(4)");
-            assertEquals(2, results.size());
-            assertTrue(results.contains("lop"));
-            assertTrue(results.contains("ripple"));
-        }
-    }
-
-    @Test
-    @org.junit.Ignore
-    public void testRemoteConnectionBindings() throws Exception {
-        for (final String alias : this.aliases) {
-            final String traversalScript = jython.eval(alias + ".V().out(('a','knows'),'created')").toString();
-            assertEquals(traversalScript, "g.V().out(a, \"created\")"); // ensure the traversal string is binding based
-            final List<String> results = (List) jython.eval(alias + ".V().out(('a','knows')).out('created').name.next(2)");
-            assertEquals(2, results.size());
-            assertTrue(results.contains("lop"));
-            assertTrue(results.contains("ripple"));
-
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/WebSocketRemoteConnectionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/WebSocketRemoteConnectionTest.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/WebSocketRemoteConnectionTest.java
new file mode 100644
index 0000000..434056d
--- /dev/null
+++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/driver/WebSocketRemoteConnectionTest.java
@@ -0,0 +1,121 @@
+/*
+ *  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.driver;
+
+import org.apache.tinkerpop.gremlin.python.jsr223.JythonScriptEngineSetup;
+import org.apache.tinkerpop.gremlin.server.GremlinServer;
+import org.apache.tinkerpop.gremlin.server.Settings;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class WebSocketRemoteConnectionTest {
+
+    private static final ScriptEngine jython = ScriptEngineCache.get("jython");
+
+    private final List<String> aliases = Arrays.asList("g", "j");
+
+    @BeforeClass
+    public static void setup() {
+        try {
+            JythonScriptEngineSetup.setup();
+            jython.getContext().getBindings(ScriptContext.ENGINE_SCOPE)
+                    .put("g", jython.eval("RemoteGraph(WebSocketRemoteConnection('ws://localhost:8182','g')).traversal()"));
+            jython.getContext().getBindings(ScriptContext.ENGINE_SCOPE)
+                    .put("j", jython.eval("RemoteGraph(WebSocketRemoteConnection('ws://localhost:8182','g')).traversal()"));
+            new GremlinServer(Settings.read(WebSocketRemoteConnectionTest.class.getResourceAsStream("gremlin-server-rest-modern.yaml"))).start().join();
+        } catch (final Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    @Test
+    @org.junit.Ignore
+    public void testGraphTraversalNext() throws Exception {
+        for (final String alias : this.aliases) {
+            final String result = (String) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next()");
+            assertTrue(result.equals("lop") || result.equals("ripple"));
+        }
+    }
+
+    @Test
+    @org.junit.Ignore
+    public void testGraphTraversalToList() throws Exception {
+        for (final String alias : this.aliases) {
+            final List<String> results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.toList()");
+            assertEquals(2, results.size());
+            assertTrue(results.contains("lop"));
+            assertTrue(results.contains("ripple"));
+        }
+    }
+
+    @Test
+    @org.junit.Ignore
+    public void testGraphTraversalToSet() throws Exception {
+        for (final String alias : this.aliases) {
+            final Set<String> results = (Set) jython.eval(alias + ".V().repeat(__.both()).times(4).hasLabel('software').name.toSet()");
+            assertEquals(2, results.size());
+            assertTrue(results.contains("lop"));
+            assertTrue(results.contains("ripple"));
+        }
+    }
+
+    @Test
+    @org.junit.Ignore
+    public void testGraphTraversalNextAmount() throws Exception {
+        for (final String alias : this.aliases) {
+            List<String> results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next(2)");
+            assertEquals(2, results.size());
+            assertTrue(results.contains("lop"));
+            assertTrue(results.contains("ripple"));
+            //
+            results = (List) jython.eval(alias + ".V().repeat(__.out()).times(2).name.next(4)");
+            assertEquals(2, results.size());
+            assertTrue(results.contains("lop"));
+            assertTrue(results.contains("ripple"));
+        }
+    }
+
+    @Test
+    @org.junit.Ignore
+    public void testRemoteConnectionBindings() throws Exception {
+        for (final String alias : this.aliases) {
+            final String traversalScript = jython.eval(alias + ".V().out(('a','knows'),'created')").toString();
+            assertEquals(traversalScript, "g.V().out(a, \"created\")"); // ensure the traversal string is binding based
+            final List<String> results = (List) jython.eval(alias + ".V().out(('a','knows')).out('created').name.next(2)");
+            assertEquals(2, results.size());
+            assertTrue(results.contains("lop"));
+            assertTrue(results.contains("ripple"));
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslatorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslatorTest.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslatorTest.java
new file mode 100644
index 0000000..9f6dd42
--- /dev/null
+++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonTranslatorTest.java
@@ -0,0 +1,87 @@
+/*
+ *  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.jsr223;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+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.strategy.decoration.TranslationStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
+import org.apache.tinkerpop.gremlin.util.function.Lambda;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class JythonTranslatorTest {
+
+    @Test
+    public void shouldSupportStringSupplierLambdas() throws Exception {
+        GraphTraversalSource g = TinkerFactory.createModern().traversal();
+        g = g.withStrategies(new TranslationStrategy(g, JythonTranslator.of("g")));
+        GraphTraversal.Admin<Vertex, Integer> t = g.withSideEffect("lengthSum", 0).withSack(1)
+                .V()
+                .filter(Lambda.predicate("x : x.get().label() == 'person'"))
+                .flatMap(Lambda.function("lambda x : x.get().vertices(Direction.OUT)"))
+                .map(Lambda.<Traverser<Object>, Integer>function("lambda x : len(x.get().value('name'))"))
+                .sideEffect(Lambda.consumer(" x : x.sideEffects(\"lengthSum\", x.sideEffects('lengthSum') + x.get())    "))
+                .order().by(Lambda.comparator("  lambda a,b : 0 if a == b else 1 if a > b else -1"))
+                .sack(Lambda.biFunction("lambda a,b : a + b"))
+                .asAdmin();
+        final List<Integer> sacks = new ArrayList<>();
+        final List<Integer> lengths = new ArrayList<>();
+        while (t.hasNext()) {
+            final Traverser.Admin<Integer> traverser = t.nextTraverser();
+            sacks.add(traverser.sack());
+            lengths.add(traverser.get());
+        }
+        assertFalse(t.hasNext());
+        //
+        assertEquals(6, lengths.size());
+        assertEquals(3, lengths.get(0).intValue());
+        assertEquals(3, lengths.get(1).intValue());
+        assertEquals(3, lengths.get(2).intValue());
+        assertEquals(4, lengths.get(3).intValue());
+        assertEquals(5, lengths.get(4).intValue());
+        assertEquals(6, lengths.get(5).intValue());
+        ///
+        assertEquals(6, sacks.size());
+        assertEquals(4, sacks.get(0).intValue());
+        assertEquals(4, sacks.get(1).intValue());
+        assertEquals(4, sacks.get(2).intValue());
+        assertEquals(5, sacks.get(3).intValue());
+        assertEquals(6, sacks.get(4).intValue());
+        assertEquals(7, sacks.get(5).intValue());
+        //
+        assertEquals(24, t.getSideEffects().<Number>get("lengthSum").intValue());
+    }
+
+    @Test
+    public void shouldHaveValidToString() {
+        assertEquals("translator[h:gremlin-jython]", JythonTranslator.of("h").toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java
index f4e5cc7..2a3e2b9 100644
--- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java
+++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonGraphSONJavaTranslator.java
@@ -52,11 +52,6 @@ final class PythonGraphSONJavaTranslator<S extends TraversalSource, T extends Tr
     }
 
     @Override
-    public Class getAnonymousTraversal() {
-        return this.javaTranslator.getAnonymousTraversal();
-    }
-
-    @Override
     public String getTargetLanguage() {
         return this.javaTranslator.getTargetLanguage();
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java
index 1414f8b..2c26084 100644
--- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java
+++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java
@@ -157,7 +157,7 @@ public class PythonProvider extends AbstractGraphProvider {
                 throw new IllegalStateException(e.getMessage(), e);
             }
             final GraphTraversalSource g = graph.traversal();
-            return g.withStrategies(new TranslationStrategy(g, new PythonGraphSONJavaTranslator<>(PythonTranslator.of("g", "__", IMPORT_STATICS), JavaTranslator.of(g))));
+            return g.withStrategies(new TranslationStrategy(g, new PythonGraphSONJavaTranslator<>(PythonTranslator.of("g", IMPORT_STATICS), JavaTranslator.of(g))));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java
index 571cbb5..e170cb1 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java
@@ -32,6 +32,6 @@ public class RemoteGraphGroovyTranslatorProvider extends RemoteGraphProvider {
     @Override
     public GraphTraversalSource traversal(final Graph graph) {
         final GraphTraversalSource g = graph.traversal();
-        return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g", "__")));
+        return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g")));
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java
index 5292e7e..f7a9357 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java
@@ -69,7 +69,7 @@ public class TinkerGraphGroovyTranslatorProvider extends TinkerGraphProvider {
             //throw new VerificationException("This test current does not work with Gremlin-Python", EmptyTraversal.instance());
         else {
             final GraphTraversalSource g = graph.traversal();
-            return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g", "__")));
+            return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g")));
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f1a0e919/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/GraphSONTranslator.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/GraphSONTranslator.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/GraphSONTranslator.java
index 452affe..5b63082 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/GraphSONTranslator.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/GraphSONTranslator.java
@@ -50,11 +50,6 @@ final class GraphSONTranslator<S extends TraversalSource, T extends Traversal.Ad
     }
 
     @Override
-    public Class getAnonymousTraversal() {
-        return this.wrappedTranslator.getAnonymousTraversal();
-    }
-
-    @Override
     public T translate(final Bytecode bytecode) {
         try {
             final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();