summaryrefslogtreecommitdiff
path: root/.github
diff options
context:
space:
mode:
Diffstat (limited to '.github')
-rw-r--r--.github/CONTRIBUTING.md48
-rw-r--r--.github/code_conventions.md47
-rw-r--r--.github/copyright_template.h14
-rw-r--r--.github/copyright_template.py8
-rw-r--r--.github/for_maintainers/new_gudhi_version_creation.md129
-rw-r--r--.github/for_maintainers/next_release_template.md32
-rw-r--r--.github/for_maintainers/tests_strategy.md97
-rw-r--r--.github/how_to_compile_gudhi_in_a_conda_env.md93
-rw-r--r--.github/how_to_use_github_to_contribute_to_gudhi.md131
-rw-r--r--.github/next_release.md18
-rw-r--r--.github/workflows/pip-build-linux.yml27
-rw-r--r--.github/workflows/pip-build-osx.yml51
-rw-r--r--.github/workflows/pip-build-windows.yml49
-rw-r--r--.github/workflows/pip-packaging-linux.yml105
-rw-r--r--.github/workflows/pip-packaging-osx.yml61
-rw-r--r--.github/workflows/pip-packaging-windows.yml55
16 files changed, 965 insertions, 0 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 00000000..a18ff8bd
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,48 @@
+# Contributing to GUDHI
+
+First of all, thank you for the time you may take to contribute to GUDHI !
+
+# In case you have a question
+
+Please, check our [contact web page](https://gudhi.inria.fr/contact/).
+
+# In case you found an issue
+
+Please, first check [opened issues on GUDHI](https://github.com/GUDHI/gudhi-devel/issues).
+
+If the problem you are facing is not referenced, do not hesitate to open a [new issue](https://github.com/GUDHI/gudhi-devel/issues/new).
+
+This place is also a good place if you have some enhancement you want to propose.
+There is a label **enhancement** in the [new issue](https://github.com/GUDHI/gudhi-devel/issues/new) page.
+
+# In case you want to contribute to GUDHI
+
+## You are not familiar with GitHub ?
+
+Please take some time to read our [how to use GitHub to contribute to GUDHI](how_to_use_github_to_contribute_to_gudhi.md).
+
+## Something you want to improve in the documentation
+
+For C++ documentation, you can find it in the directories:
+* *src/common/doc* for the main page and installation instructions
+* *src/NAME_OF_THE_MODULE/doc* for the main page of a module
+* *src/NAME_OF_THE_MODULE/include/gudhi* for the documentation generated from the code.
+We use Doxygen to generate the code and you will be able to verify the result in CircleCI Doxygen target in the artifacts.
+
+For Python documentation, you can find it in the directories:
+* *src/python/doc* for the main page, installation instructionsand for the main pages of the modules
+* *src/python/gudhi/NAME_OF_THE_MODULE.pyx* for the documentation generated from the code.
+We use Sphinx to generate the code and you will be able to verify the result in CircleCI Sphinx target in the artifacts.
+
+## Something you want to improve in the code
+
+We don't ask for any paperwork but we expect you don't submit anything you are not allowed to:
+* check that your work contract and your employer allow you to contribute to this open source project.
+* insure you do not violate someone's intellectual property.
+* ...
+
+Please, take some time to read our [code conventions](code_conventions.md)
+
+As a convention, we set a Pull Request as a **Draft Pull Request** when we work on something we want the other contributors to see.
+
+We click on **Ready for review** to ask for a peer review of the contribution.
diff --git a/.github/code_conventions.md b/.github/code_conventions.md
new file mode 100644
index 00000000..9724f722
--- /dev/null
+++ b/.github/code_conventions.md
@@ -0,0 +1,47 @@
+# Naming conventions
+
+## C++
+
+### In the code:
+* The classes and functions of a package should be in a sub-namespace of the `Gudhi` namespace. The sub-namespace names are in lowercase and use underscore separators. E.g. `Gudhi::package_name::`
+* Concepts are named with camel case starting with uppercase. E.g. `PersistentHomology` for the concept of Persitence homology.
+* Classes start with an uppercase letter and use underscore separators. E.g. `Skeleton_blocker_contractor`.
+* Member functions and free functions are in lowercase and use underscore separators. E.g. `int num_vertices()`.
+* Constants and macros are in uppercase.
+* Macros should begin with the prefix `GUDHI_`.
+
+### File names:
+* All headers are named *.h and all sources are named *.cpp.
+* If a single class or function is provided in a file, its name (with the same letter case) should be used for the file name.
+* If a file does not contain a single class, its name should not begin with a capital letter.
+* Test files should be called `test_[what_is_tested].cpp`. E.g. `test_sparsify_point_set.cpp`
+* Example files should be called `example_[what_it_is].cpp`. E.g. `example_sparsify_point_set.cpp`
+
+### In CMakeLists.txt files:
+* The name of the "project" should be in this form: `Package_[tests|examples|…]`. E.g. `project(Simplex_tree_examples)`.
+* The name if each "target" (first parameter of add_executable) should be in this form: `Package_{name of the cpp file without extension}`. E.g `add_executable(Subsampling_test_sparsify_point_set test_sparsify_point_set.cpp)`.
+
+### Code style
+We are using [google c++ style guide](https://google.github.io/styleguide/cppguide.html) recommendations with 120 characters per line of code.
+[clang-format](https://clang.llvm.org/docs/ClangFormat.html) can be used to format automatically your code:
+```bash
+cd src # there is a .clang-format file with these specifications
+clang-format -style=file -i Simplex_tree/include/gudhi/Simplex_tree.h # -i means in place, your file will be modified
+```
+
+### Template
+Please use the file [following template](copyright_template.h).
+
+## Python
+
+In progress...
+
+### Code style
+We are using [PEP8 Python style guide](https://www.python.org/dev/peps/pep-0008/) recommendations with 120 characters per line of code.
+[black](https://black.readthedocs.io/en/stable/) can be used to format automatically your code:
+```bash
+black -l 120 src/python/example/bottleneck_basic_example.py
+```
+
+### Template
+Please use the file [following template](copyright_template.py).
diff --git a/.github/copyright_template.h b/.github/copyright_template.h
new file mode 100644
index 00000000..30034f1b
--- /dev/null
+++ b/.github/copyright_template.h
@@ -0,0 +1,14 @@
+/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
+ * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
+ * Author(s): [AUTHOR NAME]
+ *
+ * Copyright (C) [YEAR] [COPYRIGHT]
+ *
+ * Modification(s):
+ * - YYYY/MM Author: Description of the modification
+ */
+
+#ifndef [FILE_NAME]_H_
+#define [FILE_NAME]_H_
+
+#endif // [FILE_NAME]_H_ \ No newline at end of file
diff --git a/.github/copyright_template.py b/.github/copyright_template.py
new file mode 100644
index 00000000..667f985d
--- /dev/null
+++ b/.github/copyright_template.py
@@ -0,0 +1,8 @@
+# This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
+# See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
+# Author(s): [AUTHOR NAME]
+#
+# Copyright (C) [YEAR] [COPYRIGHT]
+#
+# Modification(s):
+# - YYYY/MM Author: Description of the modification
diff --git a/.github/for_maintainers/new_gudhi_version_creation.md b/.github/for_maintainers/new_gudhi_version_creation.md
new file mode 100644
index 00000000..9634adae
--- /dev/null
+++ b/.github/for_maintainers/new_gudhi_version_creation.md
@@ -0,0 +1,129 @@
+# Create a new GUDHI version
+
+We will consider that all operations will be performed in a brand new clone of the main project:
+```bash
+git clone https://github.com/GUDHI/gudhi-devel.git
+cd gudhi-devel
+```
+
+## Version file modification
+
+**Edit the file CMakeGUDHIVersion.txt**, and increment major, minor, or patch version number, in function of the version new delivery.
+```bash
+# cf. .gitignore - ignore this if it is a fresh clone version
+rm -rf data/points/COIL_database/lucky_cat.off_dist data/points/COIL_database/lucky_cat.off_sc.dot data/points/KleinBottle5D.off_dist data/points/KleinBottle5D.off_sc.dot data/points/human.off_dist data/points/human.off_sc.off data/points/human.off_sc.txt
+```
+
+Checkin the modifications, build and test the version:
+```bash
+git submodule update --init
+rm -rf build; mkdir build; cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=/your/path/to/CGAL -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_BENCHMARK=ON -DUSER_VERSION_DIR=gudhi.@GUDHI_VERSION@ -DPython_ADDITIONAL_VERSIONS=3 ..
+make user_version
+date +"%d-%m-%Y-%T" > gudhi.@GUDHI_VERSION@/timestamp.txt
+tar -czvf gudhi.@GUDHI_VERSION@.tar.gz gudhi.@GUDHI_VERSION@
+sha256sum gudhi.@GUDHI_VERSION@.tar.gz > sha256sum.txt
+sha512sum gudhi.@GUDHI_VERSION@.tar.gz > sha512sum.txt
+
+make && ctest --output-on-failure
+```
+
+***[Check there are no error]***
+
+## Create the documentation
+```bash
+mkdir gudhi.doc.@GUDHI_VERSION@
+```
+
+***[Check there are no error and the warnings]***
+
+```bash
+cd gudhi.@GUDHI_VERSION@
+rm -rf build; mkdir build; cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=/your/path/to/CGAL -DWITH_GUDHI_EXAMPLE=ON -DPython_ADDITIONAL_VERSIONS=3 ..
+make doxygen 2>&1 | tee dox.log && grep warning dox.log
+```
+
+***[Check there are no error and the warnings]***
+
+```bash
+cp -R html ../../gudhi.doc.@GUDHI_VERSION@/cpp
+export LC_ALL=en_US.UTF-8 # cf. bug https://github.com/GUDHI/gudhi-devel/issues/111
+make sphinx
+```
+
+***[Check there are no error]***
+
+```bash
+cp -R python/sphinx ../../gudhi.doc.@GUDHI_VERSION@/python
+cd ../..
+tar -czvf gudhi.doc.@GUDHI_VERSION@.tar.gz gudhi.doc.@GUDHI_VERSION@
+
+cd gudhi.@GUDHI_VERSION@/build
+make && ctest --output-on-failure
+```
+
+***[Check there are no error]***
+
+## Upload the documentation
+
+[GUDHI GitHub pages](https://gudhi.github.io/) is only used as a _"qualification"_ web hosting service.
+The _"production"_ web hosting service is https://files.inria.fr (cf. [this doc](https://doc-si.inria.fr/display/SU/Espace+web)
+or [this one](https://www.nextinpact.com/article/30325/109058-se-connecter-a-serveur-webdav-sous-linux-macos-ou-windows)).
+
+Upload the content of the directory gudhi.doc.@GUDHI_VERSION@/cpp in a new directory on gudhi WebDAV in doc/@GUDHI_VERSION@
+Delete the directory doc/latest on gudhi WebDAV.
+Copy gudhi WebDAV doc/@GUDHI_VERSION@ as doc/latest (no symbolic link with WebDAV).
+
+Upload the content of the directory gudhi.doc.@GUDHI_VERSION@/python in a new directory on gudhi WebDAV in python/@GUDHI_VERSION@
+Delete the directory python/latest on gudhi WebDAV.
+Copy gudhi WebDAV python/@GUDHI_VERSION@ as python/latest (no symbolic link with WebDAV).
+
+
+## Put a version label on files
+
+* Go on page https://github.com/GUDHI/gudhi-devel/releases/new
+* Name the tag: tags/gudhi-release-@GUDHI_VERSION@
+* Name the release GUDHI @GUDHI_VERSION@ release
+* Write the release note
+* Drag'n drop *gudhi.@GUDHI_VERSION@.tar.gz*, *sha256sum.txt*, *sha512sum.txt* files
+* Tick the *This is a pre-release* check button if this is a release candidate (untick if this is an official version)
+* Click the *Publish the release* button
+
+## Pip package
+
+The pip package construction shall be started on release creation, you just have to check
+[gudhi github actions](https://github.com/GUDHI/gudhi-devel/actions) results.
+The version number must be conform to [pep440](https://www.python.org/dev/peps/pep-0440/#pre-releases)
+
+## Conda package
+
+You have to fork [conda-forge/gudhi-feedstock](https://github.com/conda-forge/gudhi-feedstock).
+The main changes consist into changing in the `recipe/meta.yaml`:
+* `{% set version = "@GUDHI_VERSION@" %}`
+* The cgal-cpp version number with the last one (you can find it [here](https://anaconda.org/conda-forge/cgal-cpp)) in the `host:` and the `run:` sections
+
+Create a Pull Request (PR) from this fork.
+If you need to update conda tools (conda-build, conda-smithy, ...), add a comment in your PR saying `@conda-forge-admin, please rerender`, it will done automatically (do not forget to `git pull` the changes).
+
+## Docker image
+
+You have to modify the
+[Dockerfile_gudhi_installation](https://github.com/GUDHI/gudhi-deploy/blob/main/Dockerfile_for_gudhi_installation)
+in gudhi-deploy repository in order to use the last release, cf. lines:
+```
+...
+ARG GUDHI_VERSION="3.X.X"
+...
+```
+
+After pushing the changes the docker image build will be automatically performed for
+[latest_gudhi_version](https://hub.docker.com/repository/docker/gudhi/latest_gudhi_version)
+docker image on docker hub.
+
+***[Check there are no error]***
+
+## Mail sending
+Send version mail to the following lists :
+* gudhi-devel@inria.fr
+* gudhi-users@inria.fr (not for release candidate)
diff --git a/.github/for_maintainers/next_release_template.md b/.github/for_maintainers/next_release_template.md
new file mode 100644
index 00000000..0b6dde63
--- /dev/null
+++ b/.github/for_maintainers/next_release_template.md
@@ -0,0 +1,32 @@
+We are pleased to announce the release 3.X.X of the GUDHI library.
+
+As a major new feature, the GUDHI library now offers ...
+
+We are now using GitHub to develop the GUDHI library, do not hesitate to [fork the GUDHI project on GitHub](https://github.com/GUDHI/gudhi-devel). From a user point of view, we recommend to download GUDHI user version (gudhi.3.X.X.tar.gz).
+
+Below is a list of changes made since GUDHI 3.X-1.X-1:
+
+- [Module](link)
+ - ...
+
+- [Module](link)
+ - ...
+
+- Miscellaneous
+ - The [list of bugs that were solved since GUDHI-3.X-1.X-1](https://github.com/GUDHI/gudhi-devel/issues?q=label%3A3.1.1+is%3Aclosed) is available on GitHub.
+
+All modules are distributed under the terms of the MIT license.
+However, there are still GPL dependencies for many modules. We invite you to check our [license dedicated web page](https://gudhi.inria.fr/licensing/) for further details.
+
+We kindly ask users to cite the GUDHI library as appropriately as possible in their papers, and to mention the use of the GUDHI library on the web pages of their projects using GUDHI and provide us with links to these web pages.
+
+We provide [bibtex entries](https://gudhi.inria.fr/doc/latest/_citation.html) for the modules of the User and Reference Manual, as well as for publications directly related to the GUDHI library.
+
+Feel free to [contact us](https://gudhi.inria.fr/contact/) in case you have any questions or remarks.
+
+For further information about downloading and installing the library ([C++](https://gudhi.inria.fr/doc/latest/installation.html) or [Python](https://gudhi.inria.fr/python/latest/installation.html)), please visit the [GUDHI web site](https://gudhi.inria.fr/).
+
+## Contributors
+
+- ...
+- ... \ No newline at end of file
diff --git a/.github/for_maintainers/tests_strategy.md b/.github/for_maintainers/tests_strategy.md
new file mode 100644
index 00000000..d0ae76ef
--- /dev/null
+++ b/.github/for_maintainers/tests_strategy.md
@@ -0,0 +1,97 @@
+# Tests strategy
+
+This document tries to sum up the tests strategy that has been put in place for gudhi continuous integration.
+
+The aim is to help maintainers to anticipate third parties modifications, updates.
+
+## CMake options
+
+[CMake GUDHI options](../../src/cmake/modules/GUDHI_options.cmake) allows to activate/deactivate what should be built and tested.
+Note the special option `WITH_GUDHI_THIRD_PARTY` that, when set to `OFF`, accelerates doxygen documentation generation or `user_version` for instance.
+
+## Builds
+
+### Linux
+
+As all the third parties are already installed (thanks to docker), the compilations have been separated in categories to be parallelized:
+
+* examples (C++)
+* tests (C++)
+* utils (C++)
+* doxygen (C++ documentation that is available in the artefacts)
+* python (including documentation and code coverage that are available in the artefacts; here the WITH_GUDHI_REMOTE_TEST option is enabled which adds datasets fetching test)
+
+(cf. `.circleci/config.yml`)
+
+These build categories are done with and without CGAL, and, with and without Eigen to be sure the users won't be annoyed if a third party is missing.
+
+With CGAL and with Eigen builds are performed inside the docker image `gudhi/ci_for_gudhi` based on `Dockerfile_for_circleci_image` file.
+Without CGAL, and, with or without Eigen builds are performed inside the docker image `gudhi/ci_for_gudhi_wo_cgal` based on `Dockerfile_for_circleci_image_without_cgal` file.
+
+#### Update docker images
+
+C++ third parties installation is done thanks to apt on Ubuntu latest LTS.
+
+Docker images need to be rebuilt and pushed each time `.github/build-requirements`, `.github/test-requirements`, when a new third party is added, when a new CGAL version improves gudhi performances, ...
+
+```bash
+docker build -f Dockerfile_for_circleci_image -t gudhi/ci_for_gudhi:latest .
+docker build -f Dockerfile_for_circleci_image_without_cgal -t gudhi/ci_for_gudhi_wo_cgal:latest .
+docker login # requires some specific rights on https://hub.docker.com/u/gudhi/repository/docker/gudhi
+docker push gudhi/ci_for_gudhi:latest
+docker push gudhi/ci_for_gudhi_wo_cgal:latest
+```
+
+### Windows
+
+The compilations are not parallelized, as installation time (about 30 minutes) is too much compared to
+build and tests timings (about 30 minutes). Builds and tests include:
+
+* examples (C++)
+* tests (C++)
+* utils (C++)
+* python (here the WITH_GUDHI_REMOTE_TEST option is enabled which adds datasets fetching test)
+
+Doxygen (C++) is not generated.
+(cf. `azure-pipelines.yml`)
+
+C++ third parties installation is done thanks to [vcpkg](https://github.com/microsoft/vcpkg/).
+In case of an installation issue, check in [vcpkg issues](https://github.com/microsoft/vcpkg/issues).
+
+### OSx
+
+The compilations are not parallelized, but they should, as installation time (about 4 minutes) is
+negligible compared to build and tests timings (about 30 minutes). Builds and tests include:
+
+* examples (C++)
+* tests (C++)
+* utils (C++)
+* python (here the WITH_GUDHI_REMOTE_TEST option is enabled which adds datasets fetching test)
+* Doxygen (C++)
+
+(cf. `azure-pipelines.yml`)
+
+C++ third parties installation is done thanks to [brew](https://formulae.brew.sh/formula/).
+In case of an installation issue, check in formula issues.
+
+## Pip packaging
+
+Pip packaging is done in 2 parts:
+
+* on push and pull requests, the wheels are built (pip package dry-run)
+* on releases, the wheels are built and sent to pypi.org (package)
+
+Only the Linux pip package is based on a docker image (`gudhi/pip_for_gudhi` based on `Dockerfile_for_pip` file) to make it faster.
+
+### Update docker image
+
+C++ third parties installation is done thanks to yum on an image based on `quay.io/pypa/manylinux2014_x86_64`.
+
+Docker image needs to be rebuilt and pushed each time `.github/build-requirements`, when a new third party is added, when a new CGAL version improves gudhi performances, ...
+As `.github/test-requirements` is not installed, no need to rebuild image when this file is modified.
+
+```bash
+docker build -f Dockerfile_for_pip -t gudhi/pip_for_gudhi:latest .
+docker login # requires some specific rights on https://hub.docker.com/u/gudhi/repository/docker/gudhi
+docker push gudhi/pip_for_gudhi:latest
+```
diff --git a/.github/how_to_compile_gudhi_in_a_conda_env.md b/.github/how_to_compile_gudhi_in_a_conda_env.md
new file mode 100644
index 00000000..4acfca2e
--- /dev/null
+++ b/.github/how_to_compile_gudhi_in_a_conda_env.md
@@ -0,0 +1,93 @@
+# Install a conda development environment to compile GUDHI
+
+## Install miniconda
+
+Download the [installer](https://docs.conda.io/en/latest/miniconda.html) required by your system and follow the [instructions](https://conda.io/projects/conda/en/latest/user-guide/install/index.html).
+
+## Create a dedicated environment
+
+```bash
+conda install -c conda-forge mamba # installation with mamba is faster
+conda create --name gudhi
+conda activate gudhi
+mamba install -c conda-forge python cmake doxygen eigen cgal-cpp
+```
+
+Some of the requirements are in the gudhi-devel repository (please refer to
+[how to use github to contribute to gudhi](how_to_use_github_to_contribute_to_gudhi.md)).
+Once the gudhi-devel repository is cloned on your machine (`git clone...`) - let's call it `/workdir/gudhi-devel` i.e. -
+and once the submodules are initialised (`git submodule update --init`):
+
+```bash
+pip install -r ext/gudhi-deploy/build-requirements.txt
+pip install -r ext/gudhi-deploy/test-requirements.txt # pytorch can be painful to install - not mandatory
+```
+
+## Compilation
+
+In order to compile all c++ utilities, examples, benchmarks, unitary tests, and python module:
+```bash
+cd /workdir/gudhi-devel
+rm -rf build; mkdir build # /!\ any existing build folder will be removed
+cd build
+# To build all even examples and benchmarks
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_BENCHMARK=ON ..
+```
+
+### Specific python compilation
+
+In order to compile only python module
+```bash
+cd /workdir/gudhi-devel
+rm -rf build; mkdir build # /!\ any existing build folder will be removed
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX ..
+cd src/python
+# To build python module in parallel
+python setup.py build_ext -j 16 --inplace # 16 is the number of CPU that are used to compile the python module. Can be any other value.
+# to clean the build
+# python setup.py clean --all
+```
+
+In order to use freshly compiled gudhi python module:
+```bash
+PYTHONPATH=/workdir/gudhi-devel/build/src/python python # or ipython, jupyter, ...
+```
+
+### Specific C++ documentation generation
+
+```bash
+cd /workdir/gudhi-devel
+rm -rf build; mkdir build # /!\ any existing build folder will be removed
+cd build
+# python OFF to prevent python modules search makes cmake faster
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DWITH_GUDHI_PYTHON=OFF -DUSER_VERSION_DIR=version ..
+make user_version;
+cd version
+mkdir build
+cd build
+# python OFF to prevent python modules search makes cmake faster
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DWITH_GUDHI_PYTHON=OFF ..
+make doxygen 2>&1 | tee dox.log
+grep warning dox.log # Warnings can be lost with parallel doxygen
+firefox html/index.html # [optional] To display the c++ documentation. Anything else than firefox can be used.
+```
+
+### Specific python documentation generation
+
+```bash
+cd /workdir/gudhi-devel
+rm -rf build; mkdir build # /!\ any existing build folder will be removed
+cd build
+# python OFF to prevent python modules search makes cmake faster - it is the next cmake call in user version that matters
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DWITH_GUDHI_PYTHON=OFF -DUSER_VERSION_DIR=version ..
+make user_version;
+cd version
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$CONDA_PREFIX ..
+cd python
+# To build python module in parallel
+python setup.py build_ext -j 16 --inplace # 16 is the number of CPU that are used to compile the python module. Can be any other value.
+firefox sphinx/index.html # [optional] To display the python documentation. Anything else than firefox can be used.
+``` \ No newline at end of file
diff --git a/.github/how_to_use_github_to_contribute_to_gudhi.md b/.github/how_to_use_github_to_contribute_to_gudhi.md
new file mode 100644
index 00000000..f72bb9d6
--- /dev/null
+++ b/.github/how_to_use_github_to_contribute_to_gudhi.md
@@ -0,0 +1,131 @@
+# How to use github to contribute to gudhi
+
+Similar information is available in many places:
+* https://jarv.is/notes/how-to-pull-request-fork-github/ (this one is using `upstream/master` when creating a new branch)
+* https://help.github.com/en/github/getting-started-with-github/fork-a-repo
+* https://blog.scottlowe.org/2015/01/27/using-fork-branch-git-workflow/
+* https://gist.github.com/Chaser324/ce0505fbed06b947d962
+* etc
+
+## Get a github account
+I assume the account is called **LOGIN**, please replace as appropriate below. Log in to github.com using this account.
+
+## Fork GUDHI/gudhi-devel project
+Go to https://github.com/GUDHI/gudhi-devel and click on **fork** (top right).
+Feel free to also click on the star next to it to show you like the project!
+You can see your fork at https://github.com/LOGIN/gudhi-devel
+
+## Create a local clone on your computer
+```bash
+git clone --recurse-submodules https://github.com/LOGIN/gudhi-devel.git
+```
+
+This creates a directory gudhi-devel, which you are free to move around or rename. For the following, change to that directory:
+```bash
+cd gudhi-devel
+```
+
+## Submodules
+When you clone the repository, you also need to download the *submodules*. This is done automatically thanks to `--recurse-submodules`.
+If you forgot this option, you can still download them with
+```bash
+git submodule update --init
+```
+
+The submodules appear in the `ext/` subdirectory. There are currently 2, [Hera](https://github.com/anigmetov/hera) for distances between persistence diagrams, and [gudhi-deploy](https://github.com/GUDHI/gudhi-deploy) for Continuous Integration.
+
+## Configuring a remote for a fork
+```bash
+git remote add upstream https://github.com/GUDHI/gudhi-devel.git
+```
+
+because you want to see the real gudhi, not just your clone.
+(It is perfectly possible to do things in the reverse order, clone from GUDHI and add the one in LOGIN as extra remote, but the names of the remotes may not match the rest of this document. You can change the name of a remote with `git remote rename oldname newname`)
+
+## Optional remotes
+Optional, if you are interested in one of the old branches
+```bash
+git remote add oldies https://github.com/GUDHI/branches.git
+```
+
+Or if you want to spy on someone's work. I assume the someone's account is called **SOMEONE**
+```bash
+git remote add someone https://github.com/SOMEONE/gudhi-devel.git
+```
+
+## Stay up-to-date
+```bash
+git fetch -p --all
+```
+This is a command you can run quite regularly.
+It tells git to check all that happened on github.
+It is safe, it will not mess with your files.
+
+**Reminder:** If the version of a submodule has changed, or if a submodule was added, you may need to:
+```bash
+git submodule sync
+git submodule update --init
+```
+You can configure `git` to do this automatically with
+```bash
+git config submodule.recurse true
+```
+(add `--global` if you want it to apply to other projects as well)
+
+## Create a branch, based on the current master
+```bash
+git checkout -b some-fancy-name --no-track upstream/master
+```
+Your local branch `master` and the one on your github clone are useless and often outdated, but for technical reasons there has to exist at least one branch at all times, it might as well be that one. upstream/master is the real deal, that's what you want to base your new branch on.
+
+## The real coding is here!
+Edit files, test, etc.
+
+## Commit your changes (locally)
+The basic command is just `git commit`, but it will do nothing by default.
+You need `git add my_new_file` for every new file you want to commit.
+And usually you'll want to use `git commit -a` so that all files that git already knows about and that have been modified get committed.
+
+## Push your changes (remotely)
+```bash
+git push -u origin some-fancy-name
+```
+This puts a copy of your branch on your online clone of gudhi-devel.
+Because of `-u`, it will remember where you like to push this branch, and next time you can just use `git push`.
+
+## Play again!
+Possibly iterate a few times, add more commits and push them.
+
+## Your pull request is ready
+Do not forget to update `.github/next_release.md` to announce your development in the next release note.
+
+Get your web browser to https://github.com/LOGIN/gudhi-devel, click on the button that says **Branch: some-name** (below the number of commits, above the list of files) and select the branch you are so proud of.
+Click on **New pull request** next to it.
+
+## Follow the instructions ;-)
+Note that if your branch is not quite ready, you can make a **draft pull request** (see the arrow next to the confirmation button), and later you will have access to a button to say that the branch is ready for reviews now.
+Draft pull requests can be a way to advertise that you are working on something, and possibly ask others for comments or help.
+
+## Code review
+Make sure you follow the discussion on your pull request, answer questions, take comments into account.
+You can keep pushing new commits on your branch to your fork of gudhi-devel, the pull request will automatically notice the new commits there.
+There is no need to create a new pull request.
+Once the branch is under review, fixing issues is good, but please refrain from adding extra features, that just makes the reviewers' job harder and thus slower.
+You may want to look at https://github.com/settings/notifications (and other settings nearby) if you don't receive emails when people comment on your pull request.
+Some bold reviewer might make changes to your branch. You will then need `git pull` for your local branch to reflect those.
+
+## Your work is merged!
+Once your pull request has been closed (your branch merged), you can remove your branch, both locally and also the branch on your github fork:
+```bash
+git checkout master # or any other branch, but you cannot remove the branch you are currently in
+git branch -d some-fancy-name # local branch delete
+git push origin --delete some-fancy-name # remote branch delete
+```
+If you add @VincentRouvreau or @mglisse as collaborator (https://github.com/LOGIN/gudhi-devel/settings/collaboration), they may remove the branch on your clone at the same time as they merge the branch, so you only have the local one to remove (or keep if you are nostalgic).
+
+## Keep in touch
+Create a new branch and keep contributing!
+
+Do not try to reuse an old branch that has already been merged.
+Make sure you run the fetch command just before creating any new branch, so you don't base it on some outdated version of master.
+You can also work on several branches at the same time, using `git checkout some-fancy-name` and `git checkout name-of-other-branch` to switch between them (commit before switching or things may get complicated).
diff --git a/.github/next_release.md b/.github/next_release.md
new file mode 100644
index 00000000..54115196
--- /dev/null
+++ b/.github/next_release.md
@@ -0,0 +1,18 @@
+We are pleased to announce the release 3.7.1 of the GUDHI library.
+
+This minor post-release is a bug fix version for [python representation module](https://gudhi.inria.fr/python/latest/representations.html).
+
+We are now using GitHub to develop the GUDHI library, do not hesitate to [fork the GUDHI project on GitHub](https://github.com/GUDHI/gudhi-devel). From a user point of view, we recommend to download GUDHI user version (gudhi.3.X.X.tar.gz).
+
+The [list of bugs that were solved since GUDHI-3.7.0](https://github.com/GUDHI/gudhi-devel/issues?q=label%3A3.7.1+is%3Aclosed) is available on GitHub.
+
+All modules are distributed under the terms of the MIT license.
+However, there are still GPL dependencies for many modules. We invite you to check our [license dedicated web page](https://gudhi.inria.fr/licensing/) for further details.
+
+We kindly ask users to cite the GUDHI library as appropriately as possible in their papers, and to mention the use of the GUDHI library on the web pages of their projects using GUDHI and provide us with links to these web pages.
+
+We provide [bibtex entries](https://gudhi.inria.fr/doc/latest/_citation.html) for the modules of the User and Reference Manual, as well as for publications directly related to the GUDHI library.
+
+Feel free to [contact us](https://gudhi.inria.fr/contact/) in case you have any questions or remarks.
+
+For further information about downloading and installing the library ([C++](https://gudhi.inria.fr/doc/latest/installation.html) or [Python](https://gudhi.inria.fr/python/latest/installation.html)), please visit the [GUDHI web site](https://gudhi.inria.fr/).
diff --git a/.github/workflows/pip-build-linux.yml b/.github/workflows/pip-build-linux.yml
new file mode 100644
index 00000000..bc4f999e
--- /dev/null
+++ b/.github/workflows/pip-build-linux.yml
@@ -0,0 +1,27 @@
+name: pip build linux
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: build pip wheel
+ runs-on: ubuntu-latest
+ # cf. https://github.com/GUDHI/gudhi-deploy/blob/main/Dockerfile_for_pip
+ container: gudhi/pip_for_gudhi
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - name: Build wheel for Python 3.11
+ run: |
+ mkdir build_311
+ cd build_311
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON311/bin/python ..
+ cd src/python
+ $PYTHON311/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.11
+ run: |
+ $PYTHON311/bin/python -m pip install --user pytest build_311/src/python/dist/*.whl
+ $PYTHON311/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON311/bin/python -m pytest src/python/test/test_alpha_complex.py
diff --git a/.github/workflows/pip-build-osx.yml b/.github/workflows/pip-build-osx.yml
new file mode 100644
index 00000000..a438124a
--- /dev/null
+++ b/.github/workflows/pip-build-osx.yml
@@ -0,0 +1,51 @@
+name: pip build osx
+
+on: [push, pull_request]
+
+env:
+ MACOSX_DEPLOYMENT_TARGET: 10.14
+ _PYTHON_HOST_PLATFORM: macosx-10.14-universal2
+ ARCHFLAGS: "-arch arm64 -arch x86_64"
+
+jobs:
+ build:
+ runs-on: macos-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: ['3.11']
+ name: Build wheels for Python ${{ matrix.python-version }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: x64
+ - name: Install dependencies
+ run: |
+ brew update || true
+ brew install boost eigen gmp mpfr cgal || true
+ python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
+ python -m pip install --user twine delocate
+ ./scripts/build_osx_universal_gmpfr.sh
+ # Now the universal libraries are in $PWD/deps-uni/lib
+ - name: Build python wheel
+ run: |
+ export GMP_LIB_DIR=$PWD/deps-uni/lib
+ export GMPXX_LIB_DIR=$PWD/deps-uni/lib
+ export MPFR_LIB_DIR=$PWD/deps-uni/lib
+ python --version
+ mkdir build
+ cd build
+ cmake -DCMAKE_BUILD_TYPE=Release -DPython_ADDITIONAL_VERSIONS=3 ..
+ cd src/python
+ python setup.py bdist_wheel
+ export PATH="$PATH:`python -m site --user-base`/bin"
+ delocate-wheel --require-archs universal2 -v dist/*.whl
+ - name: Install and test python wheel
+ run: |
+ python -m pip install --user pytest build/src/python/dist/*.whl
+ python -c "import gudhi; print(gudhi.__version__)"
+ python -m pytest src/python/test/test_alpha_complex.py
diff --git a/.github/workflows/pip-build-windows.yml b/.github/workflows/pip-build-windows.yml
new file mode 100644
index 00000000..50bdfe2c
--- /dev/null
+++ b/.github/workflows/pip-build-windows.yml
@@ -0,0 +1,49 @@
+name: pip build windows
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: windows-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: ['3.11']
+ name: Build wheels for Python ${{ matrix.python-version }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: x64
+ - name: Install dependencies
+ run: |
+ set VCPKG_BUILD_TYPE=release
+ vcpkg install eigen3 cgal --triplet x64-windows
+ vcpkg version
+ ls "C:\vcpkg\installed\x64-windows\bin\"
+ python -m pip install --user -r .\ext\gudhi-deploy\build-requirements.txt
+ python -m pip list
+ - name: Build python wheel and install it
+ run: |
+ mkdir build
+ cd ".\build\"
+ cmake -DCMAKE_BUILD_TYPE=Release -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON -DCMAKE_TOOLCHAIN_FILE=c:\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows ..
+ Get-Location
+ dir
+ cd ".\src\python\"
+ cp "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\"
+ cp "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\"
+ python setup.py bdist_wheel
+ ls ".\dist\"
+ cd ".\dist\"
+ Get-ChildItem *.whl | ForEach-Object{python -m pip install --user $_.Name}
+ - name: Test python wheel
+ run: |
+ Get-Location
+ dir
+ python -m pip install --user pytest
+ python -c "import gudhi; print(gudhi.__version__)"
+ python -m pytest ".\src\python\test\test_alpha_complex.py"
diff --git a/.github/workflows/pip-packaging-linux.yml b/.github/workflows/pip-packaging-linux.yml
new file mode 100644
index 00000000..14b1cf7a
--- /dev/null
+++ b/.github/workflows/pip-packaging-linux.yml
@@ -0,0 +1,105 @@
+name: pip packaging linux
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ build:
+ name: build pip wheel
+ runs-on: ubuntu-latest
+ # cf. https://github.com/GUDHI/gudhi-deploy/blob/main/Dockerfile_for_pip
+ container: gudhi/pip_for_gudhi
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - name: Build wheel for Python 3.6
+ run: |
+ mkdir build_36
+ cd build_36
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON36/bin/python ..
+ cd src/python
+ $PYTHON36/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.6
+ run: |
+ $PYTHON36/bin/python -m pip install --user pytest build_36/src/python/dist/*.whl
+ $PYTHON36/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON36/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Build wheel for Python 3.7
+ run: |
+ mkdir build_37
+ cd build_37
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON37/bin/python ..
+ cd src/python
+ $PYTHON37/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.7
+ run: |
+ $PYTHON37/bin/python -m pip install --user pytest build_37/src/python/dist/*.whl
+ $PYTHON37/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON37/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Build wheel for Python 3.8
+ run: |
+ mkdir build_38
+ cd build_38
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON38/bin/python ..
+ cd src/python
+ $PYTHON38/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.8
+ run: |
+ $PYTHON38/bin/python -m pip install --user pytest build_38/src/python/dist/*.whl
+ $PYTHON38/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON38/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Build wheel for Python 3.9
+ run: |
+ mkdir build_39
+ cd build_39
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON39/bin/python ..
+ cd src/python
+ $PYTHON39/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.9
+ run: |
+ $PYTHON39/bin/python -m pip install --user pytest build_39/src/python/dist/*.whl
+ $PYTHON39/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON39/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Build wheel for Python 3.10
+ run: |
+ mkdir build_310
+ cd build_310
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON310/bin/python ..
+ cd src/python
+ $PYTHON310/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.10
+ run: |
+ $PYTHON310/bin/python -m pip install --user pytest build_310/src/python/dist/*.whl
+ $PYTHON310/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON310/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Build wheel for Python 3.11
+ run: |
+ mkdir build_311
+ cd build_311
+ cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=$PYTHON311/bin/python ..
+ cd src/python
+ $PYTHON311/bin/python setup.py bdist_wheel
+ auditwheel repair dist/*.whl
+ - name: Install and test wheel for Python 3.11
+ run: |
+ $PYTHON311/bin/python -m pip install --user pytest build_311/src/python/dist/*.whl
+ $PYTHON311/bin/python -c "import gudhi; print(gudhi.__version__)"
+ $PYTHON311/bin/python -m pytest src/python/test/test_alpha_complex.py
+ - name: Publish on PyPi
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ run: |
+ $PYTHON36/bin/python -m twine upload build_36/src/python/wheelhouse/*
+ $PYTHON36/bin/python -m twine upload build_37/src/python/wheelhouse/*
+ $PYTHON36/bin/python -m twine upload build_38/src/python/wheelhouse/*
+ $PYTHON36/bin/python -m twine upload build_39/src/python/wheelhouse/*
+ $PYTHON36/bin/python -m twine upload build_310/src/python/wheelhouse/*
+ $PYTHON36/bin/python -m twine upload build_311/src/python/wheelhouse/*
diff --git a/.github/workflows/pip-packaging-osx.yml b/.github/workflows/pip-packaging-osx.yml
new file mode 100644
index 00000000..9ddbcfce
--- /dev/null
+++ b/.github/workflows/pip-packaging-osx.yml
@@ -0,0 +1,61 @@
+name: pip packaging osx
+
+on:
+ release:
+ types: [published]
+
+env:
+ MACOSX_DEPLOYMENT_TARGET: 10.15
+ _PYTHON_HOST_PLATFORM: macosx-10.15-universal2
+ ARCHFLAGS: "-arch arm64 -arch x86_64"
+
+jobs:
+ build:
+ runs-on: macos-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
+ name: Build wheels for Python ${{ matrix.python-version }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: x64
+ - name: Install dependencies
+ run: |
+ brew update || true
+ brew install boost eigen gmp mpfr cgal || true
+ python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
+ python -m pip install --user twine delocate
+ ./scripts/build_osx_universal_gmpfr.sh
+ # Now the universal libs are in $PWD/deps-uni/lib
+ - name: Build python wheel
+ run: |
+ export GMP_LIB_DIR=$PWD/deps-uni/lib
+ export GMPXX_LIB_DIR=$PWD/deps-uni/lib
+ export MPFR_LIB_DIR=$PWD/deps-uni/lib
+ python --version
+ mkdir build
+ cd build
+ cmake -DCMAKE_BUILD_TYPE=Release -DPython_ADDITIONAL_VERSIONS=3 ..
+ cd src/python
+ python setup.py bdist_wheel
+ - name: Install and test python wheel
+ run: |
+ python -m pip install --user pytest build/src/python/dist/*.whl
+ python -c "import gudhi; print(gudhi.__version__)"
+ python -m pytest src/python/test/test_alpha_complex.py
+ - name: Publish on PyPi
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ run: |
+ mkdir wheelhouse
+ export PATH="$PATH:`python -m site --user-base`/bin"
+ delocate-listdeps build/src/python/dist/*
+ delocate-wheel --require-archs universal2 -w wheelhouse build/src/python/dist/*
+ python -m twine upload wheelhouse/*
diff --git a/.github/workflows/pip-packaging-windows.yml b/.github/workflows/pip-packaging-windows.yml
new file mode 100644
index 00000000..df0db9a5
--- /dev/null
+++ b/.github/workflows/pip-packaging-windows.yml
@@ -0,0 +1,55 @@
+name: pip packaging windows
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ build:
+ runs-on: windows-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
+ name: Build wheels for Python ${{ matrix.python-version }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: x64
+ - name: Install dependencies
+ run: |
+ set VCPKG_BUILD_TYPE=release
+ vcpkg install eigen3 cgal --triplet x64-windows
+ vcpkg version
+ ls "C:\vcpkg\installed\x64-windows\bin\"
+ python -m pip install --user -r .\ext\gudhi-deploy\build-requirements.txt
+ python -m pip install --user twine
+ python -m pip list
+ - name: Build python wheel and install it
+ run: |
+ mkdir build
+ cd ".\build\"
+ cmake -DCMAKE_BUILD_TYPE=Release -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON -DCMAKE_TOOLCHAIN_FILE=c:\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows ..
+ Get-Location
+ dir
+ cd ".\src\python\"
+ cp "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\"
+ cp "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\"
+ python setup.py bdist_wheel
+ ls ".\dist\"
+ cd ".\dist\"
+ Get-ChildItem *.whl | ForEach-Object{python -m pip install --user $_.Name}
+ - name: Test python wheel
+ run: |
+ python -m pip install --user pytest
+ python -c "import gudhi; print(gudhi.__version__)"
+ python -m pytest ".\src\python\test\test_alpha_complex.py"
+ - name: Publish on PyPi
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ run: python -m twine upload build/src/python/dist/*