@@ -55,14 +55,35 @@ protos: compile-protos-python compile-protos-docs ## Compile protobufs for Pytho
5555build : protos build-docker # # Build protobufs and Docker images
5656
5757format-python : # # Format Python code
58- cd ${ROOT_DIR} /sdk/python; python -m ruff check --fix feast/ tests/
59- cd ${ROOT_DIR} /sdk/python; python -m ruff format feast/ tests/
58+ cd ${ROOT_DIR} /sdk/python && uv run ruff check --fix feast/ tests/
59+ cd ${ROOT_DIR} /sdk/python && uv run ruff format feast/ tests/
6060
6161lint-python : # # Lint Python code
62- cd ${ROOT_DIR} /sdk/python; python -m mypy feast
63- cd ${ROOT_DIR} /sdk/python; python -m ruff check feast/ tests/
64- cd ${ROOT_DIR} /sdk/python; python -m ruff format --check feast/ tests
65-
62+ cd ${ROOT_DIR} /sdk/python && uv run ruff check feast/ tests/
63+ cd ${ROOT_DIR} /sdk/python && uv run mypy feast
64+
65+ # New combined target
66+ precommit-check : format-python lint-python # # Run all precommit checks
67+ @echo " ✅ All precommit checks passed"
68+
69+ # Install precommit hooks with correct stages
70+ install-precommit : # # Install precommit hooks (runs on commit, not push)
71+ pip install pre-commit
72+ pre-commit install --hook-type pre-commit
73+ @echo " ✅ Precommit hooks installed (will run on commit, not push)"
74+
75+ # Manual full type check
76+ mypy-full : # # Full MyPy type checking with all files
77+ cd ${ROOT_DIR} /sdk/python && uv run mypy feast tests
78+
79+ # Run precommit on all files
80+ precommit-all : # # Run all precommit hooks on all files
81+ pre-commit run --all-files
82+
83+ # Make scripts executable
84+ setup-scripts : # # Make helper scripts executable
85+ chmod +x scripts/uv-run.sh scripts/check-init-py.sh
86+
6687# #@ Python SDK - local
6788# formerly install-python-ci-dependencies-uv-venv
6889# editable install
@@ -151,14 +172,36 @@ benchmark-python-local: ## Run integration + benchmark tests for Python (local d
151172# #@ Tests
152173
153174test-python-unit : # # Run Python unit tests (use pattern=<pattern> to filter tests, e.g., pattern=milvus, pattern=test_online_retrieval.py, pattern=test_online_retrieval.py::test_get_online_features_milvus)
154- python -m pytest -n 8 --color=yes $(if $(pattern ) ,-k "$(pattern ) ") sdk/python/tests
175+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest -n 8 --color=yes $(if $(pattern ) ,-k "$(pattern ) ") tests
176+
177+ # Fast unit tests only
178+ test-python-unit-fast : # # Run fast unit tests only (no external dependencies)
179+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest tests/unit -n auto -x --tb=short
180+
181+ # Changed files only (requires pytest-testmon)
182+ test-python-changed : # # Run tests for changed files only
183+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest --testmon -n 8 --tb=short
184+
185+ # Quick smoke test for PRs
186+ test-python-smoke : # # Quick smoke test for development
187+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest \
188+ tests/unit/test_feature_store.py \
189+ tests/unit/test_repo_operations.py \
190+ -n 4 --tb=short
155191
156192test-python-integration : # # Run Python integration tests (CI)
157- python -m pytest --tb=short -v -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \
193+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest --tb=short -v -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \
158194 -k " (not snowflake or not test_historical_features_main)" \
159195 -m " not rbac_remote_integration_test" \
160196 --log-cli-level=INFO -s \
161- sdk/python/tests
197+ tests
198+
199+ # Integration tests with better parallelization
200+ test-python-integration-parallel : # # Run integration tests with enhanced parallelization
201+ cd ${ROOT_DIR} /sdk/python && uv run python -m pytest tests/integration \
202+ -n auto --dist loadscope \
203+ --timeout=300 --tb=short -v \
204+ --integration --color=yes --durations=20
162205
163206test-python-integration-local : # # Run Python integration tests (local dev mode)
164207 FEAST_IS_LOCAL_TEST=True \
@@ -220,7 +263,7 @@ test-python-historical-retrieval:
220263 test_historical_features_persisting or \
221264 test_historical_retrieval_fails_on_validation" \
222265 sdk/python/tests
223-
266+
224267test-python-universal-trino : # # Run Python Trino integration tests
225268 PYTHONPATH=' .' \
226269 FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.trino_repo_configuration \
@@ -622,7 +665,7 @@ build-feature-transformation-server-docker: ## Build Feature Transformation Serv
622665push-feature-server-java-docker : # # Push Feature Server Java Docker image
623666 docker push $(REGISTRY ) /feature-server-java:$(VERSION )
624667
625- build-feature-server-java-docker : # # Build Feature Server Java Docker image
668+ build-feature-server-java-docker : # # Build Feature Server Java Docker image
626669 docker buildx build --build-arg VERSION=$(VERSION ) \
627670 -t $(REGISTRY ) /feature-server-java:$(VERSION ) \
628671 -f java/infra/docker/feature-server/Dockerfile --load .
@@ -721,12 +764,12 @@ build-ui-local: ## Build Feast UI locally
721764 cd $(ROOT_DIR ) /ui && yarn install && npm run build --omit=dev
722765 rm -rf $(ROOT_DIR ) /sdk/python/feast/ui/build
723766 cp -r $(ROOT_DIR ) /ui/build $(ROOT_DIR ) /sdk/python/feast/ui/
724-
767+
725768format-ui : # # Format Feast UI
726769 cd $(ROOT_DIR ) /ui && NPM_TOKEN= yarn install && NPM_TOKEN= yarn format
727770
728771
729- # #@ Go SDK
772+ # #@ Go SDK
730773PB_REL = https://github.com/protocolbuffers/protobuf/releases
731774PB_VERSION = 30.2
732775PB_ARCH := $(shell uname -m)
@@ -792,4 +835,3 @@ build-go-docker-dev: ## Build Go Docker image for development
792835 docker buildx build --build-arg VERSION=dev \
793836 -t feastdev/feature-server-go:dev \
794837 -f go/infra/docker/feature-server/Dockerfile --load .
795-
0 commit comments