## Fatcat Python Code

This directory contains python code for the fatcat project: a web interface
(`fatcat_web`) and a series of utilities and worker processes (`fatcat_tools`).
These depend on the API client library (`fatcat_openapi_client`, see below).

Most of this code is an "application" which is tightly interwoven and intended
to be run from this directory, but the client library is distributed on
pypi.org.

## Dependencies

This project uses `pipenv` to manage dependencies, and requires Python 3.8.
You can can install `pipenv` with `pip` (or `pip3`). If you also install
`pyenv`, `pipenv` will automatically install Python 3.8 for you if needed. You
may want to set the `PIPENV_VENV_IN_PROJECT` environment variable on your
development machine (see pipenv docs for details).

NOTE: ensure you are using at least pipenv version `2018.11.26`. Earlier
versions had a bug which caused problems with our local path dependency.

## API Client Library

The auto-generated python client library for the fatcat API lives under
`../fatcat_openapi_client`. It includes entity model objects and functions to call all
API endpoints; see the `README.md` for details.

To re-generate swagger-codegen python client library (requires docker installed
locally):

    ./codegen_python_client.sh

## Web Interface

To just run the web interface (which will try to connect to a back-end API
server on the same machine by default), use:

    # will listen on http://localhost:9810 by default
    pipenv run fatcat_webface.py

Almost all configuration is done via environment variables; see `example.env`
for a list of settings. If you copy this file to `.env` it will be sourced by
`pipenv` automatically; you can also load it in your shell like `source .env`.

If elasticsearch is not set up, you might want to create two empty indices:

    curl -XPUT localhost:9200/fatcat_release
    curl -XPUT localhost:9200/fatcat_container

## Running Tests

Many (though not all) python tests depend on access to a local running API
server (the `fatcatd` rust daemon, code in `../rust/`), which itself depends on
a local PostgreSQL database server. Tests will fail if this endpoint isn't
found. See the README there to get that set up first. The CI integration tests
build and start this daemon automatically.

To run the python tests (with `fatcatd` running locally on port 9411):

    sudo apt install libsnappy-dev
    pipenv install --dev
    cp example.env .env  # unless you already have a local env config
    pipenv run pytest

To calculate code coverage (of python code):

    pipenv run pytest --cov --cov-report html

To run 'lint' on the code base (note that this is pretty noisy and isn't
enforced by CI yet):

    pipenv run pylint fatcat*.py fatcat_tools fatcat_web