Merge branch 'tp32'

Conflicts:
        gremlin-dotnet/pom.xml
        gremlin-dotnet/test/pom.xml
        gremlin-groovy-test/pom.xml
        gremlin-python/pom.xml
        
gremlin-python/src/test/resources/org/apache/tinkerpop/gremlin/python/driver/gremlin-server-modern-secure-py.yaml


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

Branch: refs/heads/TINKERPOP-1730
Commit: 0f6a32ca2274f9a60e110f19c8500dbca6114ae4
Parents: aad6d39 cb99ddb
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Tue Sep 19 08:26:31 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Tue Sep 19 08:26:31 2017 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 giraph-gremlin/pom.xml                          |  14 +
 gremlin-console/pom.xml                         |  14 +
 gremlin-dotnet/glv/generate.groovy              | 228 +++++++++++++++
 gremlin-dotnet/pom.xml                          | 224 +--------------
 .../appsettings.json                            |   4 +-
 gremlin-dotnet/test/pom.xml                     |  96 ++-----
 gremlin-groovy-test/pom.xml                     |   0
 gremlin-groovy/pom.xml                          |  14 +
 .../glv/GraphTraversalSource.template           | 107 +++++++
 gremlin-python/glv/TraversalSource.template     | 282 +++++++++++++++++++
 gremlin-python/glv/generate.groovy              |  90 ++++++
 gremlin-python/pom.xml                          | 172 +++--------
 .../resources/GraphTraversalSource.template     | 107 -------
 .../src/main/resources/TraversalSource.template | 282 -------------------
 .../gremlin/python/driver/credentials.kryo      | Bin 138 -> 0 bytes
 .../python/driver/generate-modern.groovy        |  33 ---
 .../driver/gremlin-server-modern-secure-py.yaml |  60 ----
 .../driver/tinkergraph-credentials.properties   |  22 --
 .../python/driver/tinkergraph-empty.properties  |  18 --
 .../gremlin/server/util/MetricManager.java      |   5 +-
 .../src/test/scripts/test-server-start.groovy   |  60 ++++
 .../src/test/scripts/test-server-stop.groovy    |  32 +++
 hadoop-gremlin/pom.xml                          |  14 +
 pom.xml                                         |  16 +-
 spark-gremlin/pom.xml                           |  14 +
 26 files changed, 958 insertions(+), 951 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/CHANGELOG.asciidoc
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/giraph-gremlin/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-console/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/glv/generate.groovy
----------------------------------------------------------------------
diff --cc gremlin-dotnet/glv/generate.groovy
index 0000000,8f66c26..95ee969
mode 000000,100644..100644
--- a/gremlin-dotnet/glv/generate.groovy
+++ b/gremlin-dotnet/glv/generate.groovy
@@@ -1,0 -1,220 +1,228 @@@
+ /*
+  * 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.
+  */
+ 
+ import org.apache.tinkerpop.gremlin.jsr223.CoreImports
+ 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.P
+ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+ import org.apache.tinkerpop.gremlin.structure.Direction
+ import java.lang.reflect.Modifier
+ 
+ def toCSharpTypeMap = ["Long": "long",
+                        "Integer": "int",
+                        "String": "string",
+                        "Object": "object",
+                        "java.util.Map<java.lang.String, E2>": 
"IDictionary<string, E2>",
+                        "java.util.Map<java.lang.String, B>": 
"IDictionary<string, E2>",
++                       "java.util.Map<java.lang.Object, E2>": 
"IDictionary<object, E2>",
++                       "java.util.Map<java.lang.Object, B>": 
"IDictionary<object, E2>",
+                        "java.util.List<E>": "IList<E>",
+                        "java.util.Map<K, V>": "IDictionary<K, V>",
+                        "java.util.Collection<E2>": "ICollection<E2>",
+                        "java.util.Collection<B>": "ICollection<E2>",
+                        "java.util.Map<K, java.lang.Long>": "IDictionary<K, 
long>",
+                        "TraversalMetrics": "E2"]
+ 
+ def useE2 = ["E2", "E2"];
+ def methodsWithSpecificTypes = ["constant": useE2,
+                                 "limit": useE2,
+                                 "mean": useE2,
+                                 "optional": useE2,
+                                 "range": useE2,
+                                 "select": ["IDictionary<string, E2>", "E2"],
++                                "skip": useE2,
+                                 "sum": useE2,
+                                 "tail": useE2,
+                                 "tree": ["object"],
 -                                "unfold": useE2]
