blob: 0ebe626c0d684dc2f0f69e5782383c5b3cf12c3a [file] [log] [blame] [view]
# Contributing Guide
## Bug Reports & Feedback
If you discover a bug, want to propose a new feature, or have other feedback about requests-cache, please
[create an issue](https://github.com/reclosedev/requests-cache/issues/new/choose)!
## Project Discussion
If you want to discuss ideas about the project in general, or if you have an issue or PR that hasn't
received a response in a timely manner, please reach out on the Code Shelter chat server, under
[projects/requests-cache](https://codeshelter.zulipchat.com/#narrow/stream/186993-projects/topic/requests-cache).
## Development Status
Requests-cache is under active development! Contributions are very welcome, and will be attributed on the
[Contributors](https://requests-cache.readthedocs.io/en/latest/project_info/contributors.html)
page.
## How to Help
If you are interested in helping out, here are a few ways to get started:
* Give feedback on open issues
* Make or suggest improvements for the documentation; see [#355](https://github.com/reclosedev/requests-cache/issues/355) for details.
* See the [help-wanted](https://github.com/reclosedev/requests-cache/labels/help-wanted) issue label
* See the [shelved](https://github.com/reclosedev/requests-cache/issues?q=label%3Ashelved) issue
label for features that have been previously proposed and are not currently planned, but not
completely ruled out either
* If you find an issue you want to work on, please comment on it so others know it's in progress
## Pre-release Installation
If you want to test out the latest in-development changes, you can install pre-release versions:
```bash
pip install --pre requests-cache
```
Pre-release documentation can be found here: https://requests-cache.readthedocs.io/en/latest/
## Dev Installation
To set up for local development (requires [poetry](https://python-poetry.org/docs/#installation)):
```bash
git clone https://github.com/reclosedev/requests-cache.git
cd requests-cache
poetry install -v -E all
```
## Pre-commit Hooks
CI jobs will run code style checks, type checks, linting, etc. If you would like to run these same
checks locally, you can use [pre-commit](https://github.com/pre-commit/pre-commit).
This is optional but recommended.
To install pre-commit hooks:
```bash
pre-commit install
```
To manually run checks on all files:
```bash
pre-commit run --all-files
# Alternative alias with nox:
nox -e lint
```
To disable pre-commit hooks:
```bash
pre-commit uninstall
```
## Testing
### Test Layout
* Tests are divided into unit and integration tests:
* Unit tests can be run without any additional setup, and **don't depend on any external services**.
* Integration tests **depend on additional services**, which are easiest to run using Docker
(see Integration Tests section below).
* See [conftest.py](https://github.com/reclosedev/requests-cache/blob/master/tests/conftest.py) for
[pytest fixtures](https://docs.pytest.org/en/stable/fixture.html) that apply the most common
mocking steps and other test setup.
### Running Tests
* Run `pytest` to run all tests
* Run `pytest tests/unit` to run only unit tests
* Run `pytest tests/integration` to run only integration tests
For CI jobs (including PRs), these tests will be run for each supported python version.
You can use [nox](https://nox.thea.codes) to do this locally, if needed:
```bash
nox -e test
```
Or to run tests for a specific python version:
```bash
nox -e test-3.10
```
To generate a coverage report:
```bash
nox -e cov
```
See `nox --list` for a ful list of available commands.
### Integration Test Containers
A live web server and backend databases are required to run integration tests, and docker-compose
config is included to make this easier. First, [install docker](https://docs.docker.com/get-docker/)
and [install docker-compose](https://docs.docker.com/compose/install/).
Then, run:
```bash
docker-compose up -d
pytest tests/integration
```
### Integration Test Alternatives
If you can't easily run Docker containers in your environment but still want to run some of the
integration tests, you can use [pytest-httpbin](https://github.com/kevin1024/pytest-httpbin) instead
of the httpbin container. This just requires installing an extra package and setting an environment
variable:
```bash
pip install pytest-httpbin
export USE_PYTEST_HTTPBIN=true
pytest tests/integration/test_cache.py
```
For backend databases, you can install and run them on the host instead of in a container, as long
as they are running on the default port.
## Documentation
[Sphinx](http://www.sphinx-doc.org/en/master/) is used to generate documentation.
To build the docs locally:
```bash
nox -e docs
```
To preview:
```bash
# MacOS:
open docs/_build/html/index.html
# Linux:
xdg-open docs/_build/html/index.html
```
You can also use [sphinx-autobuild](https://github.com/executablebooks/sphinx-autobuild) to rebuild the docs and live reload in the browser whenver doc contents change:
```bash
nox -e livedocs
```
### Readthedocs
Sometimes, there are differences in the Readthedocs build environment that can cause builds to
succeed locally but fail remotely. To help debug this, you can use the
[readthedocs/build](https://github.com/readthedocs/readthedocs-docker-images) container to build
the docs. A configured build container is included in `docs/docker-compose.yml` to simplify this.
Run with:
```bash
# Optionally add --build to rebuild with updated dependencies
docker-compose -f docs/docker-compose.yml up -d
docker exec readthedocs make all
```
## Pull Requests
Here are some general guidelines for submitting a pull request:
- If the changes are trivial, just briefly explain the changes in the PR description
- Otherwise, please submit an issue describing the proposed change prior to submitting a PR
- Add unit test coverage for your changes
- If your changes add or modify user-facing behavior, add documentation describing those changes
- Submit the PR to be merged into the `master` branch
## Notes for Maintainers
### Releases
- Releases are built and published to PyPI based on **git tags.**
- [Milestones](https://github.com/reclosedev/requests-cache/milestones) will be used to track
progress on major and minor releases.
- GitHub Actions will build and deploy packages to PyPI on tagged commits
on the `master` branch.
Release steps:
- Update the version in `requests_cache/__init__.py`
- Update the release notes in `HISTORY.md`
- Generate a sample cache for the new version (used by unit tests) with `python tests/generate_test_db.py`
- Merge changes into the `master` branch
- Push a new tag, e.g.: `git tag v0.1 && git push origin --tags`
- This will trigger a deployment. Verify that this completes successfully and that the new version
can be installed from pypi with `pip install`
### Pre-Releases
Pre-release builds are convenient for letting testers try out in-development changes. Versions with
the suffix `.dev` (among others) can be deployed to PyPI and installed by users with `pip install --pre`,
and are otherwise ignored by `pip install`:
```
# Install latest pre-release build:
pip install -U --pre requests-cache
# Install latest stable build
pip install -U requests-cache
```
Notes:
* See python packaging docs on
[pre-release versioning](https://packaging.python.org/guides/distributing-packages-using-setuptools/#pre-release-versioning) for more info on how this works
* Any collaborator can trigger a pre-release build for requests-cache by going to
**Actions > Deploy > Run workflow**
* A complete list of builds can by found on [PyPI under 'Release History'](https://pypi.org/project/requests-cache/#history)