Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
de2f83b
Added Biqquery support + added bigquery to examples + fixed issues + …
FFTLabs Nov 17, 2025
1e5e781
Fixed fixtures.py
FFTLabs Nov 17, 2025
be8ce71
Fixed fixtures.py
FFTLabs Nov 17, 2025
9a2f1df
Fixed some linting issues
FFTLabs Nov 17, 2025
3679b0a
Fixed imports
FFTLabs Nov 17, 2025
131e386
Fixed biqquery imports
FFTLabs Nov 17, 2025
538d76d
Added typing module as a facase to house all optional dependencies
FFTLabs Nov 17, 2025
8b83295
Fixed further typing errors
FFTLabs Nov 17, 2025
a6f112d
Fixed further typing errors
FFTLabs Nov 17, 2025
0a1fadb
Fixed further typing errors
FFTLabs Nov 17, 2025
81bcada
Fixed further typing errors
FFTLabs Nov 17, 2025
cb16a22
Fixed further typing errors
FFTLabs Nov 17, 2025
532d48f
Fixed further typing errors
FFTLabs Nov 17, 2025
3ef28b3
Updated CI and gitignore
FFTLabs Nov 18, 2025
38eff0b
Added logging to _run_cmd test command
FFTLabs Nov 18, 2025
1513175
Removed dependecy on requests for httpx
FFTLabs Nov 18, 2025
f2a0729
Guarded import for optional imports in examples
FFTLabs Nov 18, 2025
f72f625
Guarded import for optional bigquery imports in examples
FFTLabs Nov 18, 2025
223e21a
Changed gitignore
FFTLabs Nov 18, 2025
e178406
Guarded import for optional bigquery imports in examples
FFTLabs Nov 18, 2025
1d3e97b
Guarded import for optional bigquery imports in examples
FFTLabs Nov 18, 2025
198e3e7
Added envfile loading to ci
FFTLabs Nov 18, 2025
7760183
Removed hardcoded postgres env in ci.yml
FFTLabs Nov 18, 2025
f464109
Fix in ci.yml
FFTLabs Nov 18, 2025
0dcd75d
Fix in ci.yml
FFTLabs Nov 18, 2025
07d7c4a
Fix in ci.yml
FFTLabs Nov 18, 2025
0598551
Fix in ci.yml
FFTLabs Nov 18, 2025
71651f0
Fix for databricks_spark test fixture
FFTLabs Nov 18, 2025
858be42
Fixed pylance errors in examples for databricks_spark and bigquery + …
FFTLabs Nov 18, 2025
c9ab26c
Fixed JAVA_HOME for CI in api_demo
FFTLabs Nov 18, 2025
fbb4ffa
Fixed JAVA_HOME for CI in examples
FFTLabs Nov 18, 2025
7b1c61f
Fixed docs
FFTLabs Nov 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 165 additions & 30 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,6 @@ jobs:
git rev-parse --short HEAD
git log -1 --stat

- name: "Debug: ensure pyproject present"
run: |
test -f pyproject.toml || (echo "pyproject.toml fehlt!" && exit 1)
ls -la

- name: "Debug: Ruff version & scope"
run: |
uv run ruff --version
echo "---- Ruff will lint these files (no cache) ----"
uv run ruff check src tests --no-cache --show-files

- name: Ruff (lint)
run: uv run ruff check src tests --no-cache --output-format=github

Expand All @@ -66,7 +55,54 @@ jobs:
- name: Unit tests (fast)
env:
PYTHONWARNINGS: default
run: uv run pytest -q tests -m unit --maxfail=1
run: uv run pytest -q tests -m "unit and not (postgres or databricks_spark or bigquery or snowflake)" --maxfail=1

# ---------- Engine-specific unit slices (require optional extras) ----------
unit-matrix:
runs-on: ubuntu-latest
needs: checks
strategy:
fail-fast: false
matrix:
include:
- name: postgres
extra: postgres
marker: "unit and postgres"
- name: databricks_spark
extra: spark
marker: "unit and databricks_spark"
java: true
- name: bigquery
extra: bigquery_bf
marker: "unit and bigquery"
- name: snowflake
extra: snowflake
marker: "unit and snowflake"

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup uv (and Python)
uses: astral-sh/setup-uv@v5
with:
python-version: "3.12"
enable-cache: true

- name: Sync deps (dev + extra)
run: uv sync --extra dev --extra ${{ matrix.extra }} --frozen

- name: Setup Java for Spark
if: matrix.java == true
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Run unit tests for engine
env:
PYTHONWARNINGS: default
run: uv run pytest -q tests -m "${{ matrix.marker }}" --maxfail=1

