<!--
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.4.7</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>
                                        <!-- print versions of python and virtualenv -->
                                        <exec dir="${project.build.directory}/python2" executable="python2"
                                              failonerror="true">
                                            <arg line="--version"/>
                                        </exec>
                                        <exec dir="${project.build.directory}/python2" executable="python3"
                                              failonerror="true">
                                            <arg line="--version"/>
                                        </exec>
                                        <exec dir="${project.build.directory}/python2" executable="virtualenv"
                                              failonerror="true">
                                            <arg line="--version"/>
                                        </exec>
                                        <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>
                                        <!-- run for graphbinary 1.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.graphbinary-v1.0&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>
                                <type>pom</type>
                                <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>
                                        <!--
                                        seems like https://github.com/pypa/twine/issues/338 is the reason to stay bound
                                        to this old version of twine. as long as keyring gets in the way and can't be
                                        disabled as described then you don't get a prompt for the password on deploy
                                        to pypi
                                         -->
                                        <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>
