Contributing guidelines
We welcome any kind of contribution to our software, from simple comment or question to a full fledged pull request. Please read and follow our Code of Conduct.
A contribution can be one of the following cases:
- you have a question;
- you think you may have found a bug (including unexpected behavior);
- you want to make some kind of change to the code base (e.g. to fix a bug, to add a new feature, to update documentation);
- you want to make a new release of the code base.
The sections below outline the steps in each case.
You have a question
- use the search functionality here to see if someone already filed the same issue;
- if your issue search did not yield any relevant results, make a new issue;
- apply the "Question" label; apply other labels when relevant.
You think you may have found a bug
- use the search functionality here to see if someone already filed the same issue;
- if your issue search did not yield any relevant results, make a new issue, making sure to provide enough information to the rest of the community to understand the cause and context of the problem. Depending on the issue, you may want to include:
- the SHA hashcode of the commit that is causing your problem;
- some identifying information (name and version number) for dependencies you're using;
- information about the operating system;
- apply relevant labels to the newly created issue.
You want to make some kind of change to the code base
- (important) announce your plan to the rest of the community before you start working. This announcement should be in the form of a (new) issue;
- (important) wait until some kind of consensus is reached about your idea being a good idea;
- if needed, fork the repository to your own Github profile and create your own feature branch off of the latest main commit. While working on your feature branch, make sure to stay up to date with the main branch by pulling in changes, possibly from the 'upstream' repository (follow the instructions here and here);
- install dependencies (see the development documentation);
- make sure the existing tests still work by running
pytest; - add your own tests (if necessary);
- update or expand the documentation;
- push your feature branch to (your fork of) the powerfit repository on GitHub;
- create the pull request, e.g. following the instructions here.
In case you feel like you've made a valuable contribution, but you don't know how to write or run tests for it, or how to generate the documentation: don't let this discourage you from making the pull request; we can help you! Just go ahead and submit the pull request, but keep in mind that you might be asked to append additional commits to your pull request.
You want to make a new release of the code base
To create a release you need write permission on the repository.
- Check the author list in
CITATION.cff - Bump the version in src/powerfit_em/init.py
- In installation.md adjust docker command to use new version.
- Merge the changes into the main branch.
- Go to the GitHub release page
- Press draft a new release button
- Fill tag, title and description field. For tag use version from pyproject.toml and prepend with "v" character. For description use "Rigid body fitting of high-resolution structures in low-resolution cryo-electron microscopy density maps." line plus press "Generate release notes" button.
- Press the Publish Release button
- Wait until Build and upload to PyPI has completed
- Verify new release is on PyPi
- Verify Zenodo version was added to https://doi.org/10.5281/zenodo.14185749
- Wait until Create and publish a Docker image has completed.
- Verify new Docker images
Contributing to documentation
Whenever you have changed something in the codebase, this also needs to be reflected in the documentation. To work on the PowerFit documentation you need to install the documentation version of using:
pip install -e .[docs]
Start the live-reloading docs server with:
mkdocs serve
Build the documentation site with:
mkdocs build
# The site will be built in the 'site/' directory.
# You can preview it with
python3 -m http.server -d site
Development
To develop PowerFit, you need to install the development version of it using.
pip install -e .[dev]
Tests can be run using
pytest
To run OpenCL on CPU install use pip install -e .[pocl] and make sure no other OpenCL platforms, like 'AMD Accelerated Parallel Processing' or 'NVIDIA CUDA', are installed .
The Docker container, that works for cpu and NVIDIA gpus, can be build with
docker build -t ghcr.io/haddocking/powerfit:v3.1.0 .
The Docker container, that works for AMD gpus, can be build with
docker build -t ghcr.io/haddocking/powerfit-rocm:v3.1.0 -f Dockerfile.rocm .
The binary wheels can be build for all supported platforms by running the https://github.com/haddocking/powerfit/actions/workflows/pypi-publish.yml GitHub action and downloading the artifacts. The workflow is triggered by a push to the main branch, a release or can be manually triggered.
Linting & formatting
To lint the Python code, run
ruff check
Use --fix to automatically fix some of the issues.
To format the Python code, run
ruff format
To check Cython code, run
cython-lint src/powerfit_em/_powerfit.pyx
To format the C code, run
clang-format -i src/powerfit_em/_extensions.c
To lint the C code, run
clang-tidy src/powerfit_em/_extensions.c -- \
-I"$(python -c 'from sysconfig import get_paths; print(get_paths()["include"])')" \
-I"$(python -c 'import numpy; print(numpy.get_include())')"