Developer guide#

C++ compiler#

To build ContourPy you will need a C++ compiler. This is usually GCC on Linux, Clang on macOS, or MSVC on Windows. You will also need ninja, binary wheels are available for many platforms that can be installed using pip.

Installing from source#

The source code for ContourPy is available from github. Either git clone it directly, or fork and git clone it from your fork, as usual. It is recommended to install ContourPy from source into a new virtual environment using conda, pyenv or virtualenv for example, rather than using your system Python.

Note

To use all of the installation features described below you will need a recent version of pip >= 23.1. You can upgrade your installed pip using:

$ python -m pip install --upgrade pip

From the base directory of your local contourpy git repository, build and install it using:

$ python -m pip install -v .

This is the simplest approach and uses a temporarily isolated environment to build ContourPy and then installs the built package into the current environment. If you make any changes to the source code (Python or C++) you will need to rerun this command to rebuild and reinstall.

Warning

Compiling from source using pip install within a conda environment can cause problems if your system compiler is significantly different from the one used to compile your conda packages. A typical problem on Linux is incompatible versions of GLIBCXX. If problems occur using system compilers, install conda compilers using

$ conda install -c conda-forge gcc_linux-64

or similar.

Installing using editable mode#

To develop ContourPy source code, the recommended approach is to install in editable mode without using build isolation. Using this approach avoids the need to manually rebuild after making changes to the source code (Python or C++) as ContourPy is rebuilt automatically whenever it is imported.

Firstly install the build requirements into your working environment:

$ python -m pip install -r build_requirements.txt

then build contourpy in editable mode without build isolation:

$ python -m pip install -ve . --no-build-isolation

Now whenever you import contourpy it will automatically rebuild if any source code files have changed. No specific indication is given when this occurs, but the import will take longer. If you wish to have visible confirmation of the rebuild then either set the environment variable MESONPY_EDITABLE_VERBOSE=1 or pass an extra configuration flag to your pip install command as follows:

$ python -m pip install -ve . --no-build-isolation -Ceditable-verbose=true

Install configuration options#

Configuration options can be passed to pip install to control aspects of the build process. Some of the most commonly used are described below. Others are documented on the websites of the build tools meson and meson-python.

Debug build#

The default build type for ContourPy is release which means it is built with performance optimisations and without debug symbols. This ensures that the code runs quickly and the binaries are small, which is what most end-users want.

For development purposes it can help to build in debug mode. This adds debug symbols, enables C++ assert statements, and disables performance optimisations. To produce a debug build use:

$ python -m pip install -v . -Csetup-args=-Dbuildtype=debug -Cbuilddir=build

or the editable mode equivalent.

C++ standard#

Although ContourPy is C++11 compliant the default C++ standard used to build is C++17. To change the C++ standard to, for example C++14, append -Csetup-args=-Dcpp_std=c++14 to the pip install command. For example:

$ python -m pip install -v . -Csetup-args=-Dcpp_std=c++14

Running tests#

To run the test suite, first ensure that the required dependencies are installed when building ContourPy and then run the tests using pytest:

$ python -m pip install -ve .[test]
$ pytest -v

Note

In some shells, such as zsh, quotes are required around .[test]. For example:

$ python -m pip install -ve ".[test]"

It is possible to exclude certain tests. To exclude image comparison tests, for example if you do not have Matplotlib or Pillow installed:

$ pytest -k "not image"

To exclude threaded tests:

$ pytest -k "not threads"

Other tests are excluded by default but can be manually enabled. To include tests that generate text output:

$ pytest --runtext

Warning

The ContourPy baseline images used for Matplotlib tests assume that the installed Matplotlib was built with the version of FreeType that it vendors. If you have built Matplotlib yourself using a different version of FreeType, as is usually the case for Linux distro packagers, you should not run text tests as the generated images will be different even if everything is working as expected.

To include tests that take a long time to run:

$ pytest --runslow

To run tests in parallel on all of your available CPUs:

$ pytest -n auto

Note

BokehRenderer tests will be run if Bokeh is installed, otherwise they will be skipped. The generated images for Bokeh tests are sensitive to the version of the browser and the Operating System used to generate them, so unless you have experience in this area you are advised to leave the generation and testing of Bokeh images to the ContourPy Continuous Integration tests.

Building the documentation#

To build the documentation:

$ python -m pip install -v .[docs]
$ cd docs
$ make html

and the top-level generated HTML file is docs/_build/html/index.html relate to the root of your github repository.

Pre-commit hooks#

Contributors are recommended to install pre-commit hooks which will automatically run various checks whenever git commit is run. First install pre-commit using either

$ pip install pre-commit

or

$ conda install -c conda-forge pre-commit

and then install the hooks using

$ pre-commit install

The hooks will then be run on each git commit. You can manually run the hooks outside of a `git commit using

$ pre-commit run --all-files