# Development guide

## Overview

This guide is targeted at developers looking to contribute to Feast:

* [Project Structure](#repository-structure)
* [Making a Pull Request](#making-a-pull-request)
* [Feast Data Storage Format](#feast-data-storage-format)
* [Feast Protobuf API](#feast-protobuf-api)

> Learn How the Feast [Contributing Process](https://docs.feast.dev/v0.14-branch/project/contributing) works.

## Project Structure

Feast is composed of [multiple components](https://docs.feast.dev/v0.14-branch/getting-started/architecture-and-components) distributed into multiple repositories:

| Repository                                                          | Description                                                                                                                                                                                      | Component(s)                                                                                                                                                                                            |
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Main Feast Repository](https://github.com/feast-dev/feast)         | Hosts all required code to run Feast. This includes the Feast Python SDK and Protobuf definitions. For legacy reasons this repository still contains Terraform config and a Go Client for Feast. | <ul><li><strong>Python SDK / CLI</strong></li><li><strong>Protobuf APIs</strong></li><li><strong>Documentation</strong></li><li><strong>Go Client</strong></li><li><strong>Terraform</strong></li></ul> |
| [Feast Java](https://github.com/feast-dev/feast-java)               | Java-specific Feast components. Includes the Feast Core Registry, Feast Serving for serving online feature values, and the Feast Java Client for retrieving feature values.                      | <ul><li><strong>Core</strong></li><li><strong>Serving</strong></li><li><strong>Java Client</strong></li></ul>                                                                                           |
| [Feast Spark](https://github.com/feast-dev/feast-spark)             | Feast Spark SDK & Feast Job Service for launching ingestion jobs and for building training datasets with Spark                                                                                   | <ul><li><strong>Spark SDK</strong></li><li><strong>Job Service</strong></li></ul>                                                                                                                       |
| [Feast Helm Chart](https://github.com/feast-dev/feast-helm-charts/) | Helm Chart for deploying Feast on Kubernetes & Spark.                                                                                                                                            | <ul><li><strong>Helm Chart</strong></li></ul>                                                                                                                                                           |

## Making a Pull Request

{% hint style="info" %}
See also the CONTRIBUTING.md in the corresponding GitHub repository (e.g. [main repo doc](https://github.com/feast-dev/feast/blob/master/CONTRIBUTING.md))
{% endhint %}

### Incorporating upstream changes from master

Our preference is the use of `git rebase` instead of `git merge` : `git pull -r`

### Signing commits

Commits have to be signed before they are allowed to be merged into the Feast codebase:

```bash
# Include -s flag to signoff
git commit -s -m "My first commit"
```

### Good practices to keep in mind

* Fill in the description based on the default template configured when you first open the PR
  * What this PR does/why we need it
  * Which issue(s) this PR fixes
  * Does this PR introduce a user-facing change
* Include `kind` label when opening the PR
* Add `WIP:` to PR name if more work needs to be done prior to review
* Avoid `force-pushing` as it makes reviewing difficult

**Managing CI-test failures**

* GitHub runner tests
  * Click `checks` tab to analyse failed tests
* Prow tests
  * Visit [Prow status page ](http://prow.feast.ai/)to analyse failed tests

## Feast Data Storage Format

Feast data storage contracts are documented in the following locations:

* [Feast Offline Storage Format](https://github.com/feast-dev/feast/blob/master/docs/specs/offline_store_format.md): Used by BigQuery, Snowflake (Future), Redshift (Future).
* [Feast Online Storage Format](https://github.com/feast-dev/feast/blob/master/docs/specs/online_store_format.md): Used by Redis, Google Datastore.

## Feast Protobuf API

Feast Protobuf API defines the common API used by Feast's Components:

* Feast Protobuf API specifications are written in [proto3](https://developers.google.com/protocol-buffers/docs/proto3) in the Main Feast Repository.
* Changes to the API should be proposed via a [GitHub Issue](https://github.com/feast-dev/feast/issues/new/choose) for discussion first.

### Generating Language Bindings

The language specific bindings have to be regenerated when changes are made to the Feast Protobuf API:

| Repository                                                  | Language | Regenerating Language Bindings                                               |
| ----------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| [Main Feast Repository](https://github.com/feast-dev/feast) | Python   | Run `make compile-protos-python` to generate bindings                        |
| [Main Feast Repository](https://github.com/feast-dev/feast) | Golang   | Run `make compile-protos-go` to generate bindings                            |
| [Feast Java](https://github.com/feast-dev/feast-java)       | Java     | No action required: bindings are generated automatically during compilation. |
