# Contributing ## Creating merge requests Any contributions to this project must happen through GitLab merge requests to the main development repository ([i10git.cs.fau.de/pycodegen/pystencils-sfg](https://i10git.cs.fau.de/pycodegen/pystencils-sfg)). For a merge request to be accepted, it needs to both pass the continous integration pipeline and be approved by a project maintainer. ## Free Software This project is free software under the GNU General Public Licence v3. As such, any submission of contributions via merge requests is considered as agreement to this licence. ## Developing `pystencils-sfg` ### Prequesites To develop pystencils-sfg, you will need at least these packages: - Python 3.10 - Git - A C++ compiler supporting at least C++20 (gcc >= 10, or clang >= 10) - GNU Make - CMake - Nox Before continuing, make sure that the above packages are installed on your machine. ### Fork and Clone To work within the `pystencils-sfg` source tree, first create a *fork* of this repository and clone it to your workstation. ### Set up your dev environment Create a virtual environment using either `venv` or `virtualenv` and install the pystencils-sfg source tree into it using an editable install, e.g. by running the following commands in the `pystencils-sfg` project root directory: ```bash python -m virtualenv .venv source .venv/bin/activate pip install -e . ``` If you have [nox](https://nox.thea.codes/en/stable/) installed, you can also set up your virtual environment by running `nox --session dev_env`. ### Code Style and Type Checking To contribute, please adhere to the Python code style set by [PEP 8](https://peps.python.org/pep-0008/). For consistency, format all your source files using the [black](https://pypi.org/project/black/) formatter, and check them regularily using the `flake8` linter through Nox: ```shell nox --session lint ``` Further, `pystencils-sfg` is being fully type-checked using [MyPy](https://www.mypy-lang.org/). All submitted code should contain type annotations ([PEP 484](https://peps.python.org/pep-0484/)) and must be correctly statically typed. Regularily check your code for type errors using ```shell nox --session typecheck ``` Both `flake8` and `mypy` are also run in the integration pipeline. ### Test Your Code We are working toward near-complete test coverage of the module source files. When you add code, make sure to include test cases for both its desired and exceptional behavior at the appropriate locations in the [tests](tests) directory. Unit tests should be placed under a path and filename mirroring the location of the API they are testing within the *pystencils-sfg* source tree. In [tests/generator_scripts](tests/generator_scripts), a framework is provided to test entire generator scripts for successful execution, correctness, and compilability of their output. Read the documentation within [test_generator_scripts.py](tests/generator_scripts/test_generator_scripts.py) for more information. Run the test suite by calling it through Nox: ```shell nox --session testsuite ``` This will also collect coverage information and produce a coverage report as a HTML site placed in the `htmlcov` folder.