# Feldera Python SDK

The `feldera` Python package is the Python client for the Feldera HTTP API.

The Python SDK documentation is available at: https://docs.feldera.com/python

## Getting started

### Installation

```bash
uv pip install feldera
```

### Example usage

The Python client interacts with the API server of the Feldera instance.

```python
# File: example.py
from feldera import FelderaClient, PipelineBuilder, Pipeline

# Instantiate client
client = FelderaClient()  # Default: http://localhost:8080 without authentication
# client = FelderaClient(url="https://localhost:8080", api_key="apikey:...", requests_verify="/path/to/tls.crt")

# (Re)create pipeline
name = "example"
sql = """
CREATE TABLE t1 (i1 INT) WITH ('materialized' = 'true');
CREATE MATERIALIZED VIEW v1 AS SELECT * FROM t1;
"""
print("(Re)creating pipeline...")
pipeline = PipelineBuilder(client, name, sql).create_or_replace()
pipeline.start()
print(f"Pipeline status: {pipeline.status()}")
pipeline.pause()
print(f"Pipeline status: {pipeline.status()}")
pipeline.stop(force=True)

# Find existing pipeline
pipeline = Pipeline.get(name, client)
pipeline.start()
print(f"Pipeline status: {pipeline.status()}")
pipeline.stop(force=True)
pipeline.clear_storage()
```

Run using:
```bash
uv run python example.py
```

### Environment variables

Some default parameter values in the Python SDK can be overridden via environment variables.

**Environment variables for `FelderaClient(...)`**

```bash
export FELDERA_HOST="https://localhost:8080"  # Overrides default for `url`
export FELDERA_API_KEY="apikey:..."  # Overrides default for `api_key`

# The following together override default for `requests_verify`
# export FELDERA_TLS_INSECURE="false"  # If set to "1", "true" or "yes" (all case-insensitive), disables TLS certificate verification
# export FELDERA_HTTPS_TLS_CERT="/path/to/tls.crt"  # Custom TLS certificate
```

**Environment variables for `PipelineBuilder(...)`**

```bash
export FELDERA_RUNTIME_VERSION="..."  # Overrides default for `runtime_version`
```

## Development

Development assumes you have cloned the Feldera code repository.

### Installation

```bash
cd python
# Optional: create and activate virtual environment if you don't have one
uv venv
source .venv/bin/activate
# Install in editable mode
uv pip install -e .
```

### Formatting

Formatting requires the `ruff` package: `uv pip install ruff`

```bash
cd python
ruff check
ruff format
```

### Tests

Running the test requires the `pytest` package: `uv pip install pytest`

```bash
# All tests
cd python
uv run python -m pytest tests/

# Specific tests directory
uv run python -m pytest tests/platform/

# Specific test file
uv run python -m pytest tests/platform/test_pipeline_crud.py

# Specific test
uv run python -m pytest tests/platform/test_pipeline_crud.py::test_pipeline_post

# Tip: add argument -x at the end for it to fail fast
# Tip: add argument -s at the end to show stdout/stderr
```

For further information about the tests, please see `tests/README.md`.

### Documentation

Building documentation requires the `sphinx` package: `uv pip install sphinx`

```bash
cd python/docs
sphinx-apidoc -o . ../feldera
make html
make clean  # Cleanup afterwards
```

### Installation from GitHub

Latest `main` branch:
```bash
uv pip install git+https://github.com/feldera/feldera#subdirectory=python
```

Different branch (replace `BRANCH_NAME`):
```bash
uv pip install git+https://github.com/feldera/feldera@BRANCH_NAME#subdirectory=python
```