++                                "unfold": useE2,
++                                "valueMap": ["IDictionary<TKey, TValue>", 
"TKey, TValue"],]
+ 
+ def getCSharpGenericTypeParam = { typeName ->
+     def tParam = ""
+     if (typeName.contains("E2")) {
+         tParam = "<E2>"
+     }
+     else if (typeName.contains("<K, V>")) {
+         tParam = "<K, V>"
+     }
+     else if (typeName.contains("<K, ")) {
+         tParam = "<K>"
+     }
+     return tParam
+ }
+ 
+ def toCSharpType = { name ->
+     String typeName = toCSharpTypeMap.getOrDefault(name, name);
+     if (typeName.equals(name) && (typeName.contains("? extends") || 
typeName.equals("Tree"))) {
+         typeName = "E2"
+     }
+     return typeName;
+ }
+ 
+ def toCSharpMethodName = { symbol -> (String) 
Character.toUpperCase(symbol.charAt(0)) + symbol.substring(1) }
+ 
+ def getJavaParameterTypeNames = { method ->
+     def typeArguments = method.genericReturnType.actualTypeArguments;
+     return typeArguments.
+             collect { (it instanceof Class) ? ((Class)it).simpleName : 
it.typeName }.
+             collect { name ->
+                 if (name.equals("A")) {
+                     name = "object"
+                 }
+                 else if (name.equals("B")) {
+                     name = "E2";
+                 }
+                 name
+             }
+ }
+ 
+ def binding = ["pmethods": P.class.getMethods().
+         findAll { Modifier.isStatic(it.getModifiers()) }.
+         findAll { P.class.isAssignableFrom(it.returnType) }.
+         collect { it.name }.
+         unique().
+         sort { a, b -> a <=> b },
+                "sourceStepMethods": GraphTraversalSource.getMethods(). // 
SOURCE STEPS
+                        findAll { 
GraphTraversalSource.class.equals(it.returnType) }.
+                        findAll {
+                            !it.name.equals("clone") &&
 -                                   
!it.name.equals(TraversalSource.Symbols.withBindings) &&
+                                    
!it.name.equals(TraversalSource.Symbols.withRemote) &&
+                                    
!it.name.equals(TraversalSource.Symbols.withComputer)
+                        }.
+                        collect { it.name }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "sourceSpawnMethods": GraphTraversalSource.getMethods(). // 
SPAWN STEPS
+                        findAll { GraphTraversal.class.equals(it.returnType) 
&& !it.name.equals('inject')}.
+                        collect { [methodName: it.name, typeArguments: 
it.genericReturnType.actualTypeArguments.collect{t -> 
((java.lang.Class)t).simpleName}] }.
+                        unique().
+                        sort { a, b -> a.methodName <=> b.methodName },
+                "graphStepMethods": GraphTraversal.getMethods().
+                        findAll { GraphTraversal.class.equals(it.returnType) }.
+                        findAll { !it.name.equals("clone") && 
!it.name.equals("iterate") }.
+                        groupBy { it.name }.
+                // Select unique by name, with the most amount of parameters
+                        collect { it.value.sort { a, b -> b.parameterCount <=> 
a.parameterCount }.first() }.
+                        sort { a, b -> a.name <=> b.name }.
+                        collect { javaMethod ->
+                            def typeNames = 
getJavaParameterTypeNames(javaMethod)
+                            def t1 = toCSharpType(typeNames[0])
+                            def t2 = toCSharpType(typeNames[1])
+                            def tParam = getCSharpGenericTypeParam(t2)
++                           def specificTypes = 
methodsWithSpecificTypes.get(javaMethod.name)
++                           if (specificTypes) {
++                               t2 = specificTypes[0]
++                               tParam = specificTypes.size() > 1 ? "<" + 
specificTypes[1] + ">" : ""
++                           }
+                            return ["methodName": javaMethod.name, "t1":t1, 
"t2":t2, "tParam":tParam]
+                        },
+                "anonStepMethods": __.class.getMethods().
+                        findAll { GraphTraversal.class.equals(it.returnType) }.
+                        findAll { Modifier.isStatic(it.getModifiers()) }.
+                        findAll { !it.name.equals("__") && 
!it.name.equals("start") }.
+                        groupBy { it.name }.
+                // Select unique by name, with the most amount of parameters
+                        collect { it.value.sort { a, b -> b.parameterCount <=> 
a.parameterCount }.first() }.
+                        sort { it.name }.
+                        collect { javaMethod ->
+                            def typeNames = 
getJavaParameterTypeNames(javaMethod)
+                            def t2 = toCSharpType(typeNames[1])
+                            def tParam = getCSharpGenericTypeParam(t2)
+                            def specificTypes = 
methodsWithSpecificTypes.get(javaMethod.name)
+                            if (specificTypes) {
+                                t2 = specificTypes[0]
+                                tParam = specificTypes.size() > 1 ? "<" + 
specificTypes[1] + ">" : ""
+                            }
+                            return ["methodName": javaMethod.name, "t2":t2, 
"tParam":tParam]
+                        },
+                "toCSharpMethodName": toCSharpMethodName]
+ 
+ def engine = new groovy.text.GStringTemplateEngine()
+ def traversalTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/GraphTraversal.template")).make(binding)
+ def traversalFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs")
+ traversalFile.newWriter().withWriter{ it << traversalTemplate }
+ 
+ def graphTraversalTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/GraphTraversalSource.template")).make(binding)
+ def graphTraversalFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs")
+ graphTraversalFile.newWriter().withWriter{ it << graphTraversalTemplate }
+ 
+ def anonymousTraversalTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/AnonymousTraversal.template")).make(binding)
+ def anonymousTraversalFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/__.cs")
+ anonymousTraversalFile.newWriter().withWriter{ it << 
anonymousTraversalTemplate }
+ 
+ def pTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/P.template")).make(binding)
+ def pFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/P.cs")
+ pFile.newWriter().withWriter{ it << pTemplate }
+ 
+ // Process enums
+ def toCSharpName = { enumClass, itemName ->
+     if (enumClass.equals(Direction.class)) {
+         itemName = itemName.toLowerCase()
+     }
+ 
+     return itemName.substring(0, 1).toUpperCase() + itemName.substring(1)
+ }
+ 
+ def createEnum = { enumClass, csharpToJava ->
+     def b = ["enumClass": enumClass,
+              "constants": enumClass.getEnumConstants().
+                      sort { a, b -> a.name() <=> b.name() }.
+                      collect { value ->
+                          def csharpName = toCSharpName(enumClass, 
value.name())
+                          csharpToJava.put(enumClass.simpleName + "." + 
csharpName, value.name())
+                          return csharpName
+                      }.join(",\n\t\t")]
+ 
+     def enumTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/Enum.template")).make(b)
+     def enumFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/" + 
enumClass.getSimpleName() + ".cs")
+     enumFile.newWriter().withWriter{ it << enumTemplate }
+ }
+ 
+ def enumCSharpToJavaNames = [:]
+ CoreImports.getClassImports().findAll { Enum.class.isAssignableFrom(it) }.
+         sort { a, b -> a.getSimpleName() <=> b.getSimpleName() }.
+         each { createEnum(it, enumCSharpToJavaNames) }
+ 
+ def lastIndex = (enumCSharpToJavaNames.size() - 1);
+ def body = new StringBuilder()
+ enumCSharpToJavaNames.eachWithIndex{ node, i ->
+     body.append("""{"$node.key", "$node.value"}""")
+     body.append(i == lastIndex ? "\n" : ",\n            ")
+ }
+ 
+ def namingConversionsTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/NamingConversions.template")).make(["body":body])
+ def namingConversionsFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/NamingConversions.cs")
+ namingConversionsFile.newWriter().withWriter{ it << namingConversionsTemplate 
}
+ 
+ def determineVersion = {
+     def env = System.getenv()
+     def mavenVersion = env.containsKey("TP_RELEASE_VERSION") ? 
env.get("DOTNET_RELEASE_VERSION") : "${projectVersion}"
+ 
+     // only want to generate a timestamp for the version if this is a nuget 
deploy
+     if (!mavenVersion.endsWith("-SNAPSHOT") || null == 
System.getProperty("nuget")) return mavenVersion
+ 
+     return mavenVersion.replace("-SNAPSHOT", "-dev-" + 
System.currentTimeMillis())
+ }
+ 
+ def versionToUse = determineVersion()
+ def csprojTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/Gremlin.Net.csproj.template")).make(["projectVersion":versionToUse])
+ def csprojFile = new 
File("${projectBaseDir}/src/Gremlin.Net/Gremlin.Net.csproj")
+ csprojFile.newWriter().withWriter{ it << csprojTemplate }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/test/pom.xml
----------------------------------------------------------------------
diff --cc gremlin-dotnet/test/pom.xml
index 0a747c0,7b82a2e..7ac61b1
--- a/gremlin-dotnet/test/pom.xml
+++ b/gremlin-dotnet/test/pom.xml
@@@ -128,54 -128,22 +128,26 @@@ limitations under the License
                                      <goal>execute</goal>
                                  </goals>
                                  <configuration>
