# Development guide

## Overview

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

* [Project Structure](/v0.11-branch/contributing/development-guide.md#repository-structure)
* [Making a Pull Request](/v0.11-branch/contributing/development-guide.md#making-a-pull-request)
* [Feast Data Storage Format](/v0.11-branch/contributing/development-guide.md#feast-data-storage-format)
* [Feast Protobuf API](/v0.11-branch/contributing/development-guide.md#feast-protobuf-api)

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

## Project Structure

Feast is composed of [multiple components](https://docs.feast.dev/v/master/concepts/architecture#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

### 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. |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.feast.dev/v0.11-branch/contributing/development-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
