Contributing
============
Thank you for contributing to ``radpair``. The project is a Python package
for analytic simulation of cw-EPR spectra of singlet-born spin-correlated
radical pairs.
Project Structure
-----------------
The package uses a ``src`` layout. All package code lives under
``src/radpair``:
* ``core.py`` — entry points ``do_simulation`` and
``do_simulation_multicore``.
* ``classes.py`` — ``Matrix`` (tensor rotation) and ``Core`` (nuclei group)
helper classes.
* ``functions.py`` — math helpers (unit conversion, Pascal triangles, tensor
rotation, grid generation).
* ``_wrappers.py`` — decorators: ``timer``, ``function_benchmark``,
``multicore`` (splits field axis across CPU cores).
``__init__.py`` is empty; there are no public re-exports. Import directly
from submodules. The package depends on `eprbase `_
for ``grid.Grid``, ``spectra.Spectra``, and ``interpolation.Interpolator``.
Development Setup
-----------------
The project requires Python 3.13 or newer. The repository uses ``uv`` for
dependency and environment management.
Clone the repository and change into its directory:
.. code-block:: console
git clone https://github.com/florianquintes/radpair.git
cd radpair
Install the locked development environment from the repository root:
.. code-block:: console
uv sync --dev
The package uses a ``src`` layout. Application code belongs under
``src/radpair`` and tests belong under ``tests``.
Branches
--------
Create a focused branch for each change and keep unrelated changes separate.
The repository does not currently document a required branch naming scheme.
Pull Requests
-------------
Pull requests should explain the change and include the relevant validation
results. Before opening a pull request, run the checks that apply to the
change:
.. code-block:: console
uv run ruff format --check .
uv run ruff check .
uv run pytest
uv build
If documentation is changed, also build the documentation as described in
the :doc:`development` page. Mention known baseline failures or warnings
rather than presenting them as regressions.
Code Style
----------
Follow the existing Python and reStructuredText style in the surrounding
files. Keep importable Python modules under ``src/radpair`` and add tests
under ``tests``.
Ruff is the configured formatting and code-quality tool, using its default
rules:
.. code-block:: console
uv run ruff format --check .
uv run ruff check .
Docstrings should follow the `numpydoc `_
style with LaTeX math where applicable. Type annotations are required on all
functions.
Documentation
-------------
Documentation source files are under ``docs/source``. The Sphinx
configuration reads the package version dynamically via
``importlib.metadata.version("radpair")``.
Build the documentation from the repository root:
.. code-block:: console
uv run sphinx-build -b html docs/source docs/build/html
The generated HTML is written to ``docs/build/html``. Add a title to every
document included by the root ``index.rst`` so Sphinx can include it in the
table of contents.