+                                     <properties>
+                                         <property>
+                                             <name>skipTests</name>
+                                             <value>${skipTests}</value>
+                                         </property>
+                                         <property>
+                                             <name>gremlinServerDir</name>
+                                             
<value>${gremlin.server.dir}</value>
+                                         </property>
+                                         <property>
+                                             <name>executionName</name>
+                                             <value>${project.name}</value>
+                                         </property>
++                                        <property>
++                                            <name>projectBaseDir</name>
++                                            <value>${project.basedir}</value>
++                                        </property>
+                                     </properties>
                                      <scripts>
-                                         <script>
-                                             <![CDATA[
- import org.apache.tinkerpop.gremlin.server.GremlinServer
- import org.apache.tinkerpop.gremlin.server.Settings
- import org.apache.tinkerpop.gremlin.server.Settings.ScriptEngineSettings
- import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings
- import java.util.Properties
- 
- if (${skipTests}) return
- 
- log.info("Starting Gremlin Server instances for native testing of 
gremlin-dotnet")
- def settings = 
Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern.yaml")
- settings.graphs.graph = 
"${gremlin.server.dir}/conf/tinkergraph-empty.properties"
- 
settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = ["${gremlin.server.dir}/scripts/generate-modern.groovy"]
- settings.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
- settings.port = 45950
- 
- def server = new GremlinServer(settings)
- server.start().join()
- 
- project.setContextValue("gremlin.dotnet.server", server)
- log.info("Gremlin Server with no authentication started on port 45950")
- 
- def securePropsFile = new 
File('${project.basedir}/target/tinkergraph-credentials.properties')
- if (!securePropsFile.exists()) {
-   securePropsFile.createNewFile()
-   securePropsFile << 
"gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph\n"
-   securePropsFile << "gremlin.tinkergraph.vertexIdManager=LONG\n"
-   securePropsFile << 
"gremlin.tinkergraph.graphLocation=${gremlin.server.dir}/data/credentials.kryo\n"
-   securePropsFile << "gremlin.tinkergraph.graphFormat=gryo"
- }
- 
- def settingsSecure = 
Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern.yaml")
- settingsSecure.graphs.graph = 
"${gremlin.server.dir}/conf/tinkergraph-empty.properties"
- 
settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = ["${gremlin.server.dir}/scripts/generate-modern.groovy"]
- settingsSecure.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
- settingsSecure.port = 45951
- settingsSecure.authentication.authenticator = 
"org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator"
- settingsSecure.authentication.config = [credentialsDb: 
"${project.basedir}/target/tinkergraph-credentials.properties"]
- 
- def serverSecure = new GremlinServer(settingsSecure)
- serverSecure.start().join()
- 
- project.setContextValue("gremlin.dotnet.server.secure", serverSecure)
- log.info("Gremlin Server with authentication started on port 45951")
- ]]>
-                                         </script>
+                                         
<script>${gremlin.server.dir}/src/test/scripts/test-server-start.groovy</script>
                                      </scripts>
                                  </configuration>
                              </execution>

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-groovy-test/pom.xml
----------------------------------------------------------------------
diff --cc gremlin-groovy-test/pom.xml
index e69de29,4fa6ea5..0000000
deleted file mode 100644,100644
--- a/gremlin-groovy-test/pom.xml
+++ /dev/null

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-groovy/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/glv/GraphTraversalSource.template
----------------------------------------------------------------------
diff --cc gremlin-python/glv/GraphTraversalSource.template
index 0000000,54b339e..91f6a17
mode 000000,100644..100644
--- a/gremlin-python/glv/GraphTraversalSource.template
+++ b/gremlin-python/glv/GraphTraversalSource.template
@@@ -1,0 -1,102 +1,107 @@@
+ '''
+ 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.
+ '''
+ 
+ import sys
+ from .traversal import Traversal
+ from .traversal import TraversalStrategies
+ from .strategies import VertexProgramStrategy
+ from .traversal import Bytecode
+ from ..driver.remote_connection import RemoteStrategy
+ from .. import statics
+ from ..statics import long
+ 
+ class GraphTraversalSource(object):
+     def __init__(self, graph, traversal_strategies, bytecode=None):
+         self.graph = graph
+         self.traversal_strategies = traversal_strategies
+         if bytecode is None:
+           bytecode = Bytecode()
+         self.bytecode = bytecode
+         self.graph_traversal = GraphTraversal
+     def __repr__(self):
+         return "graphtraversalsource[" + str(self.graph) + "]"
+     def get_graph_traversal_source(self):
+         return self.__class__(self.graph, 
TraversalStrategies(self.traversal_strategies), Bytecode(self.bytecode))
+     def get_graph_traversal(self):
+         return self.graph_traversal(self.graph, self.traversal_strategies, 
Bytecode(self.bytecode))
+ 
+ <% sourceStepMethods.each{ method -> %>
+     def <%= method %>(self, *args):
+         source = self.get_graph_traversal_source()
+         source.bytecode.add_source("<%= toJava.call(method) %>", *args)
+         return source
+ <% } %>
+ 
+     def withRemote(self, remote_connection):
+         source = self.get_graph_traversal_source()
+         
source.traversal_strategies.add_strategies([RemoteStrategy(remote_connection)])
+         return source
+     def withComputer(self,graph_computer=None, workers=None, result=None, 
persist=None, vertices=None, edges=None, configuration=None):
+         return 
self.withStrategies(VertexProgramStrategy(graph_computer,workers,result,persist,vertices,edges,configuration))
+ 
+ <% sourceSpawnMethods.each { method -> %>
+     def <%= method %>(self, *args):
+         traversal = self.get_graph_traversal()
+         traversal.bytecode.add_step("<%= toJava.call(method) %>", *args)
+         return traversal
+ <% } %>
+ 
+ class GraphTraversal(Traversal):
+     def __init__(self, graph, traversal_strategies, bytecode):
+         super(GraphTraversal, self).__init__(graph, traversal_strategies, 
bytecode)
+     def __getitem__(self, index):
+         if isinstance(index, int):
+             return self.range(long(index), long(index + 1))
+         elif isinstance(index, slice):
 -            return self.range(long(0) if index.start is None else 
long(index.start), long(sys.maxsize) if index.stop is None else 
long(index.stop))
++            low = long(0) if index.start is None else long(index.start)
++            high = long(sys.maxsize) if index.stop is None else 
long(index.stop)
++            if low == long(0):
++                return self.limit(high)
++            else:
++                return self.range(low,high)
+         else:
+             raise TypeError("Index must be int or slice")
+     def __getattr__(self, key):
+         return self.values(key)
+ <% graphStepMethods.each { method -> %>
+     def <%= method %>(self, *args):
+         self.bytecode.add_step("<%= toJava.call(method) %>", *args)
+         return self
+ <% } %>
+ 
+ class __(object):
+     graph_traversal = GraphTraversal
+     @classmethod
+     def start(cls):
+         return GraphTraversal(None, None, Bytecode())
+     @classmethod
+     def __(cls, *args):
+         return __.inject(*args)
+ 
+ <% anonStepMethods.each{ method -> %>
+     @classmethod
+     def <%= method %>(cls, *args):
+         return cls.graph_traversal(None, None, Bytecode()).<%= method 
%>(*args)
+ <% } %>
+ 
+ <% anonStepMethods.each{ method -> %>
+ def <%= method %>(*args):
+     return __.<%= method %>(*args)
+ statics.add_static('<%= method %>', <%= method %>)
+ <% } %>

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/glv/generate.groovy
----------------------------------------------------------------------
diff --cc gremlin-python/glv/generate.groovy
index 0000000,4873d12..58d0cd3
mode 000000,100644..100644
--- a/gremlin-python/glv/generate.groovy
+++ b/gremlin-python/glv/generate.groovy
@@@ -1,0 -1,94 +1,90 @@@
+ /*
+  * 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.
+  */
+ 
+ import org.apache.tinkerpop.gremlin.jsr223.CoreImports
+ 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.P
+ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+ import java.lang.reflect.Modifier
 -
+ // this is a bit of a copy of what's in SymbolHelper - no way around it 
because this code generation task occurs
+ // before the SymbolHelper is available to the plugin.
+ def toPythonMap = ["global": "global_",
+                    "as": "as_",
+                    "in": "in_",
+                    "and": "and_",
+                    "or": "or_",
+                    "is": "is_",
+                    "not": "not_",
+                    "from": "from_",
+                    "list": "list_",
+                    "set": "set_",
+                    "all": "all_"]
+ def toJavaMap = toPythonMap.collectEntries{k,v -> [(v):k]}
 -
+ def toPython = { symbol -> toPythonMap.getOrDefault(symbol, symbol) }
+ def toJava = { symbol -> toJavaMap.getOrDefault(symbol, symbol) }
 -
+ def binding = ["enums": CoreImports.getClassImports()
+         .findAll { Enum.class.isAssignableFrom(it) }
+         .sort { a, b -> a.getSimpleName() <=> b.getSimpleName() },
+                "pmethods": P.class.getMethods().
+                        findAll { Modifier.isStatic(it.getModifiers()) }.
+                        findAll { P.class.isAssignableFrom(it.returnType) }.
+                        collect { toPython(it.name) }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "sourceStepMethods": GraphTraversalSource.getMethods(). // 
SOURCE STEPS
+                        findAll { 
GraphTraversalSource.class.equals(it.returnType) }.
+                        findAll {
+                            !it.name.equals("clone") &&
 -                                   
!it.name.equals(TraversalSource.Symbols.withBindings) &&
+                                    
!it.name.equals(TraversalSource.Symbols.withRemote) &&
+                                    
!it.name.equals(TraversalSource.Symbols.withComputer)
+                        }.
+                        collect { toPython(it.name) }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "sourceSpawnMethods": GraphTraversalSource.getMethods(). // 
SPAWN STEPS
+                        findAll { GraphTraversal.class.equals(it.returnType) }.
+                        collect { toPython(it.name) }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "graphStepMethods": GraphTraversal.getMethods().
+                        findAll { GraphTraversal.class.equals(it.returnType) }.
+                        findAll { !it.name.equals("clone") && 
!it.name.equals("iterate") }.
+                        collect { toPython(it.name) }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "anonStepMethods": __.class.getMethods().
+                        findAll { GraphTraversal.class.equals(it.returnType) }.
+                        findAll { Modifier.isStatic(it.getModifiers()) }.
+                        findAll { !it.name.equals("__") && 
!it.name.equals("start") }.
+                        collect { toPython(it.name) }.
+                        unique().
+                        sort { a, b -> a <=> b },
+                "toPython": toPython,
+                "toJava": toJava]
+ 
+ def engine = new groovy.text.GStringTemplateEngine()
+ def traversalTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/TraversalSource.template")).make(binding)
+ def traversalFile = new 
File("${projectBaseDir}/src/main/jython/gremlin_python/process/traversal.py")
+ traversalFile.newWriter().withWriter{ it << traversalTemplate }
+ 
+ def graphTraversalTemplate = engine.createTemplate(new 
File("${projectBaseDir}/glv/GraphTraversalSource.template")).make(binding)
+ def graphTraversalFile = new 
File("${projectBaseDir}/src/main/jython/gremlin_python/process/graph_traversal.py")
+ graphTraversalFile.newWriter().withWriter{ it << graphTraversalTemplate }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/pom.xml
----------------------------------------------------------------------
diff --cc gremlin-python/pom.xml
index e298fcd,b60b867..9fcf87d
--- a/gremlin-python/pom.xml
+++ b/gremlin-python/pom.xml
@@@ -572,44 -504,22 +504,26 @@@ limitations under the License
                                      <goal>execute</goal>
                                  </goals>
                                  <configuration>
+                                     <properties>
+                                         <property>
+                                             <name>skipTests</name>
+                                             <value>${skipTests}</value>
+                                         </property>
+                                         <property>
+                                             <name>gremlinServerDir</name>
+                                             
<value>${gremlin.server.dir}</value>
+                                         </property>
+                                         <property>
+                                             <name>executionName</name>
+                                             <value>${project.name}</value>
+                                         </property>
++                                        <property>
++                                            <name>projectBaseDir</name>
++                                            <value>${project.basedir}</value>
++                                        </property>
+                                     </properties>
                                      <scripts>
-                                         <script>
-                                             <![CDATA[
- import org.apache.tinkerpop.gremlin.server.GremlinServer
- import org.apache.tinkerpop.gremlin.server.Settings
- import org.apache.tinkerpop.gremlin.server.Settings.ScriptEngineSettings
- import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings
- 
- if (${skipTests}) return
- 
- log.info("Starting Gremlin Server instances for native testing of 
gremlin-python")
- def settings = 
Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern-py.yaml")
- settings.graphs.graph = 
"${gremlin.server.dir}/conf/tinkergraph-empty.properties"
- 
settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = ["${gremlin.server.dir}/scripts/generate-modern.groovy"]
- settings.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
- settings.port = 45940
- 
- def server = new GremlinServer(settings)
- server.start().join()
- 
- project.setContextValue("gremlin.py.server", server)
- log.info("Gremlin Server with no authentication started on port 45940")
- 
- def settingsSecure = 
Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern-py.yaml")
- settingsSecure.graphs.graph = 
"${gremlin.server.dir}/conf/tinkergraph-empty.properties"
- 
settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = ["${gremlin.server.dir}/scripts/generate-modern.groovy"]
- settings.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
- settingsSecure.port = 45941
- settingsSecure.authentication.authenticator = 
"org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator"
- settingsSecure.authentication.config = [credentialsDb: 
"${gremlin.server.dir}/conf/tinkergraph-credentials.properties"]
- 
- def serverSecure = new GremlinServer(settingsSecure)
- serverSecure.start().join()
- 
- project.setContextValue("gremlin.py.server.secure", serverSecure)
- log.info("Gremlin Server with authentication started on port 45941")
- ]]>
-                                         </script>
+                                         
<script>${gremlin.server.dir}/src/test/scripts/test-server-start.groovy</script>
                                      </scripts>
                                  </configuration>
                              </execution>

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/MetricManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-server/src/test/scripts/test-server-start.groovy
----------------------------------------------------------------------
diff --cc gremlin-server/src/test/scripts/test-server-start.groovy
index 0000000,83efcd5..76bd8ff
mode 000000,100644..100644
--- a/gremlin-server/src/test/scripts/test-server-start.groovy
+++ b/gremlin-server/src/test/scripts/test-server-start.groovy
@@@ -1,0 -1,49 +1,60 @@@
+ /*
+  * 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.
+  */
+ 
+ import org.apache.tinkerpop.gremlin.server.GremlinServer
+ import org.apache.tinkerpop.gremlin.server.Settings
 -import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator
++import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings        
                  
+ 
+ if (Boolean.parseBoolean(skipTests)) return
+ 
+ log.info("Starting Gremlin Server instances for native testing of 
${executionName}")
+ def settings = 
Settings.read("${gremlinServerDir}/conf/gremlin-server-modern-py.yaml")
+ settings.graphs.graph = gremlinServerDir + 
"/conf/tinkergraph-empty.properties"
 -settings.scriptEngines["gremlin-groovy"].scripts = [gremlinServerDir + 
"/scripts/generate-modern.groovy"]
++settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = [gremlinServerDir + "/scripts/generate-modern.groovy"]
++settings.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
+ settings.port = 45940
+ 
+ def server = new GremlinServer(settings)
+ server.start().join()
+ 
+ project.setContextValue("gremlin.server", server)
+ log.info("Gremlin Server with no authentication started on port 45940")
+ 
++def securePropsFile = new 
File("${projectBaseDir}/target/tinkergraph-credentials.properties")
++if (!securePropsFile.exists()) {
++    securePropsFile.createNewFile()
++    securePropsFile << 
"gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph\n"
++    securePropsFile << "gremlin.tinkergraph.vertexIdManager=LONG\n"
++    securePropsFile << 
"gremlin.tinkergraph.graphLocation=${gremlinServerDir}/data/credentials.kryo\n"
++    securePropsFile << "gremlin.tinkergraph.graphFormat=gryo"
++}
++
+ def settingsSecure = 
Settings.read("${gremlinServerDir}/conf/gremlin-server-modern.yaml")
+ settingsSecure.graphs.graph = gremlinServerDir + 
"/conf/tinkergraph-empty.properties"
 -settingsSecure.scriptEngines["gremlin-groovy"].scripts = [gremlinServerDir + 
"/scripts/generate-modern.groovy"]
++settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files
 = [gremlinServerDir + "/scripts/generate-modern.groovy"]
++settingsSecure.serializers << new 
SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0",
 [:])
+ settingsSecure.port = 45941
 -settingsSecure.authentication.className = SimpleAuthenticator.class.name
 -settingsSecure.authentication.config = [credentialsDb: gremlinServerDir + 
"/conf/tinkergraph-credentials.properties", credentialsDbLocation: 
gremlinServerDir + "/data/credentials.kryo"]
++settingsSecure.authentication.authenticator = 
"org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator"
++settingsSecure.authentication.config = [credentialsDb: projectBaseDir + 
"/target/tinkergraph-credentials.properties"]
+ 
+ def serverSecure = new GremlinServer(settingsSecure)
+ serverSecure.start().join()
+ 
+ project.setContextValue("gremlin.server.secure", serverSecure)
+ log.info("Gremlin Server with authentication started on port 45941")

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/hadoop-gremlin/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/spark-gremlin/pom.xml
----------------------------------------------------------------------

Reply via email to