This repository contains a web API designed to make it easier to interact with, and build applications on, research data held in an s3 object store.
It was originally part of the AMI system for collecting and classifying images of moths from field cameras, and is intended for use in other projects that have a small to medium sized collection of images or sound samples and want to automate more of their data flow.
The install and setup documentation comes from the useful NERC-CEH python project template
From the root directory of the repo, run:
git config --local core.hooksPath .githooks/
This will set this repo up to use the git hooks in the .githooks/
directory. The hook runs ruff format --check
and ruff check
to prevent commits that are not formatted correctly or have errors. The hook intentionally does not alter the files, but informs the user which command to run.
Install the code with only the dependencies needed to run it:
pip install .
To work on the docs:
pip install -e .[docs]
To work on tests:
pip install -e .[test]
To run the linter and githook:
pip install -e .[lint]
The docs, tests, and linter packages can be installed together with:
pip install -e .[dev]
cd docs
make apidoc
To keep your documentation in sync with the package name. You may need to delete a file called os_api.rst
from ./docs/sources/...
If you want docs to be published to github pages automatically, go to your repo settings and enable docs from GitHub Actions and the workflows will do the rest.
The documentation is driven by Sphinx an industry standard for documentation with a healthy userbase and lots of add-ons. It uses sphinx-apidoc
to generate API documentation for the codebase from Python docstrings.
To run sphinx-apidoc
run:
# Install your package with optional dependencies for docs
pip install -e .[docs]
cd docs
make apidoc
This will populate ./docs/sources/...
with *.rst
files for each Python module, which may be included into the documentation.
Documentation can then be built locally by running make html
To run the tests run:
#Install package with optional dependencies for testing
pip install -e .[test]
pytest
This needs a set of credentials - an Access Key, a Secret Key and an Endpoint.
Overview of obtaining these details from JASMIN
.env
contains variables which hold the key-value pairs, they are automatically loaded when you run the API. The key names all include AWS
because they come originally from libraries to work with Amazon s3 storage, but JASMIN supports the same de facto standard.
Contents of .env
:
AWS_ACCESS_KEY_ID="key goes here"
AWS_SECRET_ACCESS_KEY="secret goes here"
AWS_URL_ENDPOINT="url goes here"
python src/os_api/api.py
This will bring up the OpenAPI documentation on localhost:8080
fastapi run --workers 4 src/os_api/api.py
docker build -t os_api .
docker run -f -p 80:80 os_api
podman build -t os_api .
podman run --env-file=.env -p=8000 --expose=8000 os_api
This codebase is set up using autosemver a tool that uses git commit history to calculate the package version. Each time you make a commit, it increments the patch version by 1. You can increment by:
- Normal commit. Use for bugfixes and small updates
- Increments patch version:
x.x.5 -> x.x.6
- Increments patch version:
- Commit starts with
* NEW:
. Use for new features- Increments minor version
x.1.x -> x.2.x
- Increments minor version
- Commit starts with
* INCOMPATIBLE:
. Use for API breaking changes- Increments major version
2.x.x -> 3.x.x
- Increments major version
The python code can be packaged into a docker image and pushed to the AWS ECR. For the deployment to succeed you must:
- Add 2 secrets to the GitHub Actions:
- AWS_REGION: <our-region>
- AWS_ROLE_ARN: <the-IAM-role-used-to-deploy>
- Add a repository to the ECR with the same name as the GitHub repo