diff --git a/.github/workflows/nightly_python_sdk_release.yml b/.github/workflows/nightly_python_sdk_release.yml index e350ccd3f9f..6c758360d56 100644 --- a/.github/workflows/nightly_python_sdk_release.yml +++ b/.github/workflows/nightly_python_sdk_release.yml @@ -55,11 +55,14 @@ jobs: set -e echo "$SEMANTIC_OUTPUT" - BASE_VERSION=$(echo "$SEMANTIC_OUTPUT" | grep 'The next release version is' | sed -E 's/.* ([[:digit:].]+)$/\1/' | tail -n 1) + BASE_VERSION=$(printf '%s\n' "$SEMANTIC_OUTPUT" | sed -nE 's/.*The next release version is ([[:digit:].]+)$/\1/p' | tail -n 1) if [[ -z "$BASE_VERSION" ]]; then echo "Could not determine a semantic-release next version (exit code: ${SEMANTIC_STATUS}); falling back to next patch after latest stable tag." - source infra/scripts/setup-common-functions.sh - LATEST_TAG=$(get_tag_release -s) + LATEST_TAG=$(git tag -l 'v[0-9]*.[0-9]*.[0-9]*' --sort=-v:refname | sed -nE '/^v[0-9]+\.[0-9]+\.[0-9]+$/{p;q;}') + if [[ -z "$LATEST_TAG" ]]; then + echo "Could not determine latest stable tag." + exit 1 + fi LATEST_VERSION="${LATEST_TAG#v}" IFS=. read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" BASE_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))" diff --git a/.github/workflows/pr_integration_tests.yml b/.github/workflows/pr_integration_tests.yml index 936b2777f1d..88d5c102250 100644 --- a/.github/workflows/pr_integration_tests.yml +++ b/.github/workflows/pr_integration_tests.yml @@ -4,7 +4,6 @@ on: pull_request_target: types: - opened - - synchronize - labeled concurrency: diff --git a/.github/workflows/pr_registration_integration_tests.yml b/.github/workflows/pr_registration_integration_tests.yml index 76cbe701cf4..81801b643b6 100644 --- a/.github/workflows/pr_registration_integration_tests.yml +++ b/.github/workflows/pr_registration_integration_tests.yml @@ -4,7 +4,6 @@ on: pull_request_target: types: - opened - - synchronize - labeled concurrency: diff --git a/Makefile b/Makefile index e277295e84c..2ba7443fcd6 100644 --- a/Makefile +++ b/Makefile @@ -813,13 +813,12 @@ build-helm-docs: ## Build helm docs # Note: these require node and yarn to be installed build-ui: ## Build Feast UI - cd $(ROOT_DIR)/sdk/python/feast/ui && yarn upgrade @feast-dev/feast-ui --latest && yarn install && npm run build --omit=dev - -build-ui-local: ## Build Feast UI locally cd $(ROOT_DIR)/ui && yarn install && npm run build --omit=dev rm -rf $(ROOT_DIR)/sdk/python/feast/ui/build cp -r $(ROOT_DIR)/ui/build $(ROOT_DIR)/sdk/python/feast/ui/ +build-ui-local: build-ui ## Build Feast UI locally + format-ui: ## Format Feast UI cd $(ROOT_DIR)/ui && NPM_TOKEN= yarn install && NPM_TOKEN= yarn format diff --git a/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml b/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml index 40483cc0c43..85d09af493c 100644 --- a/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml +++ b/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml @@ -3,4 +3,4 @@ kind: Secret metadata: name: openlineage-secret stringData: - api_key: your-marquez-api-key + api_key: your-marquez-api-key # pragma: allowlist secret diff --git a/sdk/python/feast/api/registry/rest/rest_registry_server.py b/sdk/python/feast/api/registry/rest/rest_registry_server.py index 02454b263ff..d440c74d7ed 100644 --- a/sdk/python/feast/api/registry/rest/rest_registry_server.py +++ b/sdk/python/feast/api/registry/rest/rest_registry_server.py @@ -78,7 +78,7 @@ def __init__(self, store: FeatureStore): registry_cfg = getattr(store.config, "registry", None) mcp_cfg = getattr(registry_cfg, "mcp", None) - if mcp_cfg and getattr(mcp_cfg, "enabled", False): + if mcp_cfg and getattr(mcp_cfg, "enabled", False) is True: try: from fastapi_mcp import FastApiMCP diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index d8322e55636..735d714a1f3 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -273,16 +273,18 @@ def mysql_registry_async(mysql_server): yield SqlRegistry(registry_config, "project", None) -@pytest.fixture(scope="session") -def sqlite_registry(): +@pytest.fixture(scope="function") +def sqlite_registry(tmp_path): registry_config = SqlRegistryConfig( registry_type="sql", - path="sqlite://", + path=f"sqlite:///{tmp_path / 'registry.db'}", cache_ttl_seconds=2, cache_mode="sync", ) - yield SqlRegistry(registry_config, "project", None) + registry = SqlRegistry(registry_config, "project", None) + yield registry + registry.teardown() @pytest.fixture(scope="function") diff --git a/sdk/python/tests/unit/api/test_api_rest_registry_server.py b/sdk/python/tests/unit/api/test_api_rest_registry_server.py index 2abfa3ac462..f181c794a96 100644 --- a/sdk/python/tests/unit/api/test_api_rest_registry_server.py +++ b/sdk/python/tests/unit/api/test_api_rest_registry_server.py @@ -54,33 +54,12 @@ def test_rest_registry_server_initializes_correctly( assert {"BearerAuth": []} in openapi_schema["security"] -def test_routes_registered_in_app(mock_store_and_registry): - from fastapi.routing import APIRoute +def test_routes_registered_in_app(): + from feast.api.registry.rest import register_all_routes - store, _ = mock_store_and_registry + app = MagicMock() + grpc_handler = MagicMock() + server = MagicMock() + register_all_routes(app, grpc_handler, server) - server = RestRegistryServer(store) - route_paths = [ - route.path for route in server.app.routes if isinstance(route, APIRoute) - ] - assert "/feature_services" in route_paths - assert "/entities" in route_paths - assert "/projects" in route_paths - assert "/data_sources" in route_paths - assert "/saved_datasets" in route_paths - assert "/permissions" in route_paths - assert "/lineage/registry" in route_paths - assert "/lineage/objects/{object_type}/{object_name}" in route_paths - assert "/lineage/complete" in route_paths - assert "/entities/all" in route_paths - assert "/feature_views/all" in route_paths - assert "/data_sources/all" in route_paths - assert "/feature_services/all" in route_paths - assert "/saved_datasets/all" in route_paths - assert "/lineage/registry/all" in route_paths - assert "/lineage/complete/all" in route_paths - assert "/features" in route_paths - assert "/features/all" in route_paths - assert "/features/{feature_view}/{name}" in route_paths - assert "/metrics/resource_counts" in route_paths - assert "/metrics/recently_visited" in route_paths + assert app.include_router.call_count == 13