# ---------- Examples: Integration Tests ----------
examples-matrix:
Expand All @@ -75,7 +111,101 @@ jobs:
strategy:
fail-fast: false
matrix:
engine: [duckdb, postgres, databricks_spark]
include:
# DuckDB examples
- engine: duckdb
extra: ""
example: api_demo
env_file: examples/api_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: basic_demo
env_file: examples/basic_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: cache_demo
env_file: examples/cache_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: dq_demo
env_file: examples/dq_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: incremental_demo
env_file: examples/incremental_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: macros_demo
env_file: examples/macros_demo/.env.dev_duckdb
- engine: duckdb
extra: ""
example: materializations_demo
env_file: examples/materializations_demo/.env.dev_duckdb
# Postgres examples
- engine: postgres
extra: "postgres"
example: api_demo
env_file: examples/api_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: basic_demo
env_file: examples/basic_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: cache_demo
env_file: examples/cache_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: dq_demo
env_file: examples/dq_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: incremental_demo
env_file: examples/incremental_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: macros_demo
env_file: examples/macros_demo/.env.dev_postgres
- engine: postgres
extra: "postgres"
example: materializations_demo
env_file: examples/materializations_demo/.env.dev_postgres
# Spark examples
- engine: databricks_spark
extra: "spark"
example: api_demo
java: true
env_file: examples/api_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: basic_demo
java: true
env_file: examples/basic_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: cache_demo
java: true
env_file: examples/cache_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: dq_demo
java: true
env_file: examples/dq_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: incremental_demo
java: true
env_file: examples/incremental_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: macros_demo
java: true
env_file: examples/macros_demo/.env.dev_databricks
- engine: databricks_spark
extra: "spark"
example: materializations_demo
java: true
env_file: examples/materializations_demo/.env.dev_databricks

services:
postgres:
Expand All @@ -102,8 +232,13 @@ jobs:
python-version: "3.12"
enable-cache: true

- name: Sync deps (dev)
run: uv sync --extra dev --frozen
- name: Sync deps (dev + extra)
run: |
extras="--extra dev"
if [ -n "${{ matrix.extra }}" ]; then
extras="$extras --extra ${{ matrix.extra }}"
fi
uv sync $extras --frozen

- name: Setup Java for Spark
if: matrix.engine == 'databricks_spark'
Expand All @@ -113,19 +248,19 @@ jobs:
java-version: '17'

- name: Run example/integration tests for engine
env:
FF_PG_DSN: postgresql+psycopg://postgres:postgres@localhost:5432/fastflowtransform
FF_PG_SCHEMA: ci_examples
run: |
echo "Running integration tests for engine=${{ matrix.engine }}"
case "${{ matrix.engine }}" in
duckdb)
uv run pytest -m "integration and duckdb" --maxfail=1 -q tests
;;
postgres)
uv run pytest -m "integration and postgres" --maxfail=1 -q tests
;;
databricks_spark)
uv run pytest -m "integration and databricks_spark" --maxfail=1 -q tests
;;
esac
echo "Running integration tests for engine=${{ matrix.engine }} example=${{ matrix.example }}"
set -a
unset FF_PG_DSN FF_PG_SCHEMA
if [ -f "${{ matrix.env_file }}" ]; then
source "${{ matrix.env_file }}"
fi
if [ "${{ matrix.engine }}" = "postgres" ]; then
export FF_PG_SCHEMA="${{ matrix.example }}"
export FF_PG_DSN="${FF_PG_DSN:-postgresql+psycopg://postgres:postgres@localhost:5432/fastflowtransform}"
fi
set +a
uv run pytest -m "integration and ${{ matrix.engine }}" \
-vv --show-capture=all --log-cli-level=INFO \
-k "${{ matrix.example }} and ${{ matrix.engine }}" \
--maxfail=1 -q tests/integration/examples/test_examples_matrix.py
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Envs & Secrets
.env.local
.env.*.local
secrets/

# Local DBs / Artifacts
*.duckdb
Expand All @@ -19,6 +20,7 @@ __pycache__/
*.egg-info/
.build/
.eggs/
.uv-cache/
.DS_Store

# Tooling Caches
Expand All @@ -31,7 +33,8 @@ htmlcov/
# Build Artifacts
build/
dist/
site/dag
**/site/dag/
**/site/dag/**
spark-warehouse
metastore_db
derby.log
Expand Down
1 change: 0 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ repos:
pass_filenames: false
types_or: [python]

# Optional: dieselben Checks auch beim Push fürs „CI-Gefühl“
- id: prepush-ruff
name: ruff (pre-push)
entry: uv run ruff check src tests
Expand Down
12 changes: 12 additions & 0 deletions Contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,18 @@ pytest -q
make demo
```

For engines behind optional extras, run targeted installs/tests in a matrix (local or CI) to catch import/runtime gaps without pulling every dependency:

```bash
uv pip install -e .[duckdb] # core
uv pip install -e .[postgres]
uv pip install -e .[bigquery]
uv pip install -e .[bigquery_bf]
uv pip install -e .[spark]
uv pip install -e .[snowflake]
# or uv pip install -e .[full] for an all-in-one sweep
```

---

## 🧑‍🤝‍🧑 Code of Conduct
Expand Down
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

SHELL := /bin/bash

# Defaults (per CLI überschreibbar): make FF_PROJECT=examples/postgres FF_ENV=stg
FF_PROJECT ?= examples/simple_duckdb
FF_DB ?= $(FF_PROJECT)/.local/demo.duckdb
FF_ENV ?= dev
Expand Down
2 changes: 1 addition & 1 deletion Makefile.pipeline
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ demo: seed run dag demo-open test
clean:
rm -rf .local "$(FF_PROJECT)/docs" dist build *.egg-info

# --- Cache demos (v0.3) ---
# --- Cache demos ---

cache_rw_first:
# first run writes cache and meta
Expand Down
Loading