Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.
To set up for local development (requires poetry):
$ git clone https://github.com/pyinat/pyinaturalist.git
$ cd pyinaturalist
$ poetry install -v -E docs
Here are some general guidelines for submitting a pull request:
- If the changes are trivial, just submit a PR and briefly explain the changes in the description.
- Otherwise, please submit an issue describing the proposed change prior to submitting a PR.
- Make sure the code is tested, documented, and type-annotated (as described in sections below).
- Submit the PR to be merged into the
main
branch.
We use the pytest framework for unit testing.
Just run the pytest
command to run locally.
For PRs, GitHub Actions will run these tests for each supported python version.
You can use nox to do this locally, if needed:
nox -e test
Or to run tests for a specific python version:
nox -e test-3.10
See nox --list
for a ful list of available commands.
For PRs, please include docstrings for all functions and classes.
To build the docs locally:
$ nox -e docs
To preview:
# MacOS:
$ open docs/_build/html/index.html
# Linux:
$ xdg-open docs/_build/html/index.html
You can also use sphinx-autobuild to rebuild the docs and live reload in the browser whenever doc contents change:
$ nox -e livedocs
Project documentation is generated using Sphinx, MyST, and several Sphinx extensions and custom templates. See conf.py for more details.
Documentation is automatically built by ReadTheDocs whenever code is merged into main
:
For any new or changed behavior, add a brief high-level summary to HISTORY.md
.
This isn't needed for internal changes (tests, other docs, refactoring, etc.).
All parameters and return values should have type annotations, which will be checked by mypy
and
will show up in the documentation.
Code checking and formatting tools used include:
All of these will be run by GitHub Actions on pull requests. You can also run them locally with:
nox -e lint
Optionally, you can use pre-commit to automatically run all of these checks before a commit is made:
pre-commit install
This can save you some time in that it will show you errors immediately rather than waiting for CI jobs to complete, or if you forget to manually run the checks before committing.
You can disable these hooks at any time with:
pre-commit uninstall
Notes for maintainers on publishing new releases:
Releases are based on git tags. GitHub Actions will build and deploy packages to PyPi on tagged commits
on the main
branch. Release steps:
- Update the version in both
pyproject.toml
andpyinaturalist/__init__.py
- Update the release notes in
HISTORY.md
- Push a new tag, e.g.:
git tag v0.1.0 && git push --tags
- This will trigger a deployment. Verify that this completes successfully and that the new version
can be installed from PyPI with
pip install pyinaturalist
. - Verify that the docs are built and published to Read The Docs.
- A PR for a new Conda release will be created by a bot on the pyinaturalist-feedstock
repo. It may take a couple hours after PyPI deployment for this to happen. Typically this will be
auto-merged and built without any manual action required. Just verify that this completes successfully
and that the new version can be installed from conda-forge with
conda install -c conda-forge pyinaturalist
.- If new dependencies have been added, then those must also be added to the conda recipe.
- A Docker build will be triggered for pyinaturalist-notebook. Verify that this successfully gets deployed to Docker Hub.