blob: d19e0ddbc7b0043be5f3854d64cab7f34ea5f045 [file] [log] [blame]
<!--
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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>tinkerpop</artifactId>
<version>3.3.10</version>
</parent>
<artifactId>gremlin-python</artifactId>
<name>Apache TinkerPop :: Gremlin Python</name>
<dependencies>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.1</version>
</dependency>
<!-- TESTING -->
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>tinkergraph-gremlin</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-test</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-server</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<!-- provides a way to convert maven.test.skip value to skipTests for use in skipping python tests -->
<maven.test.skip>false</maven.test.skip>
<skipTests>${maven.test.skip}</skipTests>
<gremlin.server.dir>${project.parent.basedir}/gremlin-server</gremlin.server.dir>
</properties>
<build>
<directory>${basedir}/target</directory>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/resources
</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${basedir}/src/test/resources
</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
<configuration>
<filesets>
<!-- SOURCE DIRECTORIES -->
<fileset>
<directory>${basedir}/src/main/jython/gremlin_python</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/gremlin_python/driver</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/gremlin_python/process</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/gremlin_python/structure</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/gremlin_python/structure/io</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<!-- TEST DIRECTORIES -->
<fileset>
<directory>${basedir}/src/main/jython/tests</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/tests/driver</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/tests/process</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/tests/structure</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/src/main/jython/tests/structure/io</directory>
<includes>
<include>**/*.pyc</include>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.py</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<!-- This default profile works around the issue where the glv-python profile which is expected to run all tests
can't override the exclusions defined below. -->
<profile>
<id>glv-python-standard</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<!-- excludes python related tests that require python itself installed on the system - run with the
python profile if glVPython is present -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<python.home>${project.build.outputDirectory}</python.home>
</systemPropertyVariables>
<excludes>
<exclude>**/jsr223/Python*Test.java</exclude>
<exclude>**/graphson/GraphSON*Test.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- activates the building of python components and requires that python be installed on the system -->
<profile>
<id>glv-python</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>.glv</exists>
</file>
</activation>
<build>
<!-- don't exclude any tests as python is assumed to be installed on this system -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<python.home>${project.build.outputDirectory}</python.home>
</systemPropertyVariables>
</configuration>
</plugin>
<!-- need to create python-reports directory at this point or else pytest can't write the report to it -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>create-python-reports-directory</id>
<phase>initialize</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<mkdir dir="${project.build.directory}/python-reports"/>
<mkdir dir="${project.build.directory}/python-packaged/env"/>
</target>
</configuration>
</execution>
<!-- copy files in jython directory to target/py and run virtual env to sandbox python.
there is no need to "activate" the virtualenv because all calls to python occur
directly from bin/ -->
<execution>
<id>setup-py-env</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<!-- seems like we need a few different copies of the same source. all the
different python/jython stuff doesn't seem to want to share. we use
/python for basic tests and stuff, /jython for jython compilation with
the jython plugin, /python-packaged for distribution tasks. some of the
problem seems to stem from the python lifecycle not binding perfectly well
to the maven lifecycle (integration tests seems to cause troubles
specifically). note that the commands to install wheel are largely for
safety in case someone is using an older version of virtualenv (which
doesn't install wheel by default) -->
<copy todir="${project.build.directory}/python3">
<fileset dir="src/main/jython"/>
</copy>
<copy todir="${project.build.directory}/python2">
<fileset dir="src/main/jython"/>
</copy>
<copy todir="${project.build.directory}/python-packaged">
<fileset dir="src/main/jython"/>
</copy>
<exec dir="${project.build.directory}/python2" executable="virtualenv"
failonerror="true">
<arg line="--python=python2 env"/>
</exec>
<!-- pip 20 doesn't work with python 2 it seems -->
<exec dir="${project.build.directory}/python2" executable="env/bin/python"
failonerror="true">
<arg line="-m pip install pip&gt;=19.3.1,&lt;20.0.0"/>
</exec>
<exec dir="${project.build.directory}/python2" executable="env/bin/pip"
failonerror="true">
<arg line="install wheel radish-bdd PyHamcrest aenum isodate"/>
</exec>
<exec dir="${project.build.directory}/python3" executable="virtualenv"
failonerror="true">
<arg line="--python=python3 env"/>
</exec>
<exec dir="${project.build.directory}/python3" executable="env/bin/pip"
failonerror="true">
<arg line="install wheel radish-bdd PyHamcrest aenum isodate"/>
</exec>
<exec dir="${project.build.directory}/python-packaged" executable="virtualenv"
failonerror="true">
<arg line="--python=python3 env"/>
</exec>
<exec dir="${project.build.directory}/python-packaged" executable="env/bin/pip"
failonerror="true">
<arg line="install wheel"/>
</exec>
</tasks>
</configuration>
</execution>
<execution>
<id>native-python2-build</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<exec executable="env/bin/python" dir="${project.build.directory}/python2"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<!-- oddly the "build-lib" needs to be in place or else docs won't generate -->
<arg line="setup.py build --build-lib ${project.build.outputDirectory}/Lib"/>
</exec>
</target>
</configuration>
</execution>
<execution>
<id>native-python3-build</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<exec executable="env/bin/python" dir="${project.build.directory}/python3"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<arg line="setup.py build --build-lib ${project.build.outputDirectory}/Lib"/>
</exec>
</target>
</configuration>
</execution>
<!--
build/package python source distribution and wheel archive. the version is bound to an
environment variable that gets used in setup.py to dynamically construct a module
__version__file
-->
<execution>
<id>package-py</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<exec executable="env/bin/python" dir="${project.build.directory}/python-packaged"
failonerror="true">
<env key="VERSION" value="${project.version}"/>
<env key="PYTHONPATH" value=""/>
<arg line="setup.py sdist bdist_wheel"/>
</exec>
</target>
</configuration>
</execution>
<!--
use pytest to execute native python tests - output of xunit output is configured in setup.cfg.
this has to be an integration-test because we need gremlin-server running and the standard
test phase doesn't have a pre/post event like integration-test does.
-->
<execution>
<id>native-python2-test</id>
<phase>integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<skip>${skipTests}</skip>
<target>
<!-- setup.py seems to have troubles with the recently published zipp 1.0.0 -->
<exec dir="${project.build.directory}/python2" executable="env/bin/python"
failonerror="true">
<arg line="-m pip install zipp&gt;=0.5.0,&lt;1.0.0"/>
</exec>
<exec executable="env/bin/python" dir="${project.build.directory}/python2"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<arg line="setup.py test"/>
</exec>
<!-- radish seems to like all dependencies in place -->
<exec executable="env/bin/python" dir="${project.build.directory}/python2"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<arg line="setup.py install"/>
</exec>
<!-- run for graphson 3.0 -->
<exec executable="env/bin/radish" dir="${project.build.directory}/python2"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<env key="PYTHONIOENCODING" value="utf-8:surrogateescape"/>
<arg line="-f dots -e -t -b ${project.build.directory}/python2/radish ${project.basedir}/../gremlin-test/features/ --user-data=&quot;serializer=application/vnd.gremlin-v3.0+json&quot;"/> <!-- -no-line-jump -->
</exec>
</target>
</configuration>
</execution>
<execution>
<id>native-python3-test</id>
<phase>integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<skip>${skipTests}</skip>
<target>
<exec executable="env/bin/python" dir="${project.build.directory}/python3"
failonerror="true">
<env key="PYTHONPATH" value=""/>
<arg line="setup.py test"/>
</exec>
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovy.version}</version>
<classifier>indy</classifier>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-dsl</id>
<phase>generate-sources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<properties>
<property>
<name>projectBaseDir</name>
<value>${project.basedir}</value>
</property>
</properties>
<scripts>
<script>${project.basedir}/glv/generate.groovy</script>
</scripts>
</configuration>
</execution>
<execution>
<id>gremlin-server-start</id>
<phase>pre-integration-test</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<properties>
<property>
<name>skipTests</name>
<value>${skipTests}</value>
</property>
<property>
<name>python</name>
<value>true</value>
</property>
<property>
<name>gremlinServerDir</name>
<value>${gremlin.server.dir}</value>
</property>
<property>
<name>settingsFile</name>
<value>${gremlin.server.dir}/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml</value>
</property>
<property>
<name>executionName</name>
<value>${project.name}</value>
</property>
<property>
<name>projectBaseDir</name>
<value>${project.basedir}</value>
</property>
</properties>
<scripts>
<script>${gremlin.server.dir}/src/test/scripts/test-server-start.groovy</script>
</scripts>
</configuration>
</execution>
<execution>
<id>gremlin-server-stop</id>
<phase>post-integration-test</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<properties>
<property>
<name>skipTests</name>
<value>${skipTests}</value>
</property>
<property>
<name>executionName</name>
<value>${project.name}</value>
</property>
</properties>
<scripts>
<script>${gremlin.server.dir}/src/test/scripts/test-server-stop.groovy</script>
</scripts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!--
Provides a way to deploy the gremlinpython GLV to pypi. This cannot be part of the standard maven execution
because pypi does not have a staging environment like sonatype for releases. As soon as the release is
published it is public. In our release workflow, deploy occurs prior to vote on the release and we can't
make this stuff public until the vote is over.
-->
<profile>
<id>glv-python-deploy</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>pypi</name>
</property>
</activation>
<build>
<plugins>
<!--
pypi doesn't have a staging area like sonatype so the deploy to pypi is done out of the normal
release band. it is performed after successful VOTE in which case, the maven artifacts should
not be deployed again - hence the plugin is disabled. deployment to pypi uses the antrun plugin
below with twine so disabling the plugin has no effect on the pypi deployment.
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<!-- deploy to pypi. assumes that ~/.pypirc is configured appropriately -->
<execution>
<id>deploy-py</id>
<phase>deploy</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<exec dir="${project.build.directory}/python-packaged" executable="env/bin/pip"
failonerror="true">
<arg line="install twine==1.12.1"/>
</exec>
<!-- check the dist for errors before deploying -->
<exec dir="${project.build.directory}/python-packaged" executable="env/bin/twine"
failonerror="true">
<arg line="check dist/*"/>
</exec>
<!-- to use the pypi test environment add: -r pypitest -->
<exec dir="${project.build.directory}/python-packaged" executable="env/bin/twine"
failonerror="true">
<arg line="upload dist/* -r pypi -s "/>
</exec>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>