From f293ae8d9f2d858c2b97fa5502cb113e926302d4 Mon Sep 17 00:00:00 2001 From: Anthonette Adanyin <106275232+antznette1@users.noreply.github.com> Date: Wed, 17 Dec 2025 11:20:02 +0000 Subject: [PATCH 01/26] fix: Populate Postgres `registry.path` during `feast init` (#5785) --- .../postgres/feature_repo/feature_store.yaml | 2 +- .../tests/unit/local_feast_tests/test_init.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/templates/postgres/feature_repo/feature_store.yaml b/sdk/python/feast/templates/postgres/feature_repo/feature_store.yaml index 0663ff0ad97..a2fc2f51b61 100644 --- a/sdk/python/feast/templates/postgres/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/postgres/feature_repo/feature_store.yaml @@ -2,7 +2,7 @@ project: my_project provider: local registry: registry_type: sql - path: postgresql://postgres:mysecretpassword@127.0.0.1:55001/feast + path: postgresql://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME cache_ttl_seconds: 60 sqlalchemy_config_kwargs: echo: false diff --git a/sdk/python/tests/unit/local_feast_tests/test_init.py b/sdk/python/tests/unit/local_feast_tests/test_init.py index 4543a239796..1f3c0993845 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_init.py +++ b/sdk/python/tests/unit/local_feast_tests/test_init.py @@ -67,3 +67,17 @@ def test_repo_init_with_underscore_in_project_name() -> None: ) result = runner.run(["apply"], cwd=repo_dir) assert result.returncode != 0 + + +def test_postgres_template_registry_path_is_parameterized() -> None: + template_fs_yaml = ( + Path(__file__).resolve().parents[3] + / "feast" + / "templates" + / "postgres" + / "feature_repo" + / "feature_store.yaml" + ) + contents = template_fs_yaml.read_text(encoding="utf-8") + expected = "path: postgresql://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME" + assert expected in contents From fc1599b7d60b38842753f6e9297634d01750f125 Mon Sep 17 00:00:00 2001 From: Willem Pienaar <6728866+woop@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:52:49 -0800 Subject: [PATCH 02/26] Remove Cast.ai logo from index page Removed Cast.ai logo from the homepage. --- infra/website/src/pages/index.astro | 3 --- 1 file changed, 3 deletions(-) diff --git a/infra/website/src/pages/index.astro b/infra/website/src/pages/index.astro index 9c0b8ba1d9e..fd651d86a02 100644 --- a/infra/website/src/pages/index.astro +++ b/infra/website/src/pages/index.astro @@ -114,9 +114,6 @@ features = store.retrieve_online_documents(
-
- -
From f2486a9b3657da1a92dff43ca337fc3f6134461e Mon Sep 17 00:00:00 2001 From: Srihari Date: Mon, 15 Dec 2025 11:05:46 +0530 Subject: [PATCH 03/26] Add Workbecnh Ray Compute engine and offline store test Signed-off-by: Srihari --- .../feast_wb_connection_integration_test.go | 30 +- .../test/e2e_rhoai/feast_wb_milvus_test.go | 31 +- .../feast_wb_ray_offline_store_test.go | 77 +++ .../resources/feast-wb-ray-test.ipynb | 516 ++++++++++++++++++ .../resources/kueue_resources_setup.yaml | 31 ++ .../test/utils/notebook_util.go | 30 + 6 files changed, 659 insertions(+), 56 deletions(-) create mode 100644 infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go create mode 100644 infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb create mode 100644 infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go index a284dc9e839..5b42bfe1276 100644 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go @@ -43,16 +43,6 @@ var _ = Describe("Feast Workbench Integration Connection Testing", Ordered, func feastCRName = "credit-scoring" ) - // Create and monitor notebook - createAndMonitorNotebook := func() { - nbParams := utils.GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir) - By("Creating Jupyter Notebook") - Expect(utils.CreateNotebook(nbParams)).To(Succeed(), "Failed to create notebook") - - By("Monitoring notebook logs") - Expect(utils.MonitorNotebookPod(namespace, "jupyter-nb-", notebookName)).To(Succeed(), "Notebook execution failed") - } - // Parameterized test function that handles both auth and non-auth scenarios runFeastWorkbenchIntegration := func(authEnabled bool) { // Apply permissions only if auth is enabled @@ -61,24 +51,8 @@ var _ = Describe("Feast Workbench Integration Connection Testing", Ordered, func utils.ApplyFeastPermissions(permissionFile, "/feast-data/credit_scoring_local/feature_repo/permissions.py", namespace, feastDeploymentName) } - By(fmt.Sprintf("Setting namespace context to : %s", namespace)) - Expect(utils.SetNamespaceContext(namespace, testDir)).To(Succeed()) - fmt.Printf("Successfully set namespace context to: %s\n", namespace) - - By(fmt.Sprintf("Creating Config map: %s", configMapName)) - Expect(utils.CreateNotebookConfigMap(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", testDir)).To(Succeed()) - fmt.Printf("ConfigMap %s created successfully\n", configMapName) - - By(fmt.Sprintf("Creating Persistent volume claim: %s", notebookPVC)) - Expect(utils.CreateNotebookPVC(pvcFile, testDir)).To(Succeed()) - fmt.Printf("Persistent Volume Claim %s created successfully\n", notebookPVC) - - By(fmt.Sprintf("Creating rolebinding %s for the user", rolebindingName)) - Expect(utils.CreateNotebookRoleBinding(namespace, rolebindingName, utils.GetOCUser(testDir), testDir)).To(Succeed()) - fmt.Printf("Created rolebinding %s successfully\n", rolebindingName) - - // Create and monitor notebook for execution status - createAndMonitorNotebook() + // Use the shared RunNotebookTest function for common setup and execution + utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) } BeforeAll(func() { diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go index 91e5e4c2e41..4849670399d 100644 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go @@ -52,34 +52,9 @@ var _ = Describe("Feast Jupyter Notebook Testing", Ordered, func() { fmt.Printf("Namespace %s deleted successfully\n", namespace) }) - runNotebookTest := func() { - // Execute common setup steps - By(fmt.Sprintf("Setting namespace context to : %s", namespace)) - Expect(utils.SetNamespaceContext(namespace, testDir)).To(Succeed()) - fmt.Printf("Successfully set namespace context to: %s\n", namespace) - - By(fmt.Sprintf("Creating Config map: %s", configMapName)) - Expect(utils.CreateNotebookConfigMap(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", testDir)).To(Succeed()) - fmt.Printf("ConfigMap %s created successfully\n", configMapName) - - By(fmt.Sprintf("Creating Persistent volume claim: %s", notebookPVC)) - Expect(utils.CreateNotebookPVC(pvcFile, testDir)).To(Succeed()) - fmt.Printf("Persistent Volume Claim %s created successfully\n", notebookPVC) - - By(fmt.Sprintf("Creating rolebinding %s for the user", rolebindingName)) - Expect(utils.CreateNotebookRoleBinding(namespace, rolebindingName, utils.GetOCUser(testDir), testDir)).To(Succeed()) - fmt.Printf("Created rolebinding %s successfully\n", rolebindingName) - - // Build notebook parameters and create notebook - nbParams := utils.GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir) - By("Creating Jupyter Notebook") - Expect(utils.CreateNotebook(nbParams)).To(Succeed(), "Failed to create notebook") - - By("Monitoring notebook logs") - Expect(utils.MonitorNotebookPod(namespace, "jupyter-nb-", notebookName)).To(Succeed(), "Notebook execution failed") - } - Context("Feast Jupyter Notebook Test", func() { - It("Should create and run a "+feastMilvusTest+" successfully", runNotebookTest) + It("Should create and run a "+feastMilvusTest+" successfully", func() { + utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) + }) }) }) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go new file mode 100644 index 00000000000..a7e482063f0 --- /dev/null +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go @@ -0,0 +1,77 @@ +/* +Copyright 2025 Feast Community. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package e2erhoai provides end-to-end (E2E) test coverage for Feast integration with +// Red Hat OpenShift AI (RHOAI) environments. This specific test validates the functionality +// of executing a Feast Jupyter notebook with Ray offline store within a fully configured OpenShift namespace +package e2erhoai + +import ( + "fmt" + "os/exec" + + utils "github.com/feast-dev/feast/infra/feast-operator/test/utils" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Feast Jupyter Notebook Testing with Ray Offline Store", Ordered, func() { + const ( + namespace = "test-ns-feast-wb-ray" + configMapName = "feast-wb-ray-cm" + rolebindingName = "rb-feast-ray-test" + notebookFile = "test/e2e_rhoai/resources/feast-wb-ray-test.ipynb" + pvcFile = "test/e2e_rhoai/resources/pvc.yaml" + kueueResourcesFile = "test/e2e_rhoai/resources/kueue_resources_setup.yaml" + notebookPVC = "jupyterhub-nb-kube-3aadmin-pvc" + testDir = "/test/e2e_rhoai" + notebookName = "feast-wb-ray-test.ipynb" + feastRayTest = "TestFeastRayOfflineStoreNotebook" + ) + + BeforeAll(func() { + By(fmt.Sprintf("Creating test namespace: %s", namespace)) + Expect(utils.CreateNamespace(namespace, testDir)).To(Succeed()) + fmt.Printf("Namespace %s created successfully\n", namespace) + + By("Applying Kueue resources setup") + // Apply with namespace flag - cluster-scoped resources (ResourceFlavor, ClusterQueue) will be applied at cluster level, + // and namespace-scoped resources (LocalQueue) will be applied in the specified namespace + cmd := exec.Command("kubectl", "apply", "-f", kueueResourcesFile, "-n", namespace) + output, err := utils.Run(cmd, testDir) + Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to apply Kueue resources: %v\nOutput: %s", err, output)) + fmt.Printf("Kueue resources applied successfully\n") + }) + + AfterAll(func() { + By("Deleting Kueue resources") + // Delete with namespace flag - will delete namespace-scoped resources from the namespace + // and cluster-scoped resources from the cluster + cmd := exec.Command("kubectl", "delete", "-f", kueueResourcesFile, "-n", namespace, "--ignore-not-found=true") + _, _ = utils.Run(cmd, testDir) + fmt.Printf("Kueue resources cleanup completed\n") + + By(fmt.Sprintf("Deleting test namespace: %s", namespace)) + Expect(utils.DeleteNamespace(namespace, testDir)).To(Succeed()) + fmt.Printf("Namespace %s deleted successfully\n", namespace) + }) + + Context("Feast Jupyter Notebook Test with Ray Offline store", func() { + It("Should create and run a "+feastRayTest+" successfully", func() { + utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) + }) + }) +}) diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb new file mode 100644 index 00000000000..3b91bcccd8e --- /dev/null +++ b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb @@ -0,0 +1,516 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# --- Configuration Variables ---\n", + "import os \n", + "\n", + "# Namespace where your resources exist\n", + "namespace = os.environ.get(\"NAMESPACE\")\n", + "\n", + "fsconfigmap = \"cm-fs-data\"\n", + "\n", + "# Fetch token and server directly from oc CLI\n", + "import subprocess\n", + "\n", + "def oc(cmd):\n", + " return subprocess.check_output(cmd, shell=True).decode(\"utf-8\").strip()\n", + "\n", + "token = oc(\"oc whoami -t\")\n", + "server = oc(\"oc whoami --show-server\")\n", + "\n", + "os.environ[\"CLUSTER_TOKEN\"] = token\n", + "os.environ[\"CLUSTER_SERVER\"] = server\n", + "\n", + "\n", + "# RayCluster name\n", + "raycluster = \"feastraytest\"\n", + "os.environ[\"RAY_CLUSTER\"] = raycluster\n", + "\n", + "# Show configured values\n", + "print(\"Configuration Variables:\")\n", + "print(f\" Namespace: {namespace}\")\n", + "print(f\" Server: {server}\")\n", + "print(f\" Token: {'*' * 20}\") # hide actual token\n", + "print(f\" Ray Cluster: {raycluster}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git clone https://github.com/Srihari1192/feast-rag-ray.git" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%cd feast-rag-ray/feature_repo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!oc login --token=$token --server=$server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!oc create configmap $fsconfigmap --from-file=data/customer_daily_profile.parquet --from-file=data/driver_stats.parquet -n $namespace" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import pieces from codeflare-sdk\n", + "from codeflare_sdk import Cluster, ClusterConfiguration, TokenAuthentication\n", + "\n", + "# Create authentication with token and server from oc\n", + "auth = TokenAuthentication(\n", + " token=token,\n", + " server=server,\n", + " skip_tls=True\n", + ")\n", + "auth.login()\n", + "print(\"✓ Authentication successful\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from kubernetes.client import (\n", + " V1Volume,\n", + " V1ConfigMapVolumeSource,\n", + " V1VolumeMount,\n", + ") \n", + "\n", + "data_volume = V1Volume(\n", + " name=\"data\",\n", + " config_map=V1ConfigMapVolumeSource(name=fsconfigmap)\n", + ")\n", + "\n", + "data_mount = V1VolumeMount(\n", + " name=\"data\",\n", + " mount_path=\"/opt/app-root/src/feast-rag-ray/feature_repo/data\",\n", + " read_only=True\n", + ")\n", + "\n", + "cluster = Cluster(ClusterConfiguration(\n", + " name=raycluster,\n", + " head_cpu_requests=1,\n", + " head_cpu_limits=1,\n", + " head_memory_requests=4,\n", + " head_memory_limits=4,\n", + " head_extended_resource_requests={'nvidia.com/gpu':0}, # For GPU enabled workloads set the head_extended_resource_requests and worker_extended_resource_requests\n", + " worker_extended_resource_requests={'nvidia.com/gpu':0},\n", + " num_workers=2,\n", + " worker_cpu_requests='250m',\n", + " worker_cpu_limits=1,\n", + " worker_memory_requests=4,\n", + " worker_memory_limits=4,\n", + " # image=\"\", # Optional Field \n", + " write_to_file=False, # When enabled Ray Cluster yaml files are written to /HOME/.codeflare/resources\n", + " local_queue=\"fs-user-queue\", # Specify the local queue manually\n", + " # ⭐ Best method: Use secretKeyRef to expose AWS credentials safely\n", + " volumes=[data_volume],\n", + " volume_mounts=[data_mount],\n", + " \n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cluster.apply()\n", + "# cluster.wait_ready()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "MAX_WAIT = 180 # 3 minutes\n", + "INTERVAL = 5 # check every 5 seconds\n", + "elapsed = 0\n", + "\n", + "print(\"⏳ Waiting up to 3 minutes for RayCluster to be READY...\\n\")\n", + "\n", + "while elapsed < MAX_WAIT:\n", + " details = cluster.details()\n", + " status = details.status.value\n", + "\n", + " print(details)\n", + " print(\"Cluster Status:\", status)\n", + "\n", + " if status == \"ready\":\n", + " print(\"✅ RayCluster is READY!\")\n", + " break\n", + " \n", + " print(f\"⏳ RayCluster is NOT ready yet: {status} ... checking again in {INTERVAL}s\\n\")\n", + " time.sleep(INTERVAL)\n", + " elapsed += INTERVAL\n", + "\n", + "else:\n", + " print(\"❌ Timeout: RayCluster did NOT become READY within 3 minutes.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! feast apply" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "from feast import FeatureStore\n", + "\n", + "# Add feature repo to PYTHONPATH\n", + "repo_path = Path(\".\")\n", + "sys.path.append(str(repo_path))\n", + "\n", + "# Initialize Feature Store\n", + "print(\"Initializing Feast with Ray configuration...\")\n", + "store = FeatureStore(repo_path=\".\")\n", + "\n", + "# Assertions: Verify store is initialized correctly\n", + "assert store is not None, \"FeatureStore should be initialized\"\n", + "assert store.config is not None, \"Store config should be available\"\n", + "assert store.config.offline_store is not None, \"Offline store should be configured\"\n", + "\n", + "print(f\"✓ Offline store: {store.config.offline_store.type}\")\n", + "if hasattr(store.config, \"batch_engine\") and store.config.batch_engine:\n", + " print(f\"✓ Compute engine: {store.config.batch_engine.type}\")\n", + " # Assertion: Verify batch engine is configured if present\n", + " assert store.config.batch_engine.type is not None, \"Batch engine type should be set\"\n", + "else:\n", + " print(\"⚠ No compute engine configured\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Create Entity DataFrame\n", + "\n", + "Create an entity DataFrame for historical feature retrieval with point-in-time timestamps.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime, timedelta\n", + "import pandas as pd\n", + "\n", + "# --- Create time window ---\n", + "end_date = datetime.now().replace(microsecond=0, second=0, minute=0)\n", + "start_date = end_date - timedelta(days=2)\n", + "\n", + "\n", + "entity_df = pd.DataFrame(\n", + " {\n", + " \"driver_id\": [1001, 1002, 1003],\n", + " \"customer_id\": [2001, 2002, 2003],\n", + " \"event_timestamp\": [\n", + " pd.Timestamp(end_date - timedelta(hours=24), tz=\"UTC\"),\n", + " pd.Timestamp(end_date - timedelta(hours=12), tz=\"UTC\"),\n", + " pd.Timestamp(end_date - timedelta(hours=6), tz=\"UTC\"),\n", + " ],\n", + " }\n", + ")\n", + "\n", + "# Assertions: Verify entity DataFrame is created correctly\n", + "assert len(entity_df) == 3, f\"Expected 3 rows, got {len(entity_df)}\"\n", + "assert \"driver_id\" in entity_df.columns, \"driver_id column should be present\"\n", + "assert \"customer_id\" in entity_df.columns, \"customer_id column should be present\"\n", + "assert \"event_timestamp\" in entity_df.columns, \"event_timestamp column should be present\"\n", + "assert all(entity_df[\"driver_id\"].isin([1001, 1002, 1003])), \"driver_id values should match expected\"\n", + "assert all(entity_df[\"customer_id\"].isin([2001, 2002, 2003])), \"customer_id values should match expected\"\n", + "assert entity_df[\"event_timestamp\"].notna().all(), \"All event_timestamp values should be non-null\"\n", + "\n", + "print(f\"✓ Created entity DataFrame with {len(entity_df)} rows\")\n", + "print(f\"✓ Time range: {start_date} to {end_date}\")\n", + "print(\"\\nEntity DataFrame:\")\n", + "print(entity_df)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Retrieve Historical Features\n", + "\n", + "Retrieve historical features using Ray compute engine for distributed point-in-time joins.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cell 4: Retrieve Historical Features\n", + "print(\"Retrieving historical features with Ray compute engine...\")\n", + "print(\"(This demonstrates distributed point-in-time joins)\")\n", + "\n", + "try:\n", + " # Get historical features - this uses Ray compute engine for distributed processing\n", + " historical_features = store.get_historical_features(\n", + " entity_df=entity_df,\n", + " features=[\n", + " \"driver_hourly_stats:conv_rate\",\n", + " \"driver_hourly_stats:acc_rate\",\n", + " \"driver_hourly_stats:avg_daily_trips\",\n", + " \"customer_daily_profile:current_balance\",\n", + " \"customer_daily_profile:avg_passenger_count\",\n", + " \"customer_daily_profile:lifetime_trip_count\",\n", + " ],\n", + " )\n", + "\n", + " # Convert to DataFrame - Ray processes this efficiently\n", + " historical_df = historical_features.to_df()\n", + " \n", + " # Assertions: Verify historical features are retrieved correctly\n", + " assert historical_df is not None, \"Historical features DataFrame should not be None\"\n", + " assert len(historical_df) > 0, \"Should retrieve at least one row of historical features\"\n", + " assert \"driver_id\" in historical_df.columns, \"driver_id should be in the result\"\n", + " assert \"customer_id\" in historical_df.columns, \"customer_id should be in the result\"\n", + " \n", + " # Verify expected feature columns are present (some may be None if data doesn't exist)\n", + " expected_features = [\n", + " \"conv_rate\", \"acc_rate\", \"avg_daily_trips\",\n", + " \"current_balance\", \"avg_passenger_count\", \"lifetime_trip_count\"\n", + " ]\n", + " feature_columns = [col for col in historical_df.columns if col in expected_features]\n", + " assert len(feature_columns) > 0, f\"Should have at least one feature column, got: {historical_df.columns.tolist()}\"\n", + " \n", + " print(f\"✓ Retrieved {len(historical_df)} historical feature rows\")\n", + " print(f\"✓ Features: {list(historical_df.columns)}\")\n", + " \n", + " # Display the results\n", + " print(\"\\nHistorical Features DataFrame:\")\n", + " display(historical_df.head(10))\n", + "\n", + "except Exception as e:\n", + " print(f\"⚠ Historical features retrieval failed: {e}\")\n", + " print(\"This might be due to missing Ray dependencies or data\")\n", + " raise\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Test On-Demand Feature Transformations\n", + "\n", + "Demonstrate on-demand feature transformations that are computed at request time.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cell 5: Test On-Demand Features\n", + "print(\"Testing on-demand feature transformations...\")\n", + "\n", + "try:\n", + " # Get features including on-demand transformations\n", + " features_with_odfv = store.get_historical_features(\n", + " entity_df=entity_df.head(1),\n", + " features=[\n", + " \"driver_hourly_stats:conv_rate\",\n", + " \"driver_hourly_stats:acc_rate\",\n", + " \"driver_hourly_stats:avg_daily_trips\",\n", + " \"driver_activity_v2:conv_rate_plus_acc_rate\",\n", + " \"driver_activity_v2:trips_per_day_normalized\",\n", + " ],\n", + " )\n", + "\n", + " odfv_df = features_with_odfv.to_df()\n", + " \n", + " # Assertions: Verify on-demand features are computed correctly\n", + " assert odfv_df is not None, \"On-demand features DataFrame should not be None\"\n", + " assert len(odfv_df) > 0, \"Should retrieve at least one row with on-demand features\"\n", + " assert \"driver_id\" in odfv_df.columns, \"driver_id should be in the result\"\n", + " \n", + " # Verify on-demand feature columns if they exist\n", + " if \"conv_rate_plus_acc_rate\" in odfv_df.columns:\n", + " # Assertion: Verify the on-demand feature is computed\n", + " assert odfv_df[\"conv_rate_plus_acc_rate\"].notna().any(), \"conv_rate_plus_acc_rate should have non-null values\"\n", + " print(\"✓ On-demand feature 'conv_rate_plus_acc_rate' is computed\")\n", + " \n", + " if \"trips_per_day_normalized\" in odfv_df.columns:\n", + " assert odfv_df[\"trips_per_day_normalized\"].notna().any(), \"trips_per_day_normalized should have non-null values\"\n", + " print(\"✓ On-demand feature 'trips_per_day_normalized' is computed\")\n", + " \n", + " print(f\"✓ Retrieved {len(odfv_df)} rows with on-demand transformations\")\n", + " \n", + " # Display results\n", + " print(\"\\nFeatures with On-Demand Transformations:\")\n", + " display(odfv_df)\n", + " \n", + " # Show specific transformed features\n", + " if \"conv_rate_plus_acc_rate\" in odfv_df.columns:\n", + " print(\"\\nSample with on-demand features:\")\n", + " display(\n", + " odfv_df[[\"driver_id\", \"conv_rate\", \"acc_rate\", \"conv_rate_plus_acc_rate\"]]\n", + " )\n", + "\n", + "except Exception as e:\n", + " print(f\"⚠ On-demand features failed: {e}\")\n", + " raise\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Materialize Features to Online Store\n", + "\n", + "Materialize features to the online store using Ray compute engine for efficient batch processing.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import timezone\n", + "print(\"Materializing features to online store...\")\n", + "store.materialize(\n", + "\tstart_date=datetime(2025, 1, 1, tzinfo=timezone.utc),\n", + "\tend_date=end_date,\n", + ")\n", + "\n", + "# Minimal output assertion: materialization succeeded if no exception\n", + "assert True, \"Materialization completed successfully\"\n", + "print(\"✓ Initial materialization successful\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Test Online Feature Serving\n", + "\n", + "Retrieve features from the online store for low-latency serving.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cell 7: Test Online Feature Serving\n", + "print(\"Testing online feature serving...\")\n", + "\n", + "try:\n", + " entity_rows = [\n", + " {\"driver_id\": 1001, \"customer_id\": 2001},\n", + " {\"driver_id\": 1002, \"customer_id\": 2002},\n", + " ]\n", + " \n", + " # Assertion: Verify entity rows are valid\n", + " assert len(entity_rows) == 2, \"Should have 2 entity rows\"\n", + " assert all(\"driver_id\" in row for row in entity_rows), \"All entity rows should have driver_id\"\n", + " assert all(\"customer_id\" in row for row in entity_rows), \"All entity rows should have customer_id\"\n", + " \n", + " online_features = store.get_online_features(\n", + " features=[\n", + " \"driver_hourly_stats:conv_rate\",\n", + " \"driver_hourly_stats:acc_rate\",\n", + " \"customer_daily_profile:current_balance\",\n", + " ],\n", + " entity_rows=entity_rows,\n", + " )\n", + "\n", + " online_df = online_features.to_df()\n", + " \n", + " # Assertions: Verify online features are retrieved correctly\n", + " assert online_df is not None, \"Online features DataFrame should not be None\"\n", + " assert len(online_df) == len(entity_rows), f\"Should retrieve {len(entity_rows)} rows, got {len(online_df)}\"\n", + " assert \"driver_id\" in online_df.columns, \"driver_id should be in the result\"\n", + " assert \"customer_id\" in online_df.columns, \"customer_id should be in the result\"\n", + " \n", + " # Verify expected feature columns are present\n", + " expected_features = [\"conv_rate\", \"acc_rate\", \"current_balance\"]\n", + " feature_columns = [col for col in online_df.columns if col in expected_features]\n", + " assert len(feature_columns) > 0, f\"Should have at least one feature column, got: {online_df.columns.tolist()}\"\n", + " \n", + " # Verify entity IDs match\n", + " assert all(online_df[\"driver_id\"].isin([1001, 1002])), \"driver_id values should match entity rows\"\n", + " assert all(online_df[\"customer_id\"].isin([2001, 2002])), \"customer_id values should match entity rows\"\n", + " \n", + " print(f\"✓ Retrieved {len(online_df)} online feature rows\")\n", + " print(f\"✓ Features retrieved: {feature_columns}\")\n", + " \n", + " print(\"\\nOnline Features DataFrame:\")\n", + " display(online_df)\n", + "\n", + "except Exception as e:\n", + " print(f\"⚠ Online serving failed: {e}\")\n", + " raise\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cluster.down()" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml b/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml new file mode 100644 index 00000000000..ebcac54f4a0 --- /dev/null +++ b/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml @@ -0,0 +1,31 @@ +apiVersion: kueue.x-k8s.io/v1beta1 +kind: ResourceFlavor +metadata: + name: "fs-resource-flavor" +--- +apiVersion: kueue.x-k8s.io/v1beta1 +kind: ClusterQueue +metadata: + name: "fs-cluster-queue" +spec: + namespaceSelector: {} # match all. + resourceGroups: + - coveredResources: ["cpu", "memory","nvidia.com/gpu"] + flavors: + - name: "fs-resource-flavor" + resources: + - name: "cpu" + nominalQuota: 9 + - name: "memory" + nominalQuota: 36Gi + - name: "nvidia.com/gpu" + nominalQuota: 0 +--- +apiVersion: kueue.x-k8s.io/v1beta1 +kind: LocalQueue +metadata: + name: "fs-user-queue" + annotations: + "kueue.x-k8s.io/default-queue": "true" +spec: + clusterQueue: "fs-cluster-queue" diff --git a/infra/feast-operator/test/utils/notebook_util.go b/infra/feast-operator/test/utils/notebook_util.go index a4a3e14a2ce..cad4a734a01 100644 --- a/infra/feast-operator/test/utils/notebook_util.go +++ b/infra/feast-operator/test/utils/notebook_util.go @@ -9,6 +9,7 @@ import ( "text/template" "time" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -340,3 +341,32 @@ func SetupNotebookEnvironment(namespace, configMapName, notebookFile, featureRep return nil } + +// RunNotebookTest performs all the setup steps, creates a notebook, and monitors its execution. +// This function encapsulates the common notebook test workflow used across multiple test files. +func RunNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string) { + // Execute common setup steps + By(fmt.Sprintf("Setting namespace context to : %s", namespace)) + Expect(SetNamespaceContext(namespace, testDir)).To(Succeed()) + fmt.Printf("Successfully set namespace context to: %s\n", namespace) + + By(fmt.Sprintf("Creating Config map: %s", configMapName)) + Expect(CreateNotebookConfigMap(namespace, configMapName, notebookFile, featureRepoPath, testDir)).To(Succeed()) + fmt.Printf("ConfigMap %s created successfully\n", configMapName) + + By(fmt.Sprintf("Creating Persistent volume claim: %s", notebookPVC)) + Expect(CreateNotebookPVC(pvcFile, testDir)).To(Succeed()) + fmt.Printf("Persistent Volume Claim %s created successfully\n", notebookPVC) + + By(fmt.Sprintf("Creating rolebinding %s for the user", rolebindingName)) + Expect(CreateNotebookRoleBinding(namespace, rolebindingName, GetOCUser(testDir), testDir)).To(Succeed()) + fmt.Printf("Created rolebinding %s successfully\n", rolebindingName) + + // Build notebook parameters and create notebook + nbParams := GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir) + By("Creating Jupyter Notebook") + Expect(CreateNotebook(nbParams)).To(Succeed(), "Failed to create notebook") + + By("Monitoring notebook logs") + Expect(MonitorNotebookPod(namespace, "jupyter-nb-", notebookName)).To(Succeed(), "Notebook execution failed") +} From edefc3f0afdb46d73070e230eef19c0941f0b581 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 22 Dec 2025 20:04:28 -0500 Subject: [PATCH 04/26] feat: Enable static artifacts for feature server that can be used in Feature Transformations (#5787) * feat: Enable static artifacts for feature server that can be used in Feature Transformations Signed-off-by: Francisco Javier Arceo * feat: Enable static artifacts for feature server that can be used in Feature Transformations Signed-off-by: Francisco Javier Arceo * feat: Enable static artifacts for feature server that can be used in Feature Transformations Signed-off-by: Francisco Javier Arceo * updated docs Signed-off-by: Francisco Javier Arceo * adding docs Signed-off-by: Francisco Javier Arceo * update Signed-off-by: Francisco Javier Arceo --------- Signed-off-by: Francisco Javier Arceo --- docs/SUMMARY.md | 1 + docs/reference/alpha-static-artifacts.md | 314 ++++++++++++++++++ .../feature-servers/python-feature-server.md | 42 +++ sdk/python/feast/feature_server.py | 49 +++ .../feast/templates/pytorch_nlp/README.md | 127 ++++++- .../pytorch_nlp/feature_repo/example_repo.py | 115 +++---- .../feature_repo/static_artifacts.py | 139 ++++++++ sdk/python/tests/unit/test_feature_server.py | 201 +++++++++++ 8 files changed, 921 insertions(+), 67 deletions(-) create mode 100644 docs/reference/alpha-static-artifacts.md create mode 100644 sdk/python/feast/templates/pytorch_nlp/feature_repo/static_artifacts.py diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 50fea300675..7d85aba1ad0 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -158,6 +158,7 @@ * [Registry server](reference/feature-servers/registry-server.md) * [\[Beta\] Web UI](reference/alpha-web-ui.md) * [\[Beta\] On demand feature view](reference/beta-on-demand-feature-view.md) +* [\[Alpha\] Static Artifacts Loading](reference/alpha-static-artifacts.md) * [\[Alpha\] Vector Database](reference/alpha-vector-database.md) * [\[Alpha\] Data quality monitoring](reference/dqm.md) * [\[Alpha\] Streaming feature computation with Denormalized](reference/denormalized.md) diff --git a/docs/reference/alpha-static-artifacts.md b/docs/reference/alpha-static-artifacts.md new file mode 100644 index 00000000000..627898f847f --- /dev/null +++ b/docs/reference/alpha-static-artifacts.md @@ -0,0 +1,314 @@ +# [Alpha] Static Artifacts Loading + +**Warning**: This is an experimental feature. To our knowledge, this is stable, but there are still rough edges in the experience. Contributions are welcome! + +## Overview + +Static Artifacts Loading allows you to load models, lookup tables, and other static resources once during feature server startup instead of loading them on each request. These artifacts are cached in memory and accessible to on-demand feature views for real-time inference. + +This feature optimizes the performance of on-demand feature views that require external resources by eliminating the overhead of repeatedly loading the same artifacts during request processing. + +### Why Use Static Artifacts Loading? + +Static artifacts loading enables data scientists and ML engineers to: + +1. **Improve performance**: Eliminate model loading overhead from each feature request +2. **Enable complex transformations**: Use pre-trained models in on-demand feature views without performance penalties +3. **Share resources**: Multiple feature views can access the same loaded artifacts +4. **Simplify deployment**: Package models and lookup tables with your feature repository + +Common use cases include: +- Sentiment analysis using pre-trained transformers models +- Text classification with small neural networks +- Lookup-based transformations using static dictionaries +- Embedding generation with pre-computed vectors + +## How It Works + +1. **Feature Repository Setup**: Create a `static_artifacts.py` file in your feature repository root +2. **Server Startup**: When `feast serve` starts, it automatically looks for and loads the artifacts +3. **Memory Storage**: Artifacts are stored in the FastAPI application state and accessible via global references +4. **Request Processing**: On-demand feature views access pre-loaded artifacts for fast transformations + +## Example 1: Basic Model Loading + +Create a `static_artifacts.py` file in your feature repository: + +```python +# static_artifacts.py +from fastapi import FastAPI +from transformers import pipeline + +def load_sentiment_model(): + """Load sentiment analysis model.""" + return pipeline( + "sentiment-analysis", + model="cardiffnlp/twitter-roberta-base-sentiment-latest", + device="cpu" + ) + +def load_artifacts(app: FastAPI): + """Load static artifacts into app.state.""" + app.state.sentiment_model = load_sentiment_model() + + # Update global references for access from feature views + import example_repo + example_repo._sentiment_model = app.state.sentiment_model +``` + +Use the pre-loaded model in your on-demand feature view: + +```python +# example_repo.py +import pandas as pd +from feast.on_demand_feature_view import on_demand_feature_view +from feast import Field +from feast.types import String, Float32 + +# Global reference for static artifacts +_sentiment_model = None + +@on_demand_feature_view( + sources=[text_input_request], + schema=[ + Field(name="predicted_sentiment", dtype=String), + Field(name="sentiment_confidence", dtype=Float32), + ], +) +def sentiment_prediction(inputs: pd.DataFrame) -> pd.DataFrame: + """Sentiment prediction using pre-loaded model.""" + global _sentiment_model + + results = [] + for text in inputs["input_text"]: + predictions = _sentiment_model(text) + best_pred = max(predictions, key=lambda x: x["score"]) + + results.append({ + "predicted_sentiment": best_pred["label"], + "sentiment_confidence": best_pred["score"], + }) + + return pd.DataFrame(results) +``` + +## Example 2: Multiple Artifacts with Lookup Tables + +Load multiple types of artifacts: + +```python +# static_artifacts.py +from fastapi import FastAPI +from transformers import pipeline +import json +from pathlib import Path + +def load_sentiment_model(): + """Load sentiment analysis model.""" + return pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") + +def load_lookup_tables(): + """Load static lookup tables.""" + return { + "sentiment_labels": {"NEGATIVE": "negative", "POSITIVE": "positive"}, + "domain_categories": {"twitter.com": "social", "news.com": "news", "github.com": "tech"}, + "priority_users": {"user_123", "user_456", "user_789"} + } + +def load_config(): + """Load application configuration.""" + return { + "model_threshold": 0.7, + "max_text_length": 512, + "default_sentiment": "neutral" + } + +def load_artifacts(app: FastAPI): + """Load all static artifacts.""" + app.state.sentiment_model = load_sentiment_model() + app.state.lookup_tables = load_lookup_tables() + app.state.config = load_config() + + # Update global references + import example_repo + example_repo._sentiment_model = app.state.sentiment_model + example_repo._lookup_tables = app.state.lookup_tables + example_repo._config = app.state.config +``` + +Use multiple artifacts in feature transformations: + +```python +# example_repo.py +import pandas as pd +from feast.on_demand_feature_view import on_demand_feature_view + +# Global references for static artifacts +_sentiment_model = None +_lookup_tables: dict = {} +_config: dict = {} + +@on_demand_feature_view( + sources=[text_input_request, user_input_request], + schema=[ + Field(name="predicted_sentiment", dtype=String), + Field(name="is_priority_user", dtype=Bool), + Field(name="domain_category", dtype=String), + ], +) +def enriched_prediction(inputs: pd.DataFrame) -> pd.DataFrame: + """Multi-artifact feature transformation.""" + global _sentiment_model, _lookup_tables, _config + + results = [] + for i, row in inputs.iterrows(): + text = row["input_text"] + user_id = row["user_id"] + domain = row.get("domain", "") + + # Use pre-loaded model + predictions = _sentiment_model(text) + sentiment_scores = {pred["label"]: pred["score"] for pred in predictions} + + # Use lookup tables + predicted_sentiment = _lookup_tables["sentiment_labels"].get( + max(sentiment_scores, key=sentiment_scores.get), + _config["default_sentiment"] + ) + + is_priority = user_id in _lookup_tables["priority_users"] + category = _lookup_tables["domain_categories"].get(domain, "unknown") + + results.append({ + "predicted_sentiment": predicted_sentiment, + "is_priority_user": is_priority, + "domain_category": category, + }) + + return pd.DataFrame(results) +``` + +## Container Deployment + +Static artifacts work with containerized deployments. Include your artifacts in the container image: + +```dockerfile +FROM python:3.11-slim + +# Install dependencies +COPY requirements.txt . +RUN pip install -r requirements.txt + +# Copy feature repository including static_artifacts.py +COPY feature_repo/ /app/feature_repo/ + +WORKDIR /app/feature_repo + +# Start feature server +CMD ["feast", "serve", "--host", "0.0.0.0"] +``` + +The server will automatically load static artifacts during container startup. + +## Supported Artifact Types + +### Recommended Artifacts +- **Small ML models**: Sentiment analysis, text classification, small neural networks +- **Lookup tables**: Label mappings, category dictionaries, user segments +- **Configuration data**: Model parameters, feature mappings, business rules +- **Pre-computed embeddings**: User vectors, item features, static representations + +### Not Recommended +- **Large Language Models**: Use dedicated serving solutions (vLLM, TensorRT-LLM, TGI) +- **Models requiring specialized hardware**: GPU clusters, TPUs +- **Frequently updated models**: Consider model registries with versioning +- **Large datasets**: Use feature views with proper data sources instead + +## Error Handling + +Static artifacts loading includes graceful error handling: +- **Missing file**: Server starts normally without static artifacts +- **Loading errors**: Warnings are logged, feature views should implement fallback logic +- **Partial failures**: Successfully loaded artifacts remain available + +Always implement fallback behavior in your feature transformations: + +```python +@on_demand_feature_view(...) +def robust_prediction(inputs: pd.DataFrame) -> pd.DataFrame: + global _sentiment_model + + results = [] + for text in inputs["input_text"]: + if _sentiment_model is not None: + # Use pre-loaded model + predictions = _sentiment_model(text) + sentiment = max(predictions, key=lambda x: x["score"])["label"] + else: + # Fallback when artifacts aren't available + sentiment = "neutral" + + results.append({"predicted_sentiment": sentiment}) + + return pd.DataFrame(results) +``` + +## Starting the Feature Server + +Start the feature server as usual: + +```bash +feast serve +``` + +You'll see log messages indicating artifact loading: + +``` +INFO:fastapi:Loading static artifacts from static_artifacts.py +INFO:fastapi:Static artifacts loading completed +INFO:uvicorn:Application startup complete +``` + +## Template Example + +The PyTorch NLP template demonstrates static artifacts loading: + +```bash +feast init my-nlp-project -t pytorch_nlp +cd my-nlp-project/feature_repo +feast serve +``` + +This template includes a complete example with sentiment analysis model loading, lookup tables, and integration with on-demand feature views. + +## Performance Considerations + +- **Startup time**: Artifacts are loaded during server initialization, which may increase startup time +- **Memory usage**: All artifacts remain in memory for the server's lifetime +- **Concurrency**: Artifacts are shared across all request threads +- **Container resources**: Ensure sufficient memory allocation for your artifacts + +## Configuration + +Currently, static artifacts loading uses convention-based configuration: +- **File name**: Must be named `static_artifacts.py` +- **Location**: Must be in the feature repository root directory +- **Function name**: Must implement `load_artifacts(app: FastAPI)` function + +## Limitations + +- File name and location are currently fixed (not configurable) +- Artifacts are loaded synchronously during startup +- No built-in artifact versioning or hot reloading +- Limited to Python-based artifacts (no external binaries) + +## Contributing + +This is an alpha feature and we welcome contributions! Areas for improvement: +- Configurable artifact file locations +- Asynchronous artifact loading +- Built-in artifact versioning +- Performance monitoring and metrics +- Integration with model registries + +Please report issues and contribute improvements via the [Feast GitHub repository](https://github.com/feast-dev/feast). \ No newline at end of file diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index f8e121ad6af..df0b0b1f78d 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -268,6 +268,48 @@ To start the feature server in TLS mode, you need to provide the private and pub feast serve --key /path/to/key.pem --cert /path/to/cert.pem ``` +# [Alpha] Static Artifacts Loading + +**Warning**: This is an experimental feature. To our knowledge, this is stable, but there are still rough edges in the experience. + +Static artifacts loading allows you to load models, lookup tables, and other static resources once during feature server startup instead of loading them on each request. This improves performance for on-demand feature views that require external resources. + +## Quick Example + +Create a `static_artifacts.py` file in your feature repository: + +```python +# static_artifacts.py +from fastapi import FastAPI +from transformers import pipeline + +def load_artifacts(app: FastAPI): + """Load static artifacts into app.state.""" + app.state.sentiment_model = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") + + # Update global references for access from feature views + import example_repo + example_repo._sentiment_model = app.state.sentiment_model +``` + +Access pre-loaded artifacts in your on-demand feature views: + +```python +# example_repo.py +_sentiment_model = None + +@on_demand_feature_view(...) +def sentiment_prediction(inputs: pd.DataFrame) -> pd.DataFrame: + global _sentiment_model + return _sentiment_model(inputs["text"]) +``` + +## Documentation + +For comprehensive documentation, examples, and best practices, see the [Alpha Static Artifacts Loading](../alpha-static-artifacts.md) reference guide. + +The [PyTorch NLP template](https://github.com/feast-dev/feast/tree/main/sdk/python/feast/templates/pytorch_nlp) provides a complete working example. + # Online Feature Server Permissions and Access Control ## API Endpoints and Permissions diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index e3ec16496cc..fbbb38821af 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -155,6 +155,52 @@ async def _get_features( return features +async def load_static_artifacts(app: FastAPI, store): + """ + Load static artifacts (models, lookup tables, etc.) into app.state. + + This function can be extended to load various types of static artifacts: + - Small ML models (scikit-learn, small neural networks) + - Lookup tables and reference data + - Configuration parameters + - Pre-computed embeddings + + Note: Not recommended for large language models - use dedicated + model serving solutions (vLLM, TGI, etc.) for those. + """ + try: + # Import here to avoid loading heavy dependencies unless needed + import importlib.util + import inspect + from pathlib import Path + + # Look for static artifacts loading in the feature repository + # This allows templates and users to define their own artifact loading + repo_path = Path(store.repo_path) if store.repo_path else Path.cwd() + artifacts_file = repo_path / "static_artifacts.py" + + if artifacts_file.exists(): + # Load and execute custom static artifacts loading + spec = importlib.util.spec_from_file_location( + "static_artifacts", artifacts_file + ) + if spec and spec.loader: + artifacts_module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(artifacts_module) + + # Look for load_artifacts function + if hasattr(artifacts_module, "load_artifacts"): + load_func = artifacts_module.load_artifacts + if inspect.iscoroutinefunction(load_func): + await load_func(app) + else: + load_func(app) + logger.info("Loaded static artifacts from static_artifacts.py") + except Exception as e: + # Non-fatal error - feature server should still start + logger.warning(f"Failed to load static artifacts: {e}") + + def get_app( store: "feast.FeatureStore", registry_ttl_sec: int = DEFAULT_FEATURE_SERVER_REGISTRY_TTL, @@ -217,6 +263,9 @@ def async_refresh(): @asynccontextmanager async def lifespan(app: FastAPI): + # Load static artifacts before initializing store + await load_static_artifacts(app, store) + await store.initialize() async_refresh() yield diff --git a/sdk/python/feast/templates/pytorch_nlp/README.md b/sdk/python/feast/templates/pytorch_nlp/README.md index 3d9babbd232..7fe0e0e708d 100644 --- a/sdk/python/feast/templates/pytorch_nlp/README.md +++ b/sdk/python/feast/templates/pytorch_nlp/README.md @@ -157,7 +157,8 @@ my-sentiment-project/ ├── README.md # This file └── feature_repo/ ├── feature_store.yaml # Feast configuration - ├── example_repo.py # Feature definitions + ├── example_repo.py # Feature definitions (uses pre-loaded artifacts) + ├── static_artifacts.py # Static artifacts loading (models, lookup tables) ├── test_workflow.py # Complete demo workflow └── data/ # Generated sample data └── sentiment_data.parquet @@ -205,6 +206,109 @@ offline_store: - ✅ **No external services** - No Redis/cloud required - ✅ **Perfect for demos** - Easy to share and understand +## 🚀 Static Artifacts Loading + +This template demonstrates **static artifacts loading** - a performance optimization that loads models, lookup tables, and other artifacts once at feature server startup instead of on each request. + +### What are Static Artifacts? + +Static artifacts are pre-loaded resources that remain constant during server operation: +- **Small ML models** (sentiment analysis, classification, small neural networks) +- **Lookup tables and mappings** (label encoders, category mappings) +- **Configuration data** (model parameters, feature mappings) +- **Pre-computed embeddings** (user embeddings, item features) + +### Performance Benefits + +**Before (Per-Request Loading):** +```python +def sentiment_prediction(inputs): + # ❌ Model loads on every request - slow! + model = pipeline("sentiment-analysis", model="...") + return model(inputs["text"]) +``` + +**After (Startup Loading):** +```python +# ✅ Model loads once at server startup +def sentiment_prediction(inputs): + global _sentiment_model # Pre-loaded model + return _sentiment_model(inputs["text"]) +``` + +**Performance Impact:** +- 🚀 **10-100x faster** inference (no model loading overhead) +- 💾 **Lower memory usage** (shared model across requests) +- ⚡ **Better scalability** (consistent response times) + +### How It Works + +1. **Startup**: Feast server loads `static_artifacts.py` during initialization +2. **Loading**: `load_artifacts(app)` function stores models in `app.state` +3. **Access**: On-demand feature views access pre-loaded artifacts via global references + +```python +# static_artifacts.py - Define what to load +def load_artifacts(app: FastAPI): + app.state.sentiment_model = load_sentiment_model() + app.state.lookup_tables = load_lookup_tables() + + # Update global references for easy access + import example_repo + example_repo._sentiment_model = app.state.sentiment_model + example_repo._lookup_tables = app.state.lookup_tables + +# example_repo.py - Use pre-loaded artifacts +_sentiment_model = None # Set by static_artifacts.py + +def sentiment_prediction(inputs): + global _sentiment_model + if _sentiment_model is not None: + return _sentiment_model(inputs["text"]) + else: + return fallback_predictions() +``` + +### Scope and Limitations + +**✅ Great for:** +- Small to medium models (< 1GB) +- Fast-loading models (sentiment analysis, classification) +- Lookup tables and reference data +- Configuration parameters +- Pre-computed embeddings + +**❌ Not recommended for:** +- **Large Language Models (LLMs)** - Use dedicated serving solutions like vLLM, TGI, or TensorRT-LLM +- Models requiring GPU clusters +- Frequently updated models +- Models with complex initialization dependencies + +**Note:** Feast is optimized for feature serving, not large model inference. For production LLM workloads, use specialized model serving platforms. + +### Customizing Static Artifacts + +To add your own artifacts, modify `static_artifacts.py`: + +```python +def load_custom_embeddings(): + """Load pre-computed user embeddings.""" + embeddings_file = Path(__file__).parent / "data" / "user_embeddings.npy" + if embeddings_file.exists(): + import numpy as np + return {"embeddings": np.load(embeddings_file)} + return None + +def load_artifacts(app: FastAPI): + # Load your custom artifacts + app.state.custom_embeddings = load_custom_embeddings() + app.state.config_params = {"threshold": 0.7, "top_k": 10} + + # Make them available to feature views + import example_repo + example_repo._custom_embeddings = app.state.custom_embeddings +``` + ## 📚 Detailed Usage ### 1. Feature Store Setup @@ -409,20 +513,21 @@ def toxicity_detection(inputs: pd.DataFrame) -> pd.DataFrame: ### Performance Optimization **Current Architecture:** -- Models load on each request (see `sentiment_prediction` function) +- ✅ **Static artifacts loading** at server startup (see `static_artifacts.py`) +- ✅ **Pre-loaded models** cached in memory for fast inference - CPU-only operation to avoid multiprocessing issues - SQLite-based storage for fast local access -**TODO: Optimization Opportunities:** -- **Startup-time Model Loading**: Load models once at server startup instead of per-request -- **Custom Provider**: Implement model caching via custom Feast provider -- **Model Serving Layer**: Use dedicated model servers (TorchServe, MLflow) for heavy models +**Implemented Optimizations:** +- **Startup-time Model Loading**: ✅ Models load once at server startup via `static_artifacts.py` +- **Memory-efficient Caching**: ✅ Models stored in `app.state` and accessed via global references +- **Fallback Handling**: ✅ Graceful degradation when artifacts fail to load -**Production Optimizations:** -1. **Model Caching**: Cache loaded models in memory to avoid repeated loading -2. **Batch Inference**: Process multiple texts together for efficiency -3. **Feature Materialization**: Pre-compute expensive features offline -4. **Async Processing**: Use async patterns for real-time serving +**Additional Production Optimizations:** +1. **Batch Inference**: Process multiple texts together for efficiency +2. **Feature Materialization**: Pre-compute expensive features offline +3. **Async Processing**: Use async patterns for real-time serving +4. **Model Serving Layer**: Use dedicated model servers (TorchServe, vLLM) for large models ### Production Configuration Examples diff --git a/sdk/python/feast/templates/pytorch_nlp/feature_repo/example_repo.py b/sdk/python/feast/templates/pytorch_nlp/feature_repo/example_repo.py index e78614aacea..ee49bea2899 100644 --- a/sdk/python/feast/templates/pytorch_nlp/feature_repo/example_repo.py +++ b/sdk/python/feast/templates/pytorch_nlp/feature_repo/example_repo.py @@ -25,6 +25,18 @@ from feast.on_demand_feature_view import on_demand_feature_view from feast.types import Array, Float32, Int64, String +try: + # Import static artifacts helpers (available when feature server loads artifacts) + from static_artifacts import get_lookup_tables, get_sentiment_model +except ImportError: + # Fallback for when static_artifacts.py is not available + get_sentiment_model = None + get_lookup_tables = None + +# Global references for static artifacts (set by feature server) +_sentiment_model = None +_lookup_tables: dict = {} + # Configuration repo_path = Path(__file__).parent data_path = repo_path / "data" @@ -143,76 +155,67 @@ ) def sentiment_prediction(inputs: pd.DataFrame) -> pd.DataFrame: """ - Real-time sentiment prediction using pre-trained models. + Real-time sentiment prediction using pre-loaded static artifacts. - This function demonstrates how to integrate PyTorch/HuggingFace models - directly into Feast feature views for real-time inference. + This function demonstrates how to use static artifacts (pre-loaded models, + lookup tables) for efficient real-time inference. Models are loaded once + at feature server startup rather than on each request. """ try: import numpy as np - from transformers import pipeline except ImportError: - # Fallback to dummy predictions if dependencies aren't available - df = pd.DataFrame() - df["predicted_sentiment"] = ["neutral"] * len(inputs) - df["sentiment_confidence"] = np.array([0.5] * len(inputs), dtype=np.float32) - df["positive_prob"] = np.array([0.33] * len(inputs), dtype=np.float32) - df["negative_prob"] = np.array([0.33] * len(inputs), dtype=np.float32) - df["neutral_prob"] = np.array([0.34] * len(inputs), dtype=np.float32) - df["text_embedding"] = [[np.float32(0.0)] * 384] * len(inputs) - return df + # Fallback to dummy predictions if numpy isn't available - # Initialize model (in production, you'd want to cache this) - model_name = "cardiffnlp/twitter-roberta-base-sentiment-latest" - try: - # Use sentiment pipeline for convenience (force CPU to avoid MPS forking issues) - sentiment_pipeline = pipeline( - "sentiment-analysis", - model=model_name, - tokenizer=model_name, - return_all_scores=True, - device="cpu", # Force CPU to avoid MPS forking issues on macOS - ) - - except Exception: - # Fallback if model loading fails df = pd.DataFrame() df["predicted_sentiment"] = ["neutral"] * len(inputs) - df["sentiment_confidence"] = np.array([0.5] * len(inputs), dtype=np.float32) - df["positive_prob"] = np.array([0.33] * len(inputs), dtype=np.float32) - df["negative_prob"] = np.array([0.33] * len(inputs), dtype=np.float32) - df["neutral_prob"] = np.array([0.34] * len(inputs), dtype=np.float32) - df["text_embedding"] = [[np.float32(0.0)] * 384] * len(inputs) + df["sentiment_confidence"] = [0.5] * len(inputs) + df["positive_prob"] = [0.33] * len(inputs) + df["negative_prob"] = [0.33] * len(inputs) + df["neutral_prob"] = [0.34] * len(inputs) + df["text_embedding"] = [[0.0] * 384] * len(inputs) return df + # Get pre-loaded static artifacts from global references + # These are loaded once at startup via static_artifacts.py + global _sentiment_model, _lookup_tables + + sentiment_model = _sentiment_model + lookup_tables = _lookup_tables + + # Use lookup table for label mapping (from static artifacts) + label_map = lookup_tables.get( + "sentiment_labels", + {"LABEL_0": "negative", "LABEL_1": "neutral", "LABEL_2": "positive"}, + ) + results = [] for text in inputs["input_text"]: try: - # Get sentiment predictions - predictions = sentiment_pipeline(text) - - # Parse results (RoBERTa model returns LABEL_0, LABEL_1, LABEL_2) - label_map = { - "LABEL_0": "negative", - "LABEL_1": "neutral", - "LABEL_2": "positive", - } - - scores = { - label_map.get(pred["label"], pred["label"]): pred["score"] - for pred in predictions - } - - # Get best prediction - best_pred = max(predictions, key=lambda x: x["score"]) - predicted_sentiment = label_map.get(best_pred["label"], best_pred["label"]) - confidence = best_pred["score"] - - # Get embeddings (simplified - dummy embeddings for demo) - # In a real implementation, you'd run the model to get embeddings - # For this demo, we'll create a dummy embedding - embedding = np.random.rand(384).tolist() # DistilBERT size + if sentiment_model is not None: + # Use pre-loaded model for prediction + predictions = sentiment_model(text) + + # Parse results using static lookup tables + scores = { + label_map.get(pred["label"], pred["label"]): pred["score"] + for pred in predictions + } + + # Get best prediction + best_pred = max(predictions, key=lambda x: x["score"]) + predicted_sentiment = label_map.get( + best_pred["label"], best_pred["label"] + ) + confidence = best_pred["score"] + else: + # Fallback when model is not available + predicted_sentiment = "neutral" + confidence = 0.5 + scores = {"positive": 0.33, "negative": 0.33, "neutral": 0.34} + + # Generate dummy embeddings (in production, use pre-loaded embeddings) + embedding = np.random.rand(384).tolist() results.append( { diff --git a/sdk/python/feast/templates/pytorch_nlp/feature_repo/static_artifacts.py b/sdk/python/feast/templates/pytorch_nlp/feature_repo/static_artifacts.py new file mode 100644 index 00000000000..6f7a5ae3091 --- /dev/null +++ b/sdk/python/feast/templates/pytorch_nlp/feature_repo/static_artifacts.py @@ -0,0 +1,139 @@ +""" +Static Artifacts Loading for PyTorch NLP Template + +This module demonstrates how to load static artifacts (models, lookup tables, etc.) +into the Feast feature server at startup for efficient real-time inference. + +Supported artifact types: +- Small ML models (transformers, scikit-learn, etc.) +- Lookup tables and reference data +- Configuration parameters +- Pre-computed embeddings + +Note: Feast is not optimized for large language models. For LLM inference, +use dedicated model serving solutions like vLLM, TensorRT-LLM, or TGI. +""" + +from pathlib import Path +from typing import Any, Dict, Optional + +from fastapi import FastAPI +from fastapi.logger import logger + + +def load_sentiment_model(): + """Load sentiment analysis model for real-time inference.""" + try: + from transformers import pipeline + + logger.info("Loading sentiment analysis model...") + model = pipeline( + "sentiment-analysis", + model="cardiffnlp/twitter-roberta-base-sentiment-latest", + tokenizer="cardiffnlp/twitter-roberta-base-sentiment-latest", + return_all_scores=True, + device="cpu", # Force CPU to avoid MPS forking issues on macOS + ) + logger.info("✅ Sentiment analysis model loaded successfully") + return model + except ImportError: + logger.warning( + "⚠️ Transformers not available, sentiment model will use fallback" + ) + return None + except Exception as e: + logger.warning(f"⚠️ Failed to load sentiment model: {e}") + return None + + +def load_lookup_tables() -> Dict[str, Any]: + """Load static lookup tables for feature engineering.""" + # Example: Load static mappings that are expensive to compute at request time + return { + "sentiment_labels": { + "LABEL_0": "negative", + "LABEL_1": "neutral", + "LABEL_2": "positive", + }, + "emoji_sentiment": {"😊": "positive", "😞": "negative", "😐": "neutral"}, + "domain_categories": {"twitter.com": "social", "news.com": "news"}, + } + + +def load_user_embeddings() -> Optional[Dict[str, Any]]: + """Load pre-computed user embeddings if available.""" + # Example: Load static user embeddings for recommendation features + embeddings_file = Path(__file__).parent / "data" / "user_embeddings.npy" + + if embeddings_file.exists(): + try: + import numpy as np + + embeddings = np.load(embeddings_file) + logger.info(f"✅ Loaded user embeddings: {embeddings.shape}") + return {"embeddings": embeddings} + except Exception as e: + logger.warning(f"⚠️ Failed to load user embeddings: {e}") + + return None + + +def load_artifacts(app: FastAPI): + """ + Main function called by Feast feature server to load static artifacts. + + This function is called during server startup and should store artifacts + in app.state for access by on-demand feature views. + """ + logger.info("🔄 Loading static artifacts for PyTorch NLP template...") + + # Load sentiment analysis model + app.state.sentiment_model = load_sentiment_model() + + # Load lookup tables + app.state.lookup_tables = load_lookup_tables() + + # Load user embeddings (optional) + app.state.user_embeddings = load_user_embeddings() + + # Also set global references for easier access from on-demand feature views + try: + import example_repo + + example_repo._sentiment_model = app.state.sentiment_model + example_repo._lookup_tables = app.state.lookup_tables + logger.info("✅ Global artifact references updated") + except ImportError: + logger.warning("⚠️ Could not update global artifact references") + + logger.info("✅ Static artifacts loading completed") + + +def get_static_artifact(app_state: Any, name: str) -> Any: + """ + Helper function to safely access static artifacts from app.state. + + Args: + app_state: FastAPI app.state object + name: Name of the artifact to retrieve + + Returns: + The requested artifact or None if not found + """ + return getattr(app_state, name, None) + + +# Convenience functions for accessing specific artifacts +def get_sentiment_model(app_state: Any): + """Get the pre-loaded sentiment analysis model.""" + return get_static_artifact(app_state, "sentiment_model") + + +def get_lookup_tables(app_state: Any) -> Dict[str, Any]: + """Get the pre-loaded lookup tables.""" + return get_static_artifact(app_state, "lookup_tables") or {} + + +def get_user_embeddings(app_state: Any): + """Get the pre-loaded user embeddings.""" + return get_static_artifact(app_state, "user_embeddings") diff --git a/sdk/python/tests/unit/test_feature_server.py b/sdk/python/tests/unit/test_feature_server.py index 21c01d61765..e3fd0387fb9 100644 --- a/sdk/python/tests/unit/test_feature_server.py +++ b/sdk/python/tests/unit/test_feature_server.py @@ -207,3 +207,204 @@ def test_materialize_request_model(): assert req2.disable_event_timestamp is False assert req2.start_ts == "2021-01-01T00:00:00" assert req2.end_ts == "2021-01-02T00:00:00" + + +# Static Artifacts Tests +@pytest.fixture +def mock_store_with_static_artifacts(tmp_path): + """Create a mock store with static_artifacts.py file for testing.""" + # Create static_artifacts.py file + static_artifacts_content = ''' +from fastapi import FastAPI +from fastapi.logger import logger + +def load_test_model(): + """Mock model loading for testing.""" + logger.info("Loading test model...") + return "test_model_loaded" + +def load_test_lookup_tables(): + """Mock lookup tables for testing.""" + return {"test_label": "test_value"} + +def load_artifacts(app: FastAPI): + """Load test static artifacts.""" + app.state.test_model = load_test_model() + app.state.test_lookup_tables = load_test_lookup_tables() + logger.info("✅ Test static artifacts loaded") +''' + + # Write static_artifacts.py to temp directory + artifacts_file = tmp_path / "static_artifacts.py" + artifacts_file.write_text(static_artifacts_content) + + # Create mock store + mock_store = MagicMock() + mock_store.repo_path = str(tmp_path) + return mock_store + + +def test_load_static_artifacts_success(mock_store_with_static_artifacts): + """Test successful loading of static artifacts during server startup.""" + import asyncio + + from fastapi import FastAPI + + from feast.feature_server import load_static_artifacts + + app = FastAPI() + + # Load static artifacts + asyncio.run(load_static_artifacts(app, mock_store_with_static_artifacts)) + + # Verify artifacts were loaded into app.state + assert hasattr(app.state, "test_model") + assert hasattr(app.state, "test_lookup_tables") + assert app.state.test_model == "test_model_loaded" + assert app.state.test_lookup_tables == {"test_label": "test_value"} + + +def test_load_static_artifacts_no_file(tmp_path): + """Test graceful handling when static_artifacts.py doesn't exist.""" + import asyncio + + from fastapi import FastAPI + + from feast.feature_server import load_static_artifacts + + app = FastAPI() + mock_store = MagicMock() + mock_store.repo_path = str(tmp_path) # Empty directory + + # Should not raise an exception + asyncio.run(load_static_artifacts(app, mock_store)) + + # Should not have added test artifacts + assert not hasattr(app.state, "test_model") + assert not hasattr(app.state, "test_lookup_tables") + + +def test_load_static_artifacts_invalid_file(tmp_path): + """Test graceful handling when static_artifacts.py has errors.""" + import asyncio + + from fastapi import FastAPI + + from feast.feature_server import load_static_artifacts + + # Create invalid static_artifacts.py + artifacts_file = tmp_path / "static_artifacts.py" + artifacts_file.write_text("raise ValueError('Test error')") + + app = FastAPI() + mock_store = MagicMock() + mock_store.repo_path = str(tmp_path) + + # Should handle the error gracefully + asyncio.run(load_static_artifacts(app, mock_store)) + + # Should not have artifacts due to error + assert not hasattr(app.state, "test_model") + + +def test_load_static_artifacts_no_load_function(tmp_path): + """Test handling when static_artifacts.py has no load_artifacts function.""" + import asyncio + + from fastapi import FastAPI + + from feast.feature_server import load_static_artifacts + + # Create static_artifacts.py without load_artifacts function + artifacts_file = tmp_path / "static_artifacts.py" + artifacts_file.write_text("TEST_CONSTANT = 'test'") + + app = FastAPI() + mock_store = MagicMock() + mock_store.repo_path = str(tmp_path) + + # Should handle gracefully + asyncio.run(load_static_artifacts(app, mock_store)) + + # Should not have artifacts since no load_artifacts function + assert not hasattr(app.state, "test_model") + + +def test_static_artifacts_persist_across_requests(mock_store_with_static_artifacts): + """Test that static artifacts persist across multiple requests.""" + from feast.feature_server import get_app + + # Create app with static artifacts + app = get_app(mock_store_with_static_artifacts) + + # Simulate artifacts being loaded (normally done in lifespan) + app.state.test_model = "persistent_model" + app.state.test_lookup_tables = {"persistent": "data"} + + # Artifacts should be available and persistent + assert app.state.test_model == "persistent_model" + assert app.state.test_lookup_tables["persistent"] == "data" + + # After simulated requests, artifacts should still be there + assert app.state.test_model == "persistent_model" + assert app.state.test_lookup_tables["persistent"] == "data" + + +def test_pytorch_nlp_template_artifacts_pattern(tmp_path): + """Test the specific PyTorch NLP template static artifacts pattern.""" + import asyncio + + from fastapi import FastAPI + + from feast.feature_server import load_static_artifacts + + # Create PyTorch NLP template-style static_artifacts.py + pytorch_artifacts_content = ''' +from fastapi import FastAPI +from fastapi.logger import logger + +def load_sentiment_model(): + """Mock sentiment analysis model loading.""" + logger.info("Loading sentiment analysis model...") + return "mock_roberta_sentiment_model" + +def load_lookup_tables(): + """Load lookup tables for sentiment mapping.""" + return { + "sentiment_labels": {"LABEL_0": "negative", "LABEL_1": "neutral", "LABEL_2": "positive"}, + "emoji_sentiment": {"😊": "positive", "😞": "negative", "😐": "neutral"}, + } + +def load_artifacts(app: FastAPI): + """Load all static artifacts for PyTorch NLP template.""" + app.state.sentiment_model = load_sentiment_model() + app.state.lookup_tables = load_lookup_tables() + + # Update global references (simulating example_repo.py pattern) + # In real template, this would be: import example_repo; example_repo._sentiment_model = ... + logger.info("✅ PyTorch NLP static artifacts loaded successfully") +''' + + artifacts_file = tmp_path / "static_artifacts.py" + artifacts_file.write_text(pytorch_artifacts_content) + + # Test loading + app = FastAPI() + mock_store = MagicMock() + mock_store.repo_path = str(tmp_path) + + asyncio.run(load_static_artifacts(app, mock_store)) + + # Verify PyTorch NLP template artifacts + assert hasattr(app.state, "sentiment_model") + assert hasattr(app.state, "lookup_tables") + assert app.state.sentiment_model == "mock_roberta_sentiment_model" + + # Verify lookup tables structure matches template + lookup_tables = app.state.lookup_tables + assert "sentiment_labels" in lookup_tables + assert "emoji_sentiment" in lookup_tables + assert lookup_tables["sentiment_labels"]["LABEL_0"] == "negative" + assert lookup_tables["sentiment_labels"]["LABEL_1"] == "neutral" + assert lookup_tables["sentiment_labels"]["LABEL_2"] == "positive" + assert lookup_tables["emoji_sentiment"]["😊"] == "positive" From 59dbb33ec809cd3020cb3c5ac2dcbf2fc920fd4d Mon Sep 17 00:00:00 2001 From: Lukas Valatka Date: Tue, 23 Dec 2025 09:55:02 +0200 Subject: [PATCH 05/26] fix: Add possibility to overwrite send_receive_timeout for clickhouse offline store (#5792) * add changes + fix linting issues Signed-off-by: lukas.valatka * generalize based on pr suggestion Signed-off-by: lukas.valatka * add test verifying config parsing Signed-off-by: lukas.valatka * rework test into integration, since CH instance is needed Signed-off-by: lukas.valatka --------- Signed-off-by: lukas.valatka --- .../tests/data_source.py | 28 +++++++++ .../utils/clickhouse/clickhouse_config.py | 6 ++ .../utils/clickhouse/connection_utils.py | 26 ++++++--- .../infra/offline_stores/test_clickhouse.py | 57 +++++++++++++++++++ 4 files changed, 110 insertions(+), 7 deletions(-) diff --git a/sdk/python/feast/infra/offline_stores/contrib/clickhouse_offline_store/tests/data_source.py b/sdk/python/feast/infra/offline_stores/contrib/clickhouse_offline_store/tests/data_source.py index 80fd1751dc5..4234c46eb3f 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/clickhouse_offline_store/tests/data_source.py +++ b/sdk/python/feast/infra/offline_stores/contrib/clickhouse_offline_store/tests/data_source.py @@ -15,6 +15,8 @@ from feast.infra.offline_stores.contrib.clickhouse_offline_store.clickhouse_source import ( ClickhouseSource, ) +from feast.infra.utils.clickhouse.clickhouse_config import ClickhouseConfig +from feast.infra.utils.clickhouse.connection_utils import get_client from tests.integration.feature_repos.universal.data_source_creator import ( DataSourceCreator, ) @@ -114,3 +116,29 @@ def create_saved_dataset_destination(self): def teardown(self): pass + + +def test_get_client_with_additional_params(clickhouse_container): + """ + Test that get_client works with a real ClickHouse container and properly passes + additional settings like send_receive_timeout. + """ + # Create config with custom send_receive_timeout + config = ClickhouseConfig( + host=clickhouse_container.get_container_host_ip(), + port=clickhouse_container.get_exposed_port(8123), + user=CLICKHOUSE_USER, + password=CLICKHOUSE_PASSWORD, + database=CLICKHOUSE_OFFLINE_DB, + additional_client_args={"send_receive_timeout": 60}, + ) + + # Get client and verify it works + client = get_client(config) + + # Verify client is connected and functional by running a simple query + result = client.query("SELECT 1 AS test_value") + assert result.result_rows == [(1,)] + + # Verify the send_receive_timeout was applied + assert client.timeout._read == 60 diff --git a/sdk/python/feast/infra/utils/clickhouse/clickhouse_config.py b/sdk/python/feast/infra/utils/clickhouse/clickhouse_config.py index 1f163e0a81b..75167f8a60e 100644 --- a/sdk/python/feast/infra/utils/clickhouse/clickhouse_config.py +++ b/sdk/python/feast/infra/utils/clickhouse/clickhouse_config.py @@ -1,3 +1,5 @@ +from typing import Any + from pydantic import ConfigDict, StrictStr from feast.repo_config import FeastConfigBaseModel @@ -11,4 +13,8 @@ class ClickhouseConfig(FeastConfigBaseModel): password: StrictStr use_temporary_tables_for_entity_df: bool = True + # See https://github.com/ClickHouse/clickhouse-connect/blob/main/clickhouse_connect/driver/__init__.py#L51 + # Some typical ones e.g. send_receive_timeout (read_timeout), etc + additional_client_args: dict[str, Any] | None = None + model_config = ConfigDict(frozen=True) diff --git a/sdk/python/feast/infra/utils/clickhouse/connection_utils.py b/sdk/python/feast/infra/utils/clickhouse/connection_utils.py index 88f5334db14..6d5f1b87052 100644 --- a/sdk/python/feast/infra/utils/clickhouse/connection_utils.py +++ b/sdk/python/feast/infra/utils/clickhouse/connection_utils.py @@ -11,12 +11,24 @@ def get_client(config: ClickhouseConfig) -> Client: # Clickhouse client is not thread-safe, so we need to create a separate instance for each thread. if not hasattr(thread_local, "clickhouse_client"): - thread_local.clickhouse_client = clickhouse_connect.get_client( - host=config.host, - port=config.port, - user=config.user, - password=config.password, - database=config.database, - ) + additional_client_args = config.additional_client_args + + if additional_client_args: + thread_local.clickhouse_client = clickhouse_connect.get_client( + host=config.host, + port=config.port, + user=config.user, + password=config.password, + database=config.database, + **additional_client_args, + ) + else: + thread_local.clickhouse_client = clickhouse_connect.get_client( + host=config.host, + port=config.port, + user=config.user, + password=config.password, + database=config.database, + ) return thread_local.clickhouse_client diff --git a/sdk/python/tests/unit/infra/offline_stores/test_clickhouse.py b/sdk/python/tests/unit/infra/offline_stores/test_clickhouse.py index 38c632a59a7..f5440ed367d 100644 --- a/sdk/python/tests/unit/infra/offline_stores/test_clickhouse.py +++ b/sdk/python/tests/unit/infra/offline_stores/test_clickhouse.py @@ -1,3 +1,4 @@ +import logging import threading from unittest.mock import MagicMock, patch @@ -6,6 +7,8 @@ from feast.infra.utils.clickhouse.clickhouse_config import ClickhouseConfig from feast.infra.utils.clickhouse.connection_utils import get_client, thread_local +logger = logging.getLogger(__name__) + @pytest.fixture def clickhouse_config(): @@ -76,3 +79,57 @@ def thread_2_work(): assert client_1a is not client_2, ( "Different threads should get different client instances (not cached)" ) + + +def test_clickhouse_config_parses_additional_client_args(): + """ + Test that ClickhouseConfig correctly parses additional_client_args from a dict, + simulating how it would be parsed from YAML by Pydantic. + """ + # This simulates the dict that would come from yaml.safe_load() + raw_config = { + "host": "localhost", + "port": 8123, + "database": "default", + "user": "default", + "password": "password", + "additional_client_args": { + "send_receive_timeout": 60, + "compress": True, + "client_name": "feast_test", + }, + } + + # Pydantic should parse this dict into a ClickhouseConfig object + config = ClickhouseConfig(**raw_config) + + # Verify all fields are correctly parsed + assert config.host == "localhost" + assert config.port == 8123 + assert config.database == "default" + assert config.user == "default" + assert config.password == "password" + + # Verify additional_client_args is correctly parsed as a dict + assert config.additional_client_args is not None + assert isinstance(config.additional_client_args, dict) + assert config.additional_client_args["send_receive_timeout"] == 60 + assert config.additional_client_args["compress"] is True + assert config.additional_client_args["client_name"] == "feast_test" + + +def test_clickhouse_config_handles_none_additional_client_args(): + """ + Test that ClickhouseConfig correctly handles when additional_client_args is not provided. + """ + raw_config = { + "host": "localhost", + "port": 8123, + "database": "default", + "user": "default", + "password": "password", + } + + config = ClickhouseConfig(**raw_config) + + assert config.additional_client_args is None From 75b562805ccfc6af20bd14d555a64fe974b405a6 Mon Sep 17 00:00:00 2001 From: Aniket Paluskar <64416568+aniketpalu@users.noreply.github.com> Date: Tue, 30 Dec 2025 20:30:52 +0530 Subject: [PATCH 06/26] chore: Bump urllib3 version to >=2.6.0 (#5801) * chore: Bump urllib3 version to >=2.6.0 Signed-off-by: Aniket Paluskar * Updated library version in setup.py Signed-off-by: Aniket Paluskar --------- Signed-off-by: Aniket Paluskar --- pyproject.toml | 2 +- .../requirements/py3.10-ci-requirements.txt | 635 ++++++------- .../py3.10-minimal-requirements.txt | 475 +++++----- ...y3.10-minimal-sdist-requirements-build.txt | 280 +++--- .../py3.10-minimal-sdist-requirements.txt | 475 +++++----- .../requirements/py3.10-requirements.txt | 314 +++---- .../requirements/py3.11-ci-requirements.txt | 848 +++++++++--------- .../py3.11-minimal-requirements.txt | 623 ++++++------- ...y3.11-minimal-sdist-requirements-build.txt | 437 ++++----- .../py3.11-minimal-sdist-requirements.txt | 635 ++++++------- .../requirements/py3.11-requirements.txt | 462 +++++----- .../requirements/py3.12-ci-requirements.txt | 848 +++++++++--------- .../py3.12-minimal-requirements.txt | 617 ++++++------- ...y3.12-minimal-sdist-requirements-build.txt | 433 ++++----- .../py3.12-minimal-sdist-requirements.txt | 629 ++++++------- .../requirements/py3.12-requirements.txt | 456 +++++----- setup.py | 2 +- 17 files changed, 4145 insertions(+), 4026 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b87c70364bb..f2620b0915d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -147,7 +147,7 @@ ci = [ "mock==2.0.0", "moto<5", "mypy>=1.4.1,<1.11.3", - "urllib3>=1.25.4,<3", + "urllib3>=2.6.0,<3", "psutil==5.9.0", "py>=1.11.0", # https://github.com/pytest-dev/pytest/issues/10420 "pytest>=6.0.0,<8", diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index a9fe1faf9bf..2c448173938 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -250,9 +250,9 @@ attrs==25.4.0 \ # jsonlines # jsonschema # referencing -azure-core==1.36.0 \ - --hash=sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7 \ - --hash=sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b +azure-core==1.37.0 \ + --hash=sha256:7064f2c11e4b97f340e8e8c6d923b822978be3016e46b7bc4aa4b337cfb48aee \ + --hash=sha256:b3abe2c59e7d6bb18b38c275a5029ff80f98990e7c90a5e646249a56630fcc19 # via # azure-identity # azure-storage-blob @@ -276,9 +276,9 @@ beautifulsoup4==4.14.3 \ # via # docling # nbconvert -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) bleach[css]==6.3.0 \ --hash=sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22 \ @@ -308,9 +308,9 @@ build==1.3.0 \ # feast (setup.py) # pip-tools # singlestoredb -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth cassandra-driver==3.29.3 \ --hash=sha256:064bf45d3ca87239e11168c0110676fc64f7fdbddb4bcba9be787b8ad5f6d734 \ @@ -553,9 +553,9 @@ charset-normalizer==3.4.4 \ # via # requests # snowflake-connector-python -click==8.2.1 \ - --hash=sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202 \ - --hash=sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b +click==8.3.1 \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 # via # feast (setup.py) # dask @@ -708,99 +708,99 @@ couchbase-columnar==1.0.0 \ --hash=sha256:fc0fad2d386c5b5df7aaaccd8751e01caa886cc640cc8c92523dd07c4e7be519 \ --hash=sha256:fc4efa3e15190c3731478006de494b046bc57785e9c8ae99ac8b375a91683e38 # via feast (setup.py) -coverage[toml]==7.13.0 \ - --hash=sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe \ - --hash=sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b \ - --hash=sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070 \ - --hash=sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e \ - --hash=sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053 \ - --hash=sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080 \ - --hash=sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc \ - --hash=sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb \ - --hash=sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf \ - --hash=sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820 \ - --hash=sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b \ - --hash=sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232 \ - --hash=sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657 \ - --hash=sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef \ - --hash=sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd \ - --hash=sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259 \ - --hash=sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833 \ - --hash=sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d \ - --hash=sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f \ - --hash=sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493 \ - --hash=sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8 \ - --hash=sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf \ - --hash=sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9 \ - --hash=sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19 \ - --hash=sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98 \ - --hash=sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f \ - --hash=sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b \ - --hash=sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9 \ - --hash=sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b \ - --hash=sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e \ - --hash=sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc \ - --hash=sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256 \ - --hash=sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8 \ - --hash=sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927 \ - --hash=sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae \ - --hash=sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f \ - --hash=sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe \ - --hash=sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f \ - --hash=sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621 \ - --hash=sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1 \ - --hash=sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137 \ - --hash=sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9 \ - --hash=sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74 \ - --hash=sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46 \ - --hash=sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8 \ - --hash=sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940 \ - --hash=sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39 \ - --hash=sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a \ - --hash=sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d \ - --hash=sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b \ - --hash=sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0 \ - --hash=sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a \ - --hash=sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2 \ - --hash=sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb \ - --hash=sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303 \ - --hash=sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971 \ - --hash=sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030 \ - --hash=sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96 \ - --hash=sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb \ - --hash=sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33 \ - --hash=sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8 \ - --hash=sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904 \ - --hash=sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d \ - --hash=sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28 \ - --hash=sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e \ - --hash=sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e \ - --hash=sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9 \ - --hash=sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74 \ - --hash=sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8 \ - --hash=sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032 \ - --hash=sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57 \ - --hash=sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be \ - --hash=sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936 \ - --hash=sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f \ - --hash=sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c \ - --hash=sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a \ - --hash=sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791 \ - --hash=sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5 \ - --hash=sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e \ - --hash=sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a \ - --hash=sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7 \ - --hash=sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a \ - --hash=sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753 \ - --hash=sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3 \ - --hash=sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6 \ - --hash=sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e \ - --hash=sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071 \ - --hash=sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b \ - --hash=sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511 \ - --hash=sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff \ - --hash=sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7 \ - --hash=sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6 +coverage[toml]==7.13.1 \ + --hash=sha256:0403f647055de2609be776965108447deb8e384fe4a553c119e3ff6bfbab4784 \ + --hash=sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e \ + --hash=sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3 \ + --hash=sha256:0d2c11f3ea4db66b5cbded23b20185c35066892c67d80ec4be4bab257b9ad1e0 \ + --hash=sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79 \ + --hash=sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75 \ + --hash=sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6 \ + --hash=sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f \ + --hash=sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88 \ + --hash=sha256:1dcb645d7e34dcbcc96cd7c132b1fc55c39263ca62eb961c064eb3928997363b \ + --hash=sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573 \ + --hash=sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0 \ + --hash=sha256:309ef5706e95e62578cda256b97f5e097916a2c26247c287bbe74794e7150df2 \ + --hash=sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0 \ + --hash=sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba \ + --hash=sha256:3d42df8201e00384736f0df9be2ced39324c3907607d17d50d50116c989d84cd \ + --hash=sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c \ + --hash=sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673 \ + --hash=sha256:3fc6a169517ca0d7ca6846c3c5392ef2b9e38896f61d615cb75b9e7134d4ee1e \ + --hash=sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee \ + --hash=sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3 \ + --hash=sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e \ + --hash=sha256:549d195116a1ba1e1ae2f5ca143f9777800f6636eab917d4f02b5310d6d73461 \ + --hash=sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6 \ + --hash=sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6 \ + --hash=sha256:5899d28b5276f536fcf840b18b61a9fce23cc3aec1d114c44c07fe94ebeaa500 \ + --hash=sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a \ + --hash=sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9 \ + --hash=sha256:67170979de0dacac3f3097d02b0ad188d8edcea44ccc44aaa0550af49150c7dc \ + --hash=sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5 \ + --hash=sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3 \ + --hash=sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d \ + --hash=sha256:75a6f4aa904301dab8022397a22c0039edc1f51e90b83dbd4464b8a38dc87842 \ + --hash=sha256:77545b5dcda13b70f872c3b5974ac64c21d05e65b1590b441c8560115dc3a0d1 \ + --hash=sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486 \ + --hash=sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29 \ + --hash=sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968 \ + --hash=sha256:868a2fae76dfb06e87291bcbd4dcbcc778a8500510b618d50496e520bd94d9b9 \ + --hash=sha256:8842af7f175078456b8b17f1b73a0d16a65dcbdc653ecefeb00a56b3c8c298c4 \ + --hash=sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c \ + --hash=sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a \ + --hash=sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465 \ + --hash=sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8 \ + --hash=sha256:92f980729e79b5d16d221038dbf2e8f9a9136afa072f9d5d6ed4cb984b126a09 \ + --hash=sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416 \ + --hash=sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894 \ + --hash=sha256:985b7836931d033570b94c94713c6dba5f9d3ff26045f72c3e5dbc5fe3361e5a \ + --hash=sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9 \ + --hash=sha256:9edd0e01a343766add6817bc448408858ba6b489039eaaa2018474e4001651a4 \ + --hash=sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5 \ + --hash=sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f \ + --hash=sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb \ + --hash=sha256:a4d240d260a1aed814790bbe1f10a5ff31ce6c21bc78f0da4a1e8268d6c80dbd \ + --hash=sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae \ + --hash=sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a \ + --hash=sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e \ + --hash=sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564 \ + --hash=sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd \ + --hash=sha256:bb3f6562e89bad0110afbe64e485aac2462efdce6232cdec7862a095dc3412f6 \ + --hash=sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f \ + --hash=sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7 \ + --hash=sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a \ + --hash=sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee \ + --hash=sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62 \ + --hash=sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d \ + --hash=sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef \ + --hash=sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b \ + --hash=sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1 \ + --hash=sha256:cb237bfd0ef4d5eb6a19e29f9e528ac67ac3be932ea6b44fb6cc09b9f3ecff78 \ + --hash=sha256:ccd7a6fca48ca9c131d9b0a2972a581e28b13416fc313fb98b6d24a03ce9a398 \ + --hash=sha256:d10a2ed46386e850bb3de503a54f9fe8192e5917fcbb143bfef653a9355e9a53 \ + --hash=sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d \ + --hash=sha256:d2287ac9360dec3837bfdad969963a5d073a09a85d898bd86bea82aa8876ef3c \ + --hash=sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909 \ + --hash=sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f \ + --hash=sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9 \ + --hash=sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90 \ + --hash=sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851 \ + --hash=sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147 \ + --hash=sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf \ + --hash=sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864 \ + --hash=sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4 \ + --hash=sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf \ + --hash=sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4 \ + --hash=sha256:f80e2bb21bfab56ed7405c2d79d34b5dc0bc96c2c1d2a067b643a09fb756c43a \ + --hash=sha256:f83351e0f7dcdb14d7326c3d8d8c4e915fa685cbfdc6281f9470d97a04e9dfe4 \ + --hash=sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c \ + --hash=sha256:fa3edde1aa8807de1d05934982416cb3ec46d1d4d91e280bcce7cca01c507992 \ + --hash=sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c \ + --hash=sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19 \ + --hash=sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7 \ + --hash=sha256:ffed1e4980889765c84a5d1a566159e363b71d6b6fbaf0bebc9d3c30bc016766 # via pytest-cov cryptography==43.0.3 \ --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \ @@ -843,51 +843,51 @@ cryptography==43.0.3 \ # snowflake-connector-python # types-pyopenssl # types-redis -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) datasets==4.0.0 \ --hash=sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d \ --hash=sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1 # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq -debugpy==1.8.17 \ - --hash=sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1 \ - --hash=sha256:1440fd514e1b815edd5861ca394786f90eb24960eb26d6f7200994333b1d79e3 \ - --hash=sha256:17e456da14848d618662354e1dccfd5e5fb75deec3d1d48dc0aa0baacda55860 \ - --hash=sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc \ - --hash=sha256:3a32c0af575749083d7492dc79f6ab69f21b2d2ad4cd977a958a07d5865316e4 \ - --hash=sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088 \ - --hash=sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670 \ - --hash=sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef \ - --hash=sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf \ - --hash=sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420 \ - --hash=sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464 \ - --hash=sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c \ - --hash=sha256:8deb4e31cd575c9f9370042876e078ca118117c1b5e1f22c32befcfbb6955f0c \ - --hash=sha256:a3aad0537cf4d9c1996434be68c6c9a6d233ac6f76c2a482c7803295b4e4f99a \ - --hash=sha256:b13eea5587e44f27f6c48588b5ad56dcb74a4f3a5f89250443c94587f3eb2ea1 \ - --hash=sha256:b532282ad4eca958b1b2d7dbcb2b7218e02cb934165859b918e3b6ba7772d3f4 \ - --hash=sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f \ - --hash=sha256:b75868b675949a96ab51abc114c7163f40ff0d8f7d6d5fd63f8932fd38e9c6d7 \ - --hash=sha256:bb1bbf92317e1f35afcf3ef0450219efb3afe00be79d8664b250ac0933b9015f \ - --hash=sha256:c41d2ce8bbaddcc0009cc73f65318eedfa3dbc88a8298081deb05389f1ab5542 \ - --hash=sha256:c6bdf134457ae0cac6fb68205776be635d31174eeac9541e1d0c062165c6461f \ - --hash=sha256:d3fce3f0e3de262a3b67e69916d001f3e767661c6e1ee42553009d445d1cd840 \ - --hash=sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83 \ - --hash=sha256:e79a195f9e059edfe5d8bf6f3749b2599452d3e9380484cd261f6b7cd2c7c4da \ - --hash=sha256:e851beb536a427b5df8aa7d0c7835b29a13812f41e46292ff80b2ef77327355a \ - --hash=sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464 \ - --hash=sha256:eaa85bce251feca8e4c87ce3b954aba84b8c645b90f0e6a515c00394a9f5c0e7 \ - --hash=sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d \ - --hash=sha256:f2ac8055a0c4a09b30b931100996ba49ef334c6947e7ae365cdd870416d7513e \ - --hash=sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e +debugpy==1.8.19 \ + --hash=sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b \ + --hash=sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa \ + --hash=sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af \ + --hash=sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62 \ + --hash=sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38 \ + --hash=sha256:4468de0c30012d367944f0eab4ecb8371736e8ef9522a465f61214f344c11183 \ + --hash=sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee \ + --hash=sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d \ + --hash=sha256:76f566baaf7f3e06adbe67ffedccd2ee911d1e486f55931939ce3f0fe1090774 \ + --hash=sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4 \ + --hash=sha256:7b62c0f015120ede25e5124a5f9d8a424e1208e3d96a36c89958f046ee21fff6 \ + --hash=sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488 \ + --hash=sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606 \ + --hash=sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f \ + --hash=sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d \ + --hash=sha256:a21bfdea088f713df05fa246ba0520f6ba44dd7eaec224742f51987a6979a648 \ + --hash=sha256:b1cb98e5325da3059ca24445fca48314bfddfdf65ce1b59ff07055e723f06bd2 \ + --hash=sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976 \ + --hash=sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5 \ + --hash=sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e \ + --hash=sha256:c047177ab2d286451f242b855b650d313198c4a987140d4b35218b2855a64a4a \ + --hash=sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73 \ + --hash=sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b \ + --hash=sha256:c9b9bf440141a36836bdbe4320a2b126bb38aafa85e1aed05d7bfbb0e2a278bf \ + --hash=sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809 \ + --hash=sha256:d9b6f633fd2865af2afba2beb0c1819b6ecd4aed1c8f90f5d1bbca3272306b10 \ + --hash=sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2 \ + --hash=sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de \ + --hash=sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb \ + --hash=sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254 # via ipykernel decorator==5.2.1 \ --hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \ @@ -929,9 +929,9 @@ docling==2.27.0 \ --hash=sha256:1288ed75b27e33bf94daff34faffc6d11b7d7ccc13e3df84fb24adad3991f72d \ --hash=sha256:faba35662612a2c687a3a463e501d95f645316436084af92a0442ce162429a3d # via feast (setup.py) -docling-core[chunking]==2.54.1 \ - --hash=sha256:2d22ee1cd8508fa7ffdd2e01ef30d7521390ff55ef240610f16be0cf54ffe73e \ - --hash=sha256:c6595e8b84f5e9de7a0a6298206d749f4be5730824604e684f204078a3689985 +docling-core[chunking]==2.57.0 \ + --hash=sha256:24b71172e8bc4fbe2b4213b29f51878114f4c13f25fc0bc9920168505c76c1a3 \ + --hash=sha256:398768b4d275ad2e11703ad9446fd0315a9a5fc8d09bc45ed207302d844d6ed5 # via # docling # docling-ibm-models @@ -1044,13 +1044,13 @@ durationpy==0.10 \ easyocr==1.7.2 \ --hash=sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c # via docling -elastic-transport==9.2.0 \ - --hash=sha256:0331466ca8febdb7d168c0fbf159294b0066492733b51da94f4dd28a0ee596cd \ - --hash=sha256:f52b961e58e6b76d488993286907f61a6ddccbdae8e0135ce8d369227b6282d8 +elastic-transport==9.2.1 \ + --hash=sha256:39e1a25e486af34ce7aa1bc9005d1c736f1b6fb04c9b64ea0604ded5a61fc1d4 \ + --hash=sha256:97d9abd638ba8aa90faa4ca1bf1a18bde0fe2088fbc8757f2eb7b299f205773d # via elasticsearch -elasticsearch==9.2.0 \ - --hash=sha256:87090fe98c515ec0fce82f633fe11d7e90e04d93581b6b3e05de29efe4cc8b74 \ - --hash=sha256:99656baa34b10130402b6c38429feddf7aee1c3247566e8f95f0d0267fe9f9ab +elasticsearch==9.2.1 \ + --hash=sha256:8665f5a0b4d29a7c2772851c05ea8a09279abb7928b7d727524613bd61d75958 \ + --hash=sha256:97f473418e8976611349757287ac982acf12f4e305182863d985d5a031c36830 # via feast (setup.py) entrypoints==0.4 \ --hash=sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4 \ @@ -1102,9 +1102,9 @@ faiss-cpu==1.10.0 \ --hash=sha256:e71f7e24d5b02d3a51df47b77bd10f394a1b48a8331d5c817e71e9e27a8a75ac \ --hash=sha256:f71c5860c860df2320299f9e4f2ca1725beb559c04acb1cf961ed24e6218277a # via feast (setup.py) -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -1116,9 +1116,9 @@ fastjsonschema==2.21.2 \ --hash=sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 \ --hash=sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de # via nbformat -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via # datasets # huggingface-hub @@ -1294,9 +1294,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -1315,19 +1315,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -1337,49 +1337,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1466,6 +1465,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1806,9 +1806,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via # build # dask @@ -1869,9 +1869,9 @@ jmespath==1.0.1 \ # aiobotocore # boto3 # botocore -joblib==1.5.2 \ - --hash=sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55 \ - --hash=sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241 +joblib==1.5.3 \ + --hash=sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 \ + --hash=sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3 # via scikit-learn json5==0.12.1 \ --hash=sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990 \ @@ -1951,9 +1951,9 @@ jupyter-server-terminals==0.5.3 \ --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa \ --hash=sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269 # via jupyter-server -jupyterlab==4.5.0 \ - --hash=sha256:88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a \ - --hash=sha256:aec33d6d8f1225b495ee2cf20f0514f45e6df8e360bdd7ac9bace0b7ac5177ea +jupyterlab==4.5.1 \ + --hash=sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9 \ + --hash=sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514 # via notebook jupyterlab-pygments==0.3.0 \ --hash=sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d \ @@ -2297,9 +2297,9 @@ markupsafe==3.0.3 \ # jinja2 # nbconvert # werkzeug -marshmallow==3.26.1 \ - --hash=sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c \ - --hash=sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6 +marshmallow==3.26.2 \ + --hash=sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73 \ + --hash=sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57 # via great-expectations matplotlib-inline==0.2.1 \ --hash=sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76 \ @@ -2307,9 +2307,9 @@ matplotlib-inline==0.2.1 \ # via # ipykernel # ipython -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -2327,9 +2327,9 @@ minio==7.2.11 \ --hash=sha256:153582ed52ff3b5005ba558e1f25bfe1e9e834f7f0745e594777f28e3e81e1a0 \ --hash=sha256:4db95a21fe1e2022ec975292d8a1f83bd5b18f830d23d42a4518ac7a5281d7c5 # via feast (setup.py) -mistune==3.1.4 \ - --hash=sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d \ - --hash=sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164 +mistune==3.2.0 \ + --hash=sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a \ + --hash=sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1 # via # great-expectations # nbconvert @@ -2752,9 +2752,9 @@ mypy-protobuf==3.3.0 \ --hash=sha256:15604f6943b16c05db646903261e3b3e775cf7f7990b7c37b03d043a907b650d \ --hash=sha256:24f3b0aecb06656e983f58e07c732a90577b9d7af3e1066fc2b663bbf0370248 # via feast (setup.py) -nbclient==0.10.2 \ - --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d \ - --hash=sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193 +nbclient==0.10.4 \ + --hash=sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9 \ + --hash=sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440 # via nbconvert nbconvert==7.16.6 \ --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b \ @@ -2799,13 +2799,13 @@ ninja==1.13.0 \ --hash=sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa \ --hash=sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e # via easyocr -nodeenv==1.9.1 \ - --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ - --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 +nodeenv==1.10.0 \ + --hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 \ + --hash=sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb # via pre-commit -notebook==7.5.0 \ - --hash=sha256:3300262d52905ca271bd50b22617681d95f08a8360d099e097726e6d2efb5811 \ - --hash=sha256:3b27eaf9913033c28dde92d02139414c608992e1df4b969c843219acf2ff95e4 +notebook==7.5.1 \ + --hash=sha256:b2fb4cef4d47d08c33aecce1c6c6e84be05436fbd791f88fce8df9fbca088b75 \ + --hash=sha256:f4e2451c19910c33b88709b84537e11f6368c1cdff1aa0c43db701aea535dd44 # via great-expectations notebook-shim==0.2.4 \ --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef \ @@ -3439,9 +3439,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -4074,9 +4074,9 @@ pyopenssl==25.1.0 \ --hash=sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab \ --hash=sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b # via snowflake-connector-python -pyparsing==3.2.5 \ - --hash=sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6 \ - --hash=sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e +pyparsing==3.3.1 \ + --hash=sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82 \ + --hash=sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c # via great-expectations pypdfium2==4.30.0 \ --hash=sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e \ @@ -4099,8 +4099,8 @@ pyproject-hooks==1.2.0 \ # via # build # pip-tools -pyspark==4.0.1 \ - --hash=sha256:9d1f22d994f60369228397e3479003ffe2dd736ba79165003246ff7bd48e2c73 +pyspark==4.1.0 \ + --hash=sha256:09c714ada88dfac3e1213c066617c6f473c1e22fbe279855028f77e12434147d # via feast (setup.py) pytest==7.4.4 \ --hash=sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280 \ @@ -4297,9 +4297,9 @@ python-keycloak==4.2.2 \ --hash=sha256:1d43a1accd4a038ed39317fcb3eb78211df6c75bbcbc4c482c99ee76327136f2 \ --hash=sha256:5137fd87c69031a372a578df96bae96b9aead2c9dad976613bc978e9e0246a1e # via feast (setup.py) -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp python-pptx==1.0.2 \ --hash=sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba \ @@ -4503,26 +4503,26 @@ pyzmq==27.1.0 \ # ipykernel # jupyter-client # jupyter-server -qdrant-client==1.16.1 \ - --hash=sha256:1eefe89f66e8a468ba0de1680e28b441e69825cfb62e8fb2e457c15e24ce5e3b \ - --hash=sha256:676c7c10fd4d4cb2981b8fcb32fd764f5f661b04b7334d024034d07212f971fd +qdrant-client==1.16.2 \ + --hash=sha256:442c7ef32ae0f005e88b5d3c0783c63d4912b97ae756eb5e052523be682f17d3 \ + --hash=sha256:ca4ef5f9be7b5eadeec89a085d96d5c723585a391eb8b2be8192919ab63185f0 # via feast (setup.py) -ray==2.52.1 \ - --hash=sha256:08eb8f5fd55292ba6bee363a32491136a5e54af54e007f81e0603986fbea41a4 \ - --hash=sha256:24694e60cdc7770b90f123cc578cabb9d1a231c1fe673b5da0027b118de45846 \ - --hash=sha256:2b57ef272a2a0a0dbae6d18d70aa541eab620b4fe3b44d50466d3a533c16f9d9 \ - --hash=sha256:4e8478544fef69a17d865431c0bebdcfeff7c0f76a306f29b73c3bc3cbb0bdb9 \ - --hash=sha256:65bf461fdfe4ffa667c46f9455f8740b2ad6c1fa471b461d5f5cf6b7baf177b5 \ - --hash=sha256:6831592fedf0a122016f5dab4b67d85fa3d4db3b21f588d18834b5c031396d1c \ - --hash=sha256:8045172ad3fcff62b9dab9a4cd2e0991ad0e27fc814fe625a8d3a120306651d6 \ - --hash=sha256:843c0108ad72bb7fc6c23a22e29e6099546a5eaad3ad675c78a146d9080f6ec6 \ - --hash=sha256:993194a8be70540e0f819862031bbf19a64401fbe6c31b42065fd313ba466d34 \ - --hash=sha256:a5a3c268d45060c50cd029979ecc5f1eaaec040b19fa88dd4fe9e927d19ff13e \ - --hash=sha256:b3f9e61b799fb3cc8fd7077a3d2eb676ddfef7db644f6b6a2b657c5c3214cf19 \ - --hash=sha256:b5bc29548abb0a0a7ae9e6ff3b0ccca2824edaf011a4336e15a32793d574fbfd \ - --hash=sha256:bbe492c780a39a64bd3d0766cad10d54cf12222df88d287ec2d8f2d52de37c79 \ - --hash=sha256:e3826aeb4e4399de0c6885bd8be7ce2f629fa0010f0013f1183e0726b3d25e40 \ - --hash=sha256:f59e3b2d1a1466ac0778f2c6fac9ccb5f30107d77e3dddd1d60167248d268474 +ray==2.53.0 \ + --hash=sha256:14f46363e9b4cf0c1c8b4d8623ec337c5bd408377831b5e5b50067930137bbca \ + --hash=sha256:4108280d8a1cb90d7d68e5c954c35e63b8bb9a4ba15f88c5e7da0e2025647712 \ + --hash=sha256:4a1bb3fe09ab4cd0d16ddc96b9f60c9ed83b3f93b87aa8506e0d3b746fd4e825 \ + --hash=sha256:4db914a0a6dd608fa49c066929a1282745a2dbd73caee67d7b80fe684ca65bdd \ + --hash=sha256:4dbb5fce1364763f29741055f50abe33cf726397141f9cc0e845dd3cc963e455 \ + --hash=sha256:65e2ce58d3dc6baa3cf45824d889c1968ebde565ee54dfd80a98af8f31af8e4a \ + --hash=sha256:7196e5358dfcc8211be864f45e6dfe4827202df294af3c7a76ff8fbc080e0522 \ + --hash=sha256:73dbbaa7962a7f5e38aa8cf9483e0e9817205e989aa3dc859c738c2af1ae01df \ + --hash=sha256:85b472ab6fb8f1189f8cef81913fd91b24dd69b3fa7dcca7e144827bd924f6c0 \ + --hash=sha256:90faf630d20b6abf3135997fb3edb5842134aff92e04ee709865db04816d97ef \ + --hash=sha256:a0bbb98b0b0f25a3ee075ca10171e1260e70b6bc690cd509ecd7ce1228af854d \ + --hash=sha256:b828c147f9ff2f277b1d254e4fe9a746fdfaee7e313a93a97c7edf4dae9b81a4 \ + --hash=sha256:bd3ec4c342776ddac23ae2b108c64f5939f417ccc4875900d586c7c978463269 \ + --hash=sha256:d8b95d047d947493803fb8417aea31225dcacdab15afdc75b8a238901949d457 \ + --hash=sha256:eb000c17f7301071fdd15c44c4cd3ac0f7953bb4c7c227e61719fe7048195bcd # via feast (setup.py) redis==4.6.0 \ --hash=sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d \ @@ -4861,26 +4861,26 @@ ruamel-yaml==0.17.17 \ --hash=sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be \ --hash=sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f # via great-expectations -ruff==0.14.8 \ - --hash=sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7 \ - --hash=sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344 \ - --hash=sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c \ - --hash=sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e \ - --hash=sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b \ - --hash=sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52 \ - --hash=sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f \ - --hash=sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a \ - --hash=sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed \ - --hash=sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a \ - --hash=sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9 \ - --hash=sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99 \ - --hash=sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097 \ - --hash=sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b \ - --hash=sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2 \ - --hash=sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b \ - --hash=sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb \ - --hash=sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6 \ - --hash=sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf +ruff==0.14.10 \ + --hash=sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6 \ + --hash=sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405 \ + --hash=sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a \ + --hash=sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f \ + --hash=sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154 \ + --hash=sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e \ + --hash=sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f \ + --hash=sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830 \ + --hash=sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f \ + --hash=sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77 \ + --hash=sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f \ + --hash=sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49 \ + --hash=sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4 \ + --hash=sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d \ + --hash=sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935 \ + --hash=sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60 \ + --hash=sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d \ + --hash=sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6 \ + --hash=sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d # via feast (setup.py) s3transfer==0.13.1 \ --hash=sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724 \ @@ -5171,9 +5171,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via snowflake-connector-python -soupsieve==2.8 \ - --hash=sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c \ - --hash=sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f +soupsieve==2.8.1 \ + --hash=sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350 \ + --hash=sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434 # via beautifulsoup4 sphinx==6.2.1 \ --hash=sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b \ @@ -5215,12 +5215,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -5239,7 +5241,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -5333,9 +5337,9 @@ sqlparams==6.2.0 \ --hash=sha256:3744a2ad16f71293db6505b21fd5229b4757489a9b09f3553656a1ae97ba7ca5 \ --hash=sha256:63b32ed9051bdc52e7e8b38bc4f78aed51796cdd9135e730f4c6a7db1048dedf # via singlestoredb -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp stack-data==0.6.3 \ --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ @@ -5347,6 +5351,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -5616,19 +5621,19 @@ torchvision==0.24.1 \ # docling-ibm-models # easyocr # timm -tornado==6.5.2 \ - --hash=sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c \ - --hash=sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6 \ - --hash=sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef \ - --hash=sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4 \ - --hash=sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0 \ - --hash=sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e \ - --hash=sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882 \ - --hash=sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04 \ - --hash=sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0 \ - --hash=sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af \ - --hash=sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f \ - --hash=sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108 +tornado==6.5.4 \ + --hash=sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1 \ + --hash=sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1 \ + --hash=sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843 \ + --hash=sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335 \ + --hash=sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8 \ + --hash=sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f \ + --hash=sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84 \ + --hash=sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7 \ + --hash=sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17 \ + --hash=sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9 \ + --hash=sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f \ + --hash=sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc # via # ipykernel # jupyter-client @@ -5788,9 +5793,9 @@ types-protobuf==3.19.22 \ # via # feast (setup.py) # mypy-protobuf -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) types-pyopenssl==24.1.0.20240722 \ --hash=sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39 \ @@ -5816,9 +5821,9 @@ types-requests==2.30.0.0 \ --hash=sha256:c6cf08e120ca9f0dc4fa4e32c3f953c3fba222bcc1db6b97695bce8da1ba9864 \ --hash=sha256:dec781054324a70ba64430ae9e62e7e9c8e4618c185a5cb3f87a6738251b5a31 # via feast (setup.py) -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via # feast (setup.py) # types-cffi @@ -5881,9 +5886,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via # arrow # pandas @@ -5983,9 +5988,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.10-minimal-requirements.txt b/sdk/python/requirements/py3.10-minimal-requirements.txt index 947efc21837..66d34c10570 100644 --- a/sdk/python/requirements/py3.10-minimal-requirements.txt +++ b/sdk/python/requirements/py3.10-minimal-requirements.txt @@ -176,9 +176,9 @@ attrs==25.4.0 \ # aiohttp # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -194,9 +194,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -471,13 +471,13 @@ cryptography==46.0.0 \ # pyjwt # pyopenssl # snowflake-connector-python -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -547,9 +547,9 @@ exceptiongroup==1.3.1 \ --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 # via anyio -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -557,9 +557,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python frozenlist==1.8.0 \ --hash=sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686 \ @@ -713,9 +713,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -734,19 +734,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -756,49 +756,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -881,6 +880,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1079,9 +1079,9 @@ idna==3.11 \ # requests # snowflake-connector-python # yarl -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -1108,83 +1108,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1285,9 +1285,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1575,45 +1575,45 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ @@ -1765,9 +1765,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -1915,9 +1915,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -1947,26 +1947,28 @@ protobuf==6.33.2 \ # grpcio-status # proto-plus # pymilvus -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2228,9 +2230,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2542,12 +2544,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2566,7 +2570,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2584,9 +2590,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2594,6 +2600,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette tabulate==0.9.0 \ --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f @@ -2673,13 +2680,13 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2715,9 +2722,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -2805,9 +2812,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.10-minimal-sdist-requirements-build.txt b/sdk/python/requirements/py3.10-minimal-sdist-requirements-build.txt index 8749629ccb6..8bb08a3bea9 100644 --- a/sdk/python/requirements/py3.10-minimal-sdist-requirements-build.txt +++ b/sdk/python/requirements/py3.10-minimal-sdist-requirements-build.txt @@ -97,7 +97,9 @@ cffi==2.0.0 \ coherent-licensed==0.5.2 \ --hash=sha256:d8071403ce742d3ac3592ddc4fb7057a46caffb415b928b4d52802e5f208416d \ --hash=sha256:edccc5193ca2786f8fb3f0c7374637a143985f781f7eaa21aca3af2bd634b82f - # via zipp + # via + # importlib-metadata + # zipp cython==3.0.12 \ --hash=sha256:0038c9bae46c459669390e53a1ec115f8096b2e4647ae007ff1bf4e6dee92806 \ --hash=sha256:0faa5e39e5c8cdf6f9c3b1c3f24972826e45911e7f5b99cf99453fca5432f45e \ @@ -170,46 +172,46 @@ cython==3.0.12 \ # pyyaml # snowflake-connector-python # sqlalchemy -cython==3.2.2 \ - --hash=sha256:034ab96cb8bc8e7432bc27491f8d66f51e435b1eb21ddc03aa844be8f21ad847 \ - --hash=sha256:098590c1dc309f8a0406ade031963a95a87714296b425539f9920aebf924560d \ - --hash=sha256:0e35ff0f1bb3a7a5c40afb8fb540e4178b6551909f10748bf39d323f8140ccf3 \ - --hash=sha256:13b99ecb9482aff6a6c12d1ca6feef6940c507af909914b49f568de74fa965fb \ - --hash=sha256:14432d7f207245a3c35556155873f494784169297b28978a6204f1c60d31553e \ - --hash=sha256:177faf4d61e9f2d4d2db61194ac9ec16d3fe3041c1b6830f871a01935319eeb3 \ - --hash=sha256:2b910b89a2a71004064c5e890b9512a251eda63fae252caa0feb9835057035f9 \ - --hash=sha256:3de43a5786033a27fae1c882feb5ff0d023c38b83356e6800c1be0bcd6cf9f11 \ - --hash=sha256:436eb562d0affbc0b959f62f3f9c1ed251b9499e4f29c1d19514ae859894b6bf \ - --hash=sha256:50bbaabee733fd2780985e459fc20f655e02def83e8eff10220ad88455a34622 \ - --hash=sha256:5f818d40bbcf17e2089e2de7840f0de1c0ca527acf9b044aba79d5f5d8a5bdba \ - --hash=sha256:60f4aa425e1ff98abf8d965ae7020f06dd2cbc01dbd945137d2f9cca4ff0524a \ - --hash=sha256:692a41c8fe06fb2dc55ca2c8d71c80c469fd16fe69486ed99f3b3cbb2d3af83f \ - --hash=sha256:820c4a99dbf6b3e6c0300be42b4040b501eff0e1feeb80cfa52c48a346fb0df2 \ - --hash=sha256:826cad0ad43ab05a26e873b5d625f64d458dc739ec6fdeecab848b60a91c4252 \ - --hash=sha256:86b1d39a1ea974dd16fe3bcef0df7b64dadd0bd38d05a339f287b48d37cb109f \ - --hash=sha256:8c9265b3e84ae2d999b7c3165c683e366bbbbbe4346468055ca2366fe013f2df \ - --hash=sha256:8db28aef793c81dc69383b619ca508668998aaf099cd839d3cbae85184cce744 \ - --hash=sha256:8e72ee88a9a5381d30a6da116a3c8352730b9b038a49ed9bc5c3d0ed6d69b06c \ - --hash=sha256:9cd2ede6af225499ad22888dbfb13b92d71fc1016f401ee637559a5831b177c2 \ - --hash=sha256:a3898c076e9c458bcb3e4936187919fda5f5365fe4c567d35d2b003444b6f3fe \ - --hash=sha256:a473df474ba89e9fee81ee82b31062a267f9e598096b222783477e56d02ad12c \ - --hash=sha256:a6387e3ad31342443916db9a419509935fddd8d4cbac34aab9c895ae55326a56 \ - --hash=sha256:a9509f1e9c41c86b790cff745bb31927bbc861662a3b462596d71d3d2a578abb \ - --hash=sha256:aa24cd0bdab27ca099b2467806c684404add597c1108e07ddf7b6471653c85d7 \ - --hash=sha256:aff11412ed5fc78bd8b148621f4d1034fcad6cfcba468c20cd9f327b4f61ec3e \ - --hash=sha256:b223c1f84c3420c24f6a4858e979524bd35a79437a5839e29d41201c87ed119d \ - --hash=sha256:b4df52101209817fde7284cf779156f79142fb639b1d7840f11680ff4bb30604 \ - --hash=sha256:b4fe499eed7cd70b2aa4e096b9ce2588f5e6fdf049b46d40a5e55efcde6e4904 \ - --hash=sha256:b5afac4e77e71a9010dc7fd3191ced00f9b12b494dd7525c140781054ce63a73 \ - --hash=sha256:c3add3d483acc73129a61d105389344d792c17e7c1cee24863f16416bd071634 \ - --hash=sha256:ca18d9d53c0e2f0c9347478b37532b46e0dc34c704e052ab1b0d8b21a290fc0f \ - --hash=sha256:d140c2701cbb8cf960300cf1b67f3b4fa9d294d32e51b85f329bff56936a82fd \ - --hash=sha256:d7b3447b2005dffc5f276d420a480d2b57d15091242652d410b6a46fb00ed251 \ - --hash=sha256:d8c93fe128b58942832b1fcac96e48f93c2c69b569eff0d38d30fb5995fecfa0 \ - --hash=sha256:e7200309b81f4066cf36a96efeec646716ca74afd73d159045169263db891133 \ - --hash=sha256:f560ff3aea5b5df93853ec7bf1a1e9623d6d511f4192f197559aca18fca43392 \ - --hash=sha256:fed44d0ab2d36f1b0301c770b0dafec23bcb9700d58e7769cd6d9136b3304c11 \ - --hash=sha256:ff07e784ea748225bbdea07fec0ac451379e9e41a0a84cb57b36db19dd01ae71 +cython==3.2.3 \ + --hash=sha256:0145e64485f0a9741c9314ae176282dffeb48d2ef30ae315d7224698867c317f \ + --hash=sha256:06a1317097f540d3bb6c7b81ed58a0d8b9dbfa97abf39dfd4c22ee87a6c7241e \ + --hash=sha256:0a75a04688875b275a6c875565e672325bae04327dd6ec2fc25aeb5c6cf82fce \ + --hash=sha256:1309bdce06f767e8514377f44b3a5b9e5b91e58af1348010cca10b572e1852ad \ + --hash=sha256:18b5e738c9dbb1cb488b51e35c3a1b9aa7363166cce40158fe6ccb454f6498ac \ + --hash=sha256:18edc858e6a52de47fe03ffa97ea14dadf450e20069de0a8aef531006c4bbd93 \ + --hash=sha256:1d097ad4686b58b8c03d760d08eca28f79878d404ef7452c49636170571654e0 \ + --hash=sha256:228f11be8406015d1ce84a25bf4f96167ff6fc18b834deca5716d95ae15a818c \ + --hash=sha256:22a624290c2883387b2c2cfb5224c15bff21432c6a2cf0c23ac8df3dcbd45e96 \ + --hash=sha256:25732f3981a93407826297f4423206e5e22c3cfccfc74e37bf444453bbdc076f \ + --hash=sha256:26404441f733fd1cfb0dd9c45477f501437e7d51fad05bb402bd2feb4e127aa3 \ + --hash=sha256:283262b8f902323ceb6ed3b643f275a2a963e7ab059f0714a467933383cbc56d \ + --hash=sha256:2a18f2e3bcd018416157d0a83446e29b4a31437ab79061fe5504c077e70389d0 \ + --hash=sha256:3141734fb15f8b5e9402b9240f8da8336edecae91742b41c85678c31ab68f66d \ + --hash=sha256:3829f99d611412288f44ff543e9d2b5c0c83274998b2a6680bbe5cca3539c1fd \ + --hash=sha256:4f40efa83c93060a271046930d2322ec045abb9722d25a377702cb57aa823c2b \ + --hash=sha256:51fd1a56d0fc682c05ecc44f11927dbe28dd2867c30148557b62d7d1017a13d8 \ + --hash=sha256:55c0157a5940fbf0b054508207fe0fc5cc796d0532af492c0fa35b5b41a883f7 \ + --hash=sha256:60d19376252722241a3d3ec8a695c5cae4deb053486d2e5f9a40cb569a0cf984 \ + --hash=sha256:6b01b36c9eb1b68c25bddbeef7379f7bfc37f7c9afc044e71840ffab761a2dd0 \ + --hash=sha256:6b6dd6b7aca8447b2a6779b314cc402f1e4990754507a88477e535b3c8b41ad1 \ + --hash=sha256:73afc824896ffaf22bf8122d0a7107f0120e3188a353bdcfa92317fc0d9a87ce \ + --hash=sha256:74f482da8b605c61b4df6ff716d013f20131949cb2fa59b03e63abd36ef5bac0 \ + --hash=sha256:80f20369d7aaf4e76cfef902025256918a5cc6eb0aed6d8783e4b1c563e4f6c4 \ + --hash=sha256:84330e7c8bf220a82b633678b9f99e10227c8f4c406d67c5552449ab2afedef8 \ + --hash=sha256:9a24cc653fad3adbd9cbaa638d80df3aa08a1fe27f62eb35850971c70be680df \ + --hash=sha256:9aa1a8abf3d8bb53cc19cfaa21c004afad8d4ccb17513f8aa11a788d1f525abd \ + --hash=sha256:9c5ac7201d8382c0da69e4a119c14be6acd7c286615a0383ffbd1dbfdbaa3df7 \ + --hash=sha256:b39dff92db70cbd95528f3b81d70e06bd6d3fc9c1dd91321e4d3b999ece3bceb \ + --hash=sha256:c041f7e338cca2422e0924716b04fabeda57636214324fc1941396acce99e7c7 \ + --hash=sha256:c102388cf7604ff5647164d5041fd5de2393198a87883fdb50f6c078fc2f4f8e \ + --hash=sha256:c2365a0c79ab9c0fa86d30a4a6ba7e37fc1be9537c48b79b9d63ee7e08bf2fef \ + --hash=sha256:cf210228c15b5c625824d8e31d43b6fea25f9e13c81dac632f2f7d838e0229a5 \ + --hash=sha256:d1f8700ba89c977438744f083890d87187f15709507a5489e0f6d682053b7fa0 \ + --hash=sha256:e31f52ea7e35463b21410f150006eb07b663a0b3ceea8ee8f35e0b8e02b75f50 \ + --hash=sha256:e4293f1861480b397809a6f021a6c12e15e918feae1c7add80c99d07af206578 \ + --hash=sha256:f13832412d633376ffc08d751cc18ed0d7d00a398a4065e2871db505258748a6 \ + --hash=sha256:f5bf0cebeb4147e172a114437d3fce5a507595d8fdd821be792b1bb25c691514 \ + --hash=sha256:fabe2f37acb63a5521d16193effb15acd082e35458f30f1c1f3e506271fee8a7 # via uvloop dunamai==1.25.0 \ --hash=sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab \ @@ -334,83 +336,83 @@ jinja2==3.1.6 \ # via # poetry-dynamic-versioning # uv-dynamic-versioning -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy markupsafe==3.0.3 \ --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ @@ -503,21 +505,21 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -maturin==1.10.2 \ - --hash=sha256:04df81ee295dcda37828bd025a4ac688ea856e3946e4cb300a8f44a448de0069 \ - --hash=sha256:07a82864352feeaf2167247c8206937ef6c6ae9533025d416b7004ade0ea601d \ - --hash=sha256:11c73815f21a755d2129c410e6cb19dbfacbc0155bfc46c706b69930c2eb794b \ - --hash=sha256:259292563da89850bf8f7d37aa4ddba22905214c1e180b1c8f55505dfd8c0e81 \ - --hash=sha256:7fbd997c5347649ee7987bd05a92bd5b8b07efa4ac3f8bcbf6196e07eb573d89 \ - --hash=sha256:96e1d391e4c1fa87edf2a37e4d53d5f2e5f39dd880b9d8306ac9f8eb212d23f8 \ - --hash=sha256:a217aa7c42aa332fb8e8377eb07314e1f02cf0fe036f614aca4575121952addd \ - --hash=sha256:a41ec70d99e27c05377be90f8e3c3def2a7bae4d0d9d5ea874aaf2d1da625d5c \ - --hash=sha256:a4c29a770ea2c76082e0afc6d4efd8ee94405588bfae00d10828f72e206c739b \ - --hash=sha256:da031771d9fb6ddb1d373638ec2556feee29e4507365cd5749a2d354bcadd818 \ - --hash=sha256:da777766fd584440dc9fecd30059a94f85e4983f58b09e438ae38ee4b494024c \ - --hash=sha256:e3ce9b2ad4fb9c341f450a6d32dc3edb409a2d582a81bc46ba55f6e3b6196b22 \ - --hash=sha256:efcd496a3202ffe0d0489df1f83d08b91399782fb2dd545d5a1e7bf6fd81af39 \ - --hash=sha256:f0d1b7b5f73c8d30a7e71cd2a2189a7f0126a3a3cd8b3d6843e7e1d4db50f759 +maturin==1.11.0 \ + --hash=sha256:0fbe565ede0901de7743cd028ad6c13be623b1c7158641f8a50d7a4353f4a97c \ + --hash=sha256:16cb48f1f2b6b3d8c2732f77d98d8f7f0ab84765abf0c1c82df2c8ea7d8ef2ec \ + --hash=sha256:276a900d4096c246cc236aa00460adb3ab195c37172a9f1087bbde6a127f0780 \ + --hash=sha256:51cadd0373950cfae6aac6823a3d2bf56e34e4efed0abae8c7d15e337d9bb5e6 \ + --hash=sha256:83b73299f36301d943550c609e0a0dff08d21e3674c1369c10df77ce470fd97b \ + --hash=sha256:8695b79462e1f46013993d715485db289cf5a7702aa2d9941ac333564ca20d79 \ + --hash=sha256:8bf16fc56f4abcf3af7d5fb6dab3888f73e3648287c8efe77e14fa1b006a3ef4 \ + --hash=sha256:95c5d778c96ab237837cd6d38e01f0bdca52c64e0d00647a69133a8e7ae4eed4 \ + --hash=sha256:9aaaec73e120ac7add99f53d606aa6d432c8e0337af742b2ca26fb8d17181500 \ + --hash=sha256:aa2d9db1c03e9eb0640a578caf00a6fa2d9399abb7375a970b0f6d6e934b5441 \ + --hash=sha256:d13d3721931d407491d9b3fe161146aa78ab08a8fc9735302abee1d368aedb03 \ + --hash=sha256:d53bde4f939dac9340aa253c2765073de6b8595a29a294503042fcbfec8bd842 \ + --hash=sha256:dba7daeb54615532c11f8fe39bc9514b81215f6f4e91909ec227e06227c286cf \ + --hash=sha256:debf472d3ecd76a3a750b056b99dcb64c119467dc44f0e2d6e6363acb128b96a # via # cryptography # pydantic-core @@ -784,9 +786,9 @@ types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via mypy -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via mypy typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -795,9 +797,9 @@ typing-extensions==4.15.0 \ # exceptiongroup # mypy # setuptools-scm -uv-dynamic-versioning==0.11.2 \ - --hash=sha256:4c785ea02e00b93896d015fd3613c451735af1715a7f5f52e8e4e1d76e6ec3c5 \ - --hash=sha256:563ab4b7a93904eb8fb8fd9f2959dad853d62baa71f3cdb0233acf8a749d512f +uv-dynamic-versioning==0.12.0 \ + --hash=sha256:2d2f1fb806c2e351d0d0a3840aaf7b3c6ce73757080b1ada4ac5dc44f7dd4c9e \ + --hash=sha256:e853e0c5b2425a68005580325d4975a8c37b66015589ca45ef96e660fe0f8f16 # via mcp versioneer==0.29 \ --hash=sha256:0f1a137bb5d6811e96a79bb0486798aeae9b9c6efc24b389659cebb0ee396cb9 \ diff --git a/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt index 26ae4fa6590..1c92409c888 100644 --- a/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt @@ -184,9 +184,9 @@ babel==2.17.0 \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 # via sphinx -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -202,9 +202,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth calver==2025.3.31 \ --hash=sha256:07511edf5e7fa75ae97445c8c5921240e0fe62937289a3ebe6963eddd3c691b6 \ @@ -549,13 +549,13 @@ cython==3.0.12 \ --hash=sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3 \ --hash=sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -635,9 +635,9 @@ exceptiongroup==1.3.1 \ # via # anyio # scikit-build-core -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -645,9 +645,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python flit-core==3.12.0 \ --hash=sha256:18f63100d6f94385c6ed57a72073443e1a71a4acb4339491615d0f16d6ff01b2 \ @@ -805,9 +805,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -826,19 +826,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -848,49 +848,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1023,6 +1022,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1246,9 +1246,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -1278,83 +1278,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1455,9 +1455,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1747,45 +1747,45 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ @@ -1944,9 +1944,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -2120,9 +2120,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -2153,26 +2153,28 @@ protobuf==6.33.2 \ # proto-plus # pymilvus # substrait -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2443,9 +2445,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2800,12 +2802,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2824,7 +2828,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2842,9 +2848,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2852,6 +2858,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -2949,17 +2956,17 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via feast (setup.py) -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2995,9 +3002,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -3085,9 +3092,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt index f3844cb169b..6f38b0c16c6 100644 --- a/sdk/python/requirements/py3.10-requirements.txt +++ b/sdk/python/requirements/py3.10-requirements.txt @@ -20,9 +20,9 @@ attrs==25.4.0 \ # via # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -158,9 +158,9 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) dill==0.3.9 \ --hash=sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a \ @@ -170,9 +170,9 @@ exceptiongroup==1.3.1 \ --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 # via anyio -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via feast (setup.py) fsspec==2025.12.0 \ --hash=sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b \ @@ -239,9 +239,9 @@ idna==3.11 \ # via # anyio # requests -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -255,83 +255,83 @@ jsonschema-specifications==2025.9.1 \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -551,45 +551,45 @@ mmh3==5.2.0 \ --hash=sha256:fdfd3fb739f4e22746e13ad7ba0c6eedf5f454b18d11249724a388868e308ee4 \ --hash=sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110 # via feast (setup.py) -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ @@ -744,26 +744,28 @@ protobuf==6.33.2 \ --hash=sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43 \ --hash=sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4 # via feast (setup.py) -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via feast (setup.py) pyarrow==21.0.0 \ --hash=sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4 \ @@ -1184,12 +1186,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -1208,7 +1212,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -1316,13 +1322,13 @@ typing-inspection==0.4.2 \ --hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 \ --hash=sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464 # via pydantic -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index afc0ff1c64b..091236521ff 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -254,9 +254,9 @@ attrs==25.4.0 \ # jsonlines # jsonschema # referencing -azure-core==1.36.0 \ - --hash=sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7 \ - --hash=sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b +azure-core==1.37.0 \ + --hash=sha256:7064f2c11e4b97f340e8e8c6d923b822978be3016e46b7bc4aa4b337cfb48aee \ + --hash=sha256:b3abe2c59e7d6bb18b38c275a5029ff80f98990e7c90a5e646249a56630fcc19 # via # azure-identity # azure-storage-blob @@ -345,9 +345,9 @@ beautifulsoup4==4.14.3 \ # via # docling # nbconvert -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) bleach[css]==6.3.0 \ --hash=sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22 \ @@ -377,9 +377,9 @@ build==1.3.0 \ # feast (setup.py) # pip-tools # singlestoredb -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth cassandra-driver==3.29.3 \ --hash=sha256:064bf45d3ca87239e11168c0110676fc64f7fdbddb4bcba9be787b8ad5f6d734 \ @@ -786,99 +786,99 @@ couchbase-columnar==1.0.0 \ --hash=sha256:fc0fad2d386c5b5df7aaaccd8751e01caa886cc640cc8c92523dd07c4e7be519 \ --hash=sha256:fc4efa3e15190c3731478006de494b046bc57785e9c8ae99ac8b375a91683e38 # via feast (setup.py) -coverage[toml]==7.13.0 \ - --hash=sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe \ - --hash=sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b \ - --hash=sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070 \ - --hash=sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e \ - --hash=sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053 \ - --hash=sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080 \ - --hash=sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc \ - --hash=sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb \ - --hash=sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf \ - --hash=sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820 \ - --hash=sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b \ - --hash=sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232 \ - --hash=sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657 \ - --hash=sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef \ - --hash=sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd \ - --hash=sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259 \ - --hash=sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833 \ - --hash=sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d \ - --hash=sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f \ - --hash=sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493 \ - --hash=sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8 \ - --hash=sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf \ - --hash=sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9 \ - --hash=sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19 \ - --hash=sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98 \ - --hash=sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f \ - --hash=sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b \ - --hash=sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9 \ - --hash=sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b \ - --hash=sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e \ - --hash=sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc \ - --hash=sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256 \ - --hash=sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8 \ - --hash=sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927 \ - --hash=sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae \ - --hash=sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f \ - --hash=sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe \ - --hash=sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f \ - --hash=sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621 \ - --hash=sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1 \ - --hash=sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137 \ - --hash=sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9 \ - --hash=sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74 \ - --hash=sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46 \ - --hash=sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8 \ - --hash=sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940 \ - --hash=sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39 \ - --hash=sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a \ - --hash=sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d \ - --hash=sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b \ - --hash=sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0 \ - --hash=sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a \ - --hash=sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2 \ - --hash=sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb \ - --hash=sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303 \ - --hash=sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971 \ - --hash=sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030 \ - --hash=sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96 \ - --hash=sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb \ - --hash=sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33 \ - --hash=sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8 \ - --hash=sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904 \ - --hash=sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d \ - --hash=sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28 \ - --hash=sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e \ - --hash=sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e \ - --hash=sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9 \ - --hash=sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74 \ - --hash=sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8 \ - --hash=sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032 \ - --hash=sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57 \ - --hash=sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be \ - --hash=sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936 \ - --hash=sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f \ - --hash=sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c \ - --hash=sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a \ - --hash=sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791 \ - --hash=sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5 \ - --hash=sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e \ - --hash=sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a \ - --hash=sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7 \ - --hash=sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a \ - --hash=sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753 \ - --hash=sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3 \ - --hash=sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6 \ - --hash=sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e \ - --hash=sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071 \ - --hash=sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b \ - --hash=sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511 \ - --hash=sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff \ - --hash=sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7 \ - --hash=sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6 +coverage[toml]==7.13.1 \ + --hash=sha256:0403f647055de2609be776965108447deb8e384fe4a553c119e3ff6bfbab4784 \ + --hash=sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e \ + --hash=sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3 \ + --hash=sha256:0d2c11f3ea4db66b5cbded23b20185c35066892c67d80ec4be4bab257b9ad1e0 \ + --hash=sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79 \ + --hash=sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75 \ + --hash=sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6 \ + --hash=sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f \ + --hash=sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88 \ + --hash=sha256:1dcb645d7e34dcbcc96cd7c132b1fc55c39263ca62eb961c064eb3928997363b \ + --hash=sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573 \ + --hash=sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0 \ + --hash=sha256:309ef5706e95e62578cda256b97f5e097916a2c26247c287bbe74794e7150df2 \ + --hash=sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0 \ + --hash=sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba \ + --hash=sha256:3d42df8201e00384736f0df9be2ced39324c3907607d17d50d50116c989d84cd \ + --hash=sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c \ + --hash=sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673 \ + --hash=sha256:3fc6a169517ca0d7ca6846c3c5392ef2b9e38896f61d615cb75b9e7134d4ee1e \ + --hash=sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee \ + --hash=sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3 \ + --hash=sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e \ + --hash=sha256:549d195116a1ba1e1ae2f5ca143f9777800f6636eab917d4f02b5310d6d73461 \ + --hash=sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6 \ + --hash=sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6 \ + --hash=sha256:5899d28b5276f536fcf840b18b61a9fce23cc3aec1d114c44c07fe94ebeaa500 \ + --hash=sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a \ + --hash=sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9 \ + --hash=sha256:67170979de0dacac3f3097d02b0ad188d8edcea44ccc44aaa0550af49150c7dc \ + --hash=sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5 \ + --hash=sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3 \ + --hash=sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d \ + --hash=sha256:75a6f4aa904301dab8022397a22c0039edc1f51e90b83dbd4464b8a38dc87842 \ + --hash=sha256:77545b5dcda13b70f872c3b5974ac64c21d05e65b1590b441c8560115dc3a0d1 \ + --hash=sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486 \ + --hash=sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29 \ + --hash=sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968 \ + --hash=sha256:868a2fae76dfb06e87291bcbd4dcbcc778a8500510b618d50496e520bd94d9b9 \ + --hash=sha256:8842af7f175078456b8b17f1b73a0d16a65dcbdc653ecefeb00a56b3c8c298c4 \ + --hash=sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c \ + --hash=sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a \ + --hash=sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465 \ + --hash=sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8 \ + --hash=sha256:92f980729e79b5d16d221038dbf2e8f9a9136afa072f9d5d6ed4cb984b126a09 \ + --hash=sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416 \ + --hash=sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894 \ + --hash=sha256:985b7836931d033570b94c94713c6dba5f9d3ff26045f72c3e5dbc5fe3361e5a \ + --hash=sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9 \ + --hash=sha256:9edd0e01a343766add6817bc448408858ba6b489039eaaa2018474e4001651a4 \ + --hash=sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5 \ + --hash=sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f \ + --hash=sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb \ + --hash=sha256:a4d240d260a1aed814790bbe1f10a5ff31ce6c21bc78f0da4a1e8268d6c80dbd \ + --hash=sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae \ + --hash=sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a \ + --hash=sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e \ + --hash=sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564 \ + --hash=sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd \ + --hash=sha256:bb3f6562e89bad0110afbe64e485aac2462efdce6232cdec7862a095dc3412f6 \ + --hash=sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f \ + --hash=sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7 \ + --hash=sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a \ + --hash=sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee \ + --hash=sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62 \ + --hash=sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d \ + --hash=sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef \ + --hash=sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b \ + --hash=sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1 \ + --hash=sha256:cb237bfd0ef4d5eb6a19e29f9e528ac67ac3be932ea6b44fb6cc09b9f3ecff78 \ + --hash=sha256:ccd7a6fca48ca9c131d9b0a2972a581e28b13416fc313fb98b6d24a03ce9a398 \ + --hash=sha256:d10a2ed46386e850bb3de503a54f9fe8192e5917fcbb143bfef653a9355e9a53 \ + --hash=sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d \ + --hash=sha256:d2287ac9360dec3837bfdad969963a5d073a09a85d898bd86bea82aa8876ef3c \ + --hash=sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909 \ + --hash=sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f \ + --hash=sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9 \ + --hash=sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90 \ + --hash=sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851 \ + --hash=sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147 \ + --hash=sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf \ + --hash=sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864 \ + --hash=sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4 \ + --hash=sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf \ + --hash=sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4 \ + --hash=sha256:f80e2bb21bfab56ed7405c2d79d34b5dc0bc96c2c1d2a067b643a09fb756c43a \ + --hash=sha256:f83351e0f7dcdb14d7326c3d8d8c4e915fa685cbfdc6281f9470d97a04e9dfe4 \ + --hash=sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c \ + --hash=sha256:fa3edde1aa8807de1d05934982416cb3ec46d1d4d91e280bcce7cca01c507992 \ + --hash=sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c \ + --hash=sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19 \ + --hash=sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7 \ + --hash=sha256:ffed1e4980889765c84a5d1a566159e363b71d6b6fbaf0bebc9d3c30bc016766 # via pytest-cov cryptography==43.0.3 \ --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \ @@ -923,51 +923,51 @@ cryptography==43.0.3 \ # snowflake-connector-python # types-pyopenssl # types-redis -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) datasets==4.0.0 \ --hash=sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d \ --hash=sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1 # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq -debugpy==1.8.17 \ - --hash=sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1 \ - --hash=sha256:1440fd514e1b815edd5861ca394786f90eb24960eb26d6f7200994333b1d79e3 \ - --hash=sha256:17e456da14848d618662354e1dccfd5e5fb75deec3d1d48dc0aa0baacda55860 \ - --hash=sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc \ - --hash=sha256:3a32c0af575749083d7492dc79f6ab69f21b2d2ad4cd977a958a07d5865316e4 \ - --hash=sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088 \ - --hash=sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670 \ - --hash=sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef \ - --hash=sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf \ - --hash=sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420 \ - --hash=sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464 \ - --hash=sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c \ - --hash=sha256:8deb4e31cd575c9f9370042876e078ca118117c1b5e1f22c32befcfbb6955f0c \ - --hash=sha256:a3aad0537cf4d9c1996434be68c6c9a6d233ac6f76c2a482c7803295b4e4f99a \ - --hash=sha256:b13eea5587e44f27f6c48588b5ad56dcb74a4f3a5f89250443c94587f3eb2ea1 \ - --hash=sha256:b532282ad4eca958b1b2d7dbcb2b7218e02cb934165859b918e3b6ba7772d3f4 \ - --hash=sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f \ - --hash=sha256:b75868b675949a96ab51abc114c7163f40ff0d8f7d6d5fd63f8932fd38e9c6d7 \ - --hash=sha256:bb1bbf92317e1f35afcf3ef0450219efb3afe00be79d8664b250ac0933b9015f \ - --hash=sha256:c41d2ce8bbaddcc0009cc73f65318eedfa3dbc88a8298081deb05389f1ab5542 \ - --hash=sha256:c6bdf134457ae0cac6fb68205776be635d31174eeac9541e1d0c062165c6461f \ - --hash=sha256:d3fce3f0e3de262a3b67e69916d001f3e767661c6e1ee42553009d445d1cd840 \ - --hash=sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83 \ - --hash=sha256:e79a195f9e059edfe5d8bf6f3749b2599452d3e9380484cd261f6b7cd2c7c4da \ - --hash=sha256:e851beb536a427b5df8aa7d0c7835b29a13812f41e46292ff80b2ef77327355a \ - --hash=sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464 \ - --hash=sha256:eaa85bce251feca8e4c87ce3b954aba84b8c645b90f0e6a515c00394a9f5c0e7 \ - --hash=sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d \ - --hash=sha256:f2ac8055a0c4a09b30b931100996ba49ef334c6947e7ae365cdd870416d7513e \ - --hash=sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e +debugpy==1.8.19 \ + --hash=sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b \ + --hash=sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa \ + --hash=sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af \ + --hash=sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62 \ + --hash=sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38 \ + --hash=sha256:4468de0c30012d367944f0eab4ecb8371736e8ef9522a465f61214f344c11183 \ + --hash=sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee \ + --hash=sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d \ + --hash=sha256:76f566baaf7f3e06adbe67ffedccd2ee911d1e486f55931939ce3f0fe1090774 \ + --hash=sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4 \ + --hash=sha256:7b62c0f015120ede25e5124a5f9d8a424e1208e3d96a36c89958f046ee21fff6 \ + --hash=sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488 \ + --hash=sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606 \ + --hash=sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f \ + --hash=sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d \ + --hash=sha256:a21bfdea088f713df05fa246ba0520f6ba44dd7eaec224742f51987a6979a648 \ + --hash=sha256:b1cb98e5325da3059ca24445fca48314bfddfdf65ce1b59ff07055e723f06bd2 \ + --hash=sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976 \ + --hash=sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5 \ + --hash=sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e \ + --hash=sha256:c047177ab2d286451f242b855b650d313198c4a987140d4b35218b2855a64a4a \ + --hash=sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73 \ + --hash=sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b \ + --hash=sha256:c9b9bf440141a36836bdbe4320a2b126bb38aafa85e1aed05d7bfbb0e2a278bf \ + --hash=sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809 \ + --hash=sha256:d9b6f633fd2865af2afba2beb0c1819b6ecd4aed1c8f90f5d1bbca3272306b10 \ + --hash=sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2 \ + --hash=sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de \ + --hash=sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb \ + --hash=sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254 # via ipykernel decorator==5.2.1 \ --hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \ @@ -1009,9 +1009,9 @@ docling==2.27.0 \ --hash=sha256:1288ed75b27e33bf94daff34faffc6d11b7d7ccc13e3df84fb24adad3991f72d \ --hash=sha256:faba35662612a2c687a3a463e501d95f645316436084af92a0442ce162429a3d # via feast (setup.py) -docling-core[chunking]==2.54.1 \ - --hash=sha256:2d22ee1cd8508fa7ffdd2e01ef30d7521390ff55ef240610f16be0cf54ffe73e \ - --hash=sha256:c6595e8b84f5e9de7a0a6298206d749f4be5730824604e684f204078a3689985 +docling-core[chunking]==2.57.0 \ + --hash=sha256:24b71172e8bc4fbe2b4213b29f51878114f4c13f25fc0bc9920168505c76c1a3 \ + --hash=sha256:398768b4d275ad2e11703ad9446fd0315a9a5fc8d09bc45ed207302d844d6ed5 # via # docling # docling-ibm-models @@ -1124,13 +1124,13 @@ durationpy==0.10 \ easyocr==1.7.2 \ --hash=sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c # via docling -elastic-transport==9.2.0 \ - --hash=sha256:0331466ca8febdb7d168c0fbf159294b0066492733b51da94f4dd28a0ee596cd \ - --hash=sha256:f52b961e58e6b76d488993286907f61a6ddccbdae8e0135ce8d369227b6282d8 +elastic-transport==9.2.1 \ + --hash=sha256:39e1a25e486af34ce7aa1bc9005d1c736f1b6fb04c9b64ea0604ded5a61fc1d4 \ + --hash=sha256:97d9abd638ba8aa90faa4ca1bf1a18bde0fe2088fbc8757f2eb7b299f205773d # via elasticsearch -elasticsearch==9.2.0 \ - --hash=sha256:87090fe98c515ec0fce82f633fe11d7e90e04d93581b6b3e05de29efe4cc8b74 \ - --hash=sha256:99656baa34b10130402b6c38429feddf7aee1c3247566e8f95f0d0267fe9f9ab +elasticsearch==9.2.1 \ + --hash=sha256:8665f5a0b4d29a7c2772851c05ea8a09279abb7928b7d727524613bd61d75958 \ + --hash=sha256:97f473418e8976611349757287ac982acf12f4e305182863d985d5a031c36830 # via feast (setup.py) entrypoints==0.4 \ --hash=sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4 \ @@ -1177,9 +1177,9 @@ faiss-cpu==1.10.0 \ --hash=sha256:e71f7e24d5b02d3a51df47b77bd10f394a1b48a8331d5c817e71e9e27a8a75ac \ --hash=sha256:f71c5860c860df2320299f9e4f2ca1725beb559c04acb1cf961ed24e6218277a # via feast (setup.py) -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -1191,9 +1191,9 @@ fastjsonschema==2.21.2 \ --hash=sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 \ --hash=sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de # via nbformat -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via # datasets # huggingface-hub @@ -1371,9 +1371,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-storage # opencensus # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -1392,19 +1392,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -1414,49 +1414,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1543,6 +1542,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1884,9 +1884,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via # dask # opentelemetry-api @@ -1957,9 +1957,9 @@ jmespath==1.0.1 \ # aiobotocore # boto3 # botocore -joblib==1.5.2 \ - --hash=sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55 \ - --hash=sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241 +joblib==1.5.3 \ + --hash=sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 \ + --hash=sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3 # via scikit-learn json5==0.12.1 \ --hash=sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990 \ @@ -2039,9 +2039,9 @@ jupyter-server-terminals==0.5.3 \ --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa \ --hash=sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269 # via jupyter-server -jupyterlab==4.5.0 \ - --hash=sha256:88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a \ - --hash=sha256:aec33d6d8f1225b495ee2cf20f0514f45e6df8e360bdd7ac9bace0b7ac5177ea +jupyterlab==4.5.1 \ + --hash=sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9 \ + --hash=sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514 # via notebook jupyterlab-pygments==0.3.0 \ --hash=sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d \ @@ -2387,9 +2387,9 @@ markupsafe==3.0.3 \ # jinja2 # nbconvert # werkzeug -marshmallow==3.26.1 \ - --hash=sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c \ - --hash=sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6 +marshmallow==3.26.2 \ + --hash=sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73 \ + --hash=sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57 # via great-expectations matplotlib-inline==0.2.1 \ --hash=sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76 \ @@ -2397,9 +2397,9 @@ matplotlib-inline==0.2.1 \ # via # ipykernel # ipython -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -2417,9 +2417,9 @@ minio==7.2.11 \ --hash=sha256:153582ed52ff3b5005ba558e1f25bfe1e9e834f7f0745e594777f28e3e81e1a0 \ --hash=sha256:4db95a21fe1e2022ec975292d8a1f83bd5b18f830d23d42a4518ac7a5281d7c5 # via feast (setup.py) -mistune==3.1.4 \ - --hash=sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d \ - --hash=sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164 +mistune==3.2.0 \ + --hash=sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a \ + --hash=sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1 # via # great-expectations # nbconvert @@ -2842,9 +2842,9 @@ mypy-protobuf==3.3.0 \ --hash=sha256:15604f6943b16c05db646903261e3b3e775cf7f7990b7c37b03d043a907b650d \ --hash=sha256:24f3b0aecb06656e983f58e07c732a90577b9d7af3e1066fc2b663bbf0370248 # via feast (setup.py) -nbclient==0.10.2 \ - --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d \ - --hash=sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193 +nbclient==0.10.4 \ + --hash=sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9 \ + --hash=sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440 # via nbconvert nbconvert==7.16.6 \ --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b \ @@ -2889,13 +2889,13 @@ ninja==1.13.0 \ --hash=sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa \ --hash=sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e # via easyocr -nodeenv==1.9.1 \ - --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ - --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 +nodeenv==1.10.0 \ + --hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 \ + --hash=sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb # via pre-commit -notebook==7.5.0 \ - --hash=sha256:3300262d52905ca271bd50b22617681d95f08a8360d099e097726e6d2efb5811 \ - --hash=sha256:3b27eaf9913033c28dde92d02139414c608992e1df4b969c843219acf2ff95e4 +notebook==7.5.1 \ + --hash=sha256:b2fb4cef4d47d08c33aecce1c6c6e84be05436fbd791f88fce8df9fbca088b75 \ + --hash=sha256:f4e2451c19910c33b88709b84537e11f6368c1cdff1aa0c43db701aea535dd44 # via great-expectations notebook-shim==0.2.4 \ --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef \ @@ -2903,81 +2903,79 @@ notebook-shim==0.2.4 \ # via # jupyterlab # notebook -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # accelerate @@ -3036,30 +3034,30 @@ openshift-client==1.0.18 \ --hash=sha256:be3979440cfd96788146a3a1650dabe939d4d516eea0b39f87e66d2ab39495b1 \ --hash=sha256:d8a84080307ccd9556f6c62a3707a3e6507baedee36fa425754f67db9ded528b # via codeflare-sdk -opentelemetry-api==1.39.0 \ - --hash=sha256:3c3b3ca5c5687b1b5b37e5c5027ff68eacea8675241b29f13110a8ffbb8f0459 \ - --hash=sha256:6130644268c5ac6bdffaf660ce878f10906b3e789f7e2daa5e169b047a2933b9 +opentelemetry-api==1.39.1 \ + --hash=sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950 \ + --hash=sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c # via # opentelemetry-exporter-prometheus # opentelemetry-sdk # opentelemetry-semantic-conventions -opentelemetry-exporter-prometheus==0.60b0 \ - --hash=sha256:4f616397040257fae4c5e5272b57b47c13372e3b7f0f2db2427fd4dbe69c60b5 \ - --hash=sha256:c6ae33e52cdd1dbfed1f7436935df94eb03c725b57322026d04e6fbc37108e6e +opentelemetry-exporter-prometheus==0.60b1 \ + --hash=sha256:49f59178de4f4590e3cef0b8b95cf6e071aae70e1f060566df5546fad773b8fd \ + --hash=sha256:a4011b46906323f71724649d301b4dc188aaa068852e814f4df38cc76eac616b # via ray opentelemetry-proto==1.27.0 \ --hash=sha256:33c9345d91dafd8a74fc3d7576c5a38f18b7fdf8d02983ac67485386132aedd6 \ --hash=sha256:b133873de5581a50063e1e4b29cdcf0c5e253a8c2d8dc1229add20a4c3830ace # via ray -opentelemetry-sdk==1.39.0 \ - --hash=sha256:90cfb07600dfc0d2de26120cebc0c8f27e69bf77cd80ef96645232372709a514 \ - --hash=sha256:c22204f12a0529e07aa4d985f1bca9d6b0e7b29fe7f03e923548ae52e0e15dde +opentelemetry-sdk==1.39.1 \ + --hash=sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c \ + --hash=sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6 # via # opentelemetry-exporter-prometheus # ray -opentelemetry-semantic-conventions==0.60b0 \ - --hash=sha256:069530852691136018087b52688857d97bba61cd641d0f8628d2d92788c4f78a \ - --hash=sha256:227d7aa73cbb8a2e418029d6b6465553aa01cf7e78ec9d0bc3255c7b3ac5bf8f +opentelemetry-semantic-conventions==0.60b1 \ + --hash=sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953 \ + --hash=sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb # via opentelemetry-sdk orjson==3.11.5 \ --hash=sha256:0522003e9f7fba91982e83a97fec0708f5a714c96c4209db7104e6b9d132f111 \ @@ -3593,9 +3591,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -4272,9 +4270,9 @@ pyopenssl==25.1.0 \ --hash=sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab \ --hash=sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b # via snowflake-connector-python -pyparsing==3.2.5 \ - --hash=sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6 \ - --hash=sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e +pyparsing==3.3.1 \ + --hash=sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82 \ + --hash=sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c # via great-expectations pypdfium2==4.30.0 \ --hash=sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e \ @@ -4297,8 +4295,8 @@ pyproject-hooks==1.2.0 \ # via # build # pip-tools -pyspark==4.0.1 \ - --hash=sha256:9d1f22d994f60369228397e3479003ffe2dd736ba79165003246ff7bd48e2c73 +pyspark==4.1.0 \ + --hash=sha256:09c714ada88dfac3e1213c066617c6f473c1e22fbe279855028f77e12434147d # via feast (setup.py) pytest==7.4.4 \ --hash=sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280 \ @@ -4495,9 +4493,9 @@ python-keycloak==4.2.2 \ --hash=sha256:1d43a1accd4a038ed39317fcb3eb78211df6c75bbcbc4c482c99ee76327136f2 \ --hash=sha256:5137fd87c69031a372a578df96bae96b9aead2c9dad976613bc978e9e0246a1e # via feast (setup.py) -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp python-pptx==1.0.2 \ --hash=sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba \ @@ -4702,9 +4700,9 @@ pyzmq==27.1.0 \ # ipykernel # jupyter-client # jupyter-server -qdrant-client==1.16.1 \ - --hash=sha256:1eefe89f66e8a468ba0de1680e28b441e69825cfb62e8fb2e457c15e24ce5e3b \ - --hash=sha256:676c7c10fd4d4cb2981b8fcb32fd764f5f661b04b7334d024034d07212f971fd +qdrant-client==1.16.2 \ + --hash=sha256:442c7ef32ae0f005e88b5d3c0783c63d4912b97ae756eb5e052523be682f17d3 \ + --hash=sha256:ca4ef5f9be7b5eadeec89a085d96d5c723585a391eb8b2be8192919ab63185f0 # via feast (setup.py) ray[data, default]==2.52.1 \ --hash=sha256:08eb8f5fd55292ba6bee363a32491136a5e54af54e007f81e0603986fbea41a4 \ @@ -5061,26 +5059,26 @@ ruamel-yaml==0.17.17 \ --hash=sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be \ --hash=sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f # via great-expectations -ruff==0.14.8 \ - --hash=sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7 \ - --hash=sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344 \ - --hash=sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c \ - --hash=sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e \ - --hash=sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b \ - --hash=sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52 \ - --hash=sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f \ - --hash=sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a \ - --hash=sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed \ - --hash=sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a \ - --hash=sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9 \ - --hash=sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99 \ - --hash=sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097 \ - --hash=sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b \ - --hash=sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2 \ - --hash=sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b \ - --hash=sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb \ - --hash=sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6 \ - --hash=sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf +ruff==0.14.10 \ + --hash=sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6 \ + --hash=sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405 \ + --hash=sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a \ + --hash=sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f \ + --hash=sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154 \ + --hash=sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e \ + --hash=sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f \ + --hash=sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830 \ + --hash=sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f \ + --hash=sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77 \ + --hash=sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f \ + --hash=sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49 \ + --hash=sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4 \ + --hash=sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d \ + --hash=sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935 \ + --hash=sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60 \ + --hash=sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d \ + --hash=sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6 \ + --hash=sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d # via feast (setup.py) s3transfer==0.13.1 \ --hash=sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724 \ @@ -5115,29 +5113,56 @@ safetensors[torch]==0.7.0 \ # docling-ibm-models # timm # transformers -scikit-image==0.25.2 \ - --hash=sha256:24cc986e1f4187a12aa319f777b36008764e856e5013666a4a83f8df083c2641 \ - --hash=sha256:28182a9d3e2ce3c2e251383bdda68f8d88d9fff1a3ebe1eb61206595c9773341 \ - --hash=sha256:330d061bd107d12f8d68f1d611ae27b3b813b8cdb0300a71d07b1379178dd4cd \ - --hash=sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed \ - --hash=sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063 \ - --hash=sha256:60516257c5a2d2f74387c502aa2f15a0ef3498fbeaa749f730ab18f0a40fd054 \ - --hash=sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f \ - --hash=sha256:7efa888130f6c548ec0439b1a7ed7295bc10105458a421e9bf739b457730b6da \ - --hash=sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb \ - --hash=sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d \ - --hash=sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824 \ - --hash=sha256:a4c464b90e978d137330be433df4e76d92ad3c5f46a22f159520ce0fdbea8a09 \ - --hash=sha256:b2cfc96b27afe9a05bc92f8c6235321d3a66499995675b27415e0d0c76625173 \ - --hash=sha256:b4f6b61fc2db6340696afe3db6b26e0356911529f5f6aee8c322aa5157490c9b \ - --hash=sha256:b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147 \ - --hash=sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2 \ - --hash=sha256:be455aa7039a6afa54e84f9e38293733a2622b8c2fb3362b822d459cc5605e99 \ - --hash=sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78 \ - --hash=sha256:d989d64ff92e0c6c0f2018c7495a5b20e2451839299a018e0e5108b2680f71e0 \ - --hash=sha256:dd8011efe69c3641920614d550f5505f83658fe33581e49bed86feab43a180fc \ - --hash=sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde \ - --hash=sha256:f4bac9196fb80d37567316581c6060763b0f4893d3aca34a9ede3825bc035b17 +scikit-image==0.26.0 \ + --hash=sha256:0608aa4a9ec39e0843de10d60edb2785a30c1c47819b67866dd223ebd149acaf \ + --hash=sha256:0660b83968c15293fd9135e8d860053ee19500d52bf55ca4fb09de595a1af650 \ + --hash=sha256:09bad6a5d5949c7896c8347424c4cca899f1d11668030e5548813ab9c2865dcb \ + --hash=sha256:0baa0108d2d027f34d748e84e592b78acc23e965a5de0e4bb03cf371de5c0581 \ + --hash=sha256:163e9afb5b879562b9aeda0dd45208a35316f26cc7a3aed54fd601604e5cf46f \ + --hash=sha256:20ef4a155e2e78b8ab973998e04d8a361d49d719e65412405f4dadd9155a61d9 \ + --hash=sha256:21a818ee6ca2f2131b9e04d8eb7637b5c18773ebe7b399ad23dcc5afaa226d2d \ + --hash=sha256:27d58bc8b2acd351f972c6508c1b557cfed80299826080a4d803dd29c51b707e \ + --hash=sha256:2c1e7bd342f43e7a97e571b3f03ba4c1293ea1a35c3f13f41efdc8a81c1dc8f2 \ + --hash=sha256:3268f13310e6857508bd87202620df996199a016a1d281b309441d227c822394 \ + --hash=sha256:3409e89d66eff5734cd2b672d1c48d2759360057e714e1d92a11df82c87cba37 \ + --hash=sha256:3f5bf622d7c0435884e1e141ebbe4b2804e16b2dd23ae4c6183e2ea99233be70 \ + --hash=sha256:4c717490cec9e276afb0438dd165b7c3072d6c416709cc0f9f5a4c1070d23a44 \ + --hash=sha256:4d57e39ef67a95d26860c8caf9b14b8fb130f83b34c6656a77f191fa6d1d04d8 \ + --hash=sha256:52c496f75a7e45844d951557f13c08c81487c6a1da2e3c9c8a39fcde958e02cc \ + --hash=sha256:6381edf972b32e4f54085449afde64365a57316637496c1325a736987083e2ab \ + --hash=sha256:63af3d3a26125f796f01052052f86806da5b5e54c6abef152edb752683075a9c \ + --hash=sha256:6caec76e16c970c528d15d1c757363334d5cb3069f9cea93d2bead31820511f3 \ + --hash=sha256:724f79fd9b6cb6f4a37864fe09f81f9f5d5b9646b6868109e1b100d1a7019e59 \ + --hash=sha256:74aa5518ccea28121f57a95374581d3b979839adc25bb03f289b1bc9b99c58af \ + --hash=sha256:7af7aa331c6846bd03fa28b164c18d0c3fd419dbb888fb05e958ac4257a78fdd \ + --hash=sha256:7df650e79031634ac90b11e64a9eedaf5a5e06fcd09bcd03a34be01745744466 \ + --hash=sha256:915bb3ba66455cf8adac00dc8fdf18a4cd29656aec7ddd38cb4dda90289a6f21 \ + --hash=sha256:92242351bccf391fc5df2d1529d15470019496d2498d615beb68da85fe7fdf37 \ + --hash=sha256:9490360c8d3f9a7e85c8de87daf7c0c66507960cf4947bb9610d1751928721c7 \ + --hash=sha256:98329aab3bc87db352b9887f64ce8cdb8e75f7c2daa19927f2e121b797b678d5 \ + --hash=sha256:9ea6207d9e9d21c3f464efe733121c0504e494dbdc7728649ff3e23c3c5a4953 \ + --hash=sha256:9eefb4adad066da408a7601c4c24b07af3b472d90e08c3e7483d4e9e829d8c49 \ + --hash=sha256:a07200fe09b9d99fcdab959859fe0f7db8df6333d6204344425d476850ce3604 \ + --hash=sha256:a2d211bc355f59725efdcae699b93b30348a19416cc9e017f7b2fb599faf7219 \ + --hash=sha256:a2e852eccf41d2d322b8e60144e124802873a92b8d43a6f96331aa42888491c7 \ + --hash=sha256:abed017474593cd3056ae0fe948d07d0747b27a085e92df5474f4955dd65aec0 \ + --hash=sha256:ac529eb9dbd5954f9aaa2e3fe9a3fd9661bfe24e134c688587d811a0233127f1 \ + --hash=sha256:aeb14db1ed09ad4bee4ceb9e635547a8d5f3549be67fc6c768c7f923e027e6cd \ + --hash=sha256:b1ede33a0fb3731457eaf53af6361e73dd510f449dac437ab54573b26788baf0 \ + --hash=sha256:b36ab5e778bf50af5ff386c3ac508027dc3aaeccf2161bdf96bde6848f44d21b \ + --hash=sha256:b702c3bb115e1dcf4abf5297429b5c90f2189655888cbed14921f3d26f81d3a4 \ + --hash=sha256:b8d14d3181c21c11170477a42542c1addc7072a90b986675a71266ad17abc37f \ + --hash=sha256:c6624a76c6085218248154cc7e1500e6b488edcd9499004dd0d35040607d7505 \ + --hash=sha256:c9087cf7d0e7f33ab5c46d2068d86d785e70b05400a891f73a13400f1e1faf6a \ + --hash=sha256:cde0bbd57e6795eba83cb10f71a677f7239271121dc950bc060482834a668ad1 \ + --hash=sha256:ce00600cd70d4562ed59f80523e18cdcc1fae0e10676498a01f73c255774aefd \ + --hash=sha256:cefd85033e66d4ea35b525bb0937d7f42d4cdcfed2d1888e1570d5ce450d3932 \ + --hash=sha256:d454b93a6fa770ac5ae2d33570f8e7a321bb80d29511ce4b6b78058ebe176e8c \ + --hash=sha256:d5c244656de905e195a904e36dbc18585e06ecf67d90f0482cbde63d7f9ad59d \ + --hash=sha256:ede4d6d255cc5da9faeb2f9ba7fedbc990abbc652db429f40a16b22e770bb578 \ + --hash=sha256:f5f970ab04efad85c24714321fcc91613fcb64ef2a892a13167df2f3e59199fa \ + --hash=sha256:f775f0e420faac9c2aa6757135f4eb468fb7b70e0b67fa77a5e79be3c30ee331 \ + --hash=sha256:fac96a1f9b06cd771cbbb3cd96c5332f36d4efd839b1d8b053f79e5887acde62 # via easyocr scikit-learn==1.8.0 \ --hash=sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2 \ @@ -5398,9 +5423,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via snowflake-connector-python -soupsieve==2.8 \ - --hash=sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c \ - --hash=sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f +soupsieve==2.8.1 \ + --hash=sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350 \ + --hash=sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434 # via beautifulsoup4 sphinx==6.2.1 \ --hash=sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b \ @@ -5442,12 +5467,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -5466,7 +5493,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -5560,9 +5589,9 @@ sqlparams==6.2.0 \ --hash=sha256:3744a2ad16f71293db6505b21fd5229b4757489a9b09f3553656a1ae97ba7ca5 \ --hash=sha256:63b32ed9051bdc52e7e8b38bc4f78aed51796cdd9135e730f4c6a7db1048dedf # via singlestoredb -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp stack-data==0.6.3 \ --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ @@ -5574,6 +5603,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -5672,9 +5702,9 @@ thriftpy2==0.5.3 \ --hash=sha256:fd4c6131ca6e919f03263cc83b713f1797bc20126a858da8518ed49b3e32c334 \ --hash=sha256:fdc5676b52fa6a3009d205360eb9ba257b8b4813883ed52797a20838bcc45dde # via happybase -tifffile==2025.10.16 \ - --hash=sha256:41463d979c1c262b0a5cdef2a7f95f0388a072ad82d899458b154a48609d759c \ - --hash=sha256:425179ec7837ac0e07bc95d2ea5bea9b179ce854967c12ba07fc3f093e58efc1 +tifffile==2025.12.20 \ + --hash=sha256:bc0345a20675149353cfcb3f1c48d0a3654231ee26bd46beebaab4d2168feeb6 \ + --hash=sha256:cb8a4fee327d15b3e3eeac80bbdd8a53b323c80473330bcfb99418ee4c1c827f # via scikit-image timm==1.0.22 \ --hash=sha256:14fd74bcc17db3856b1a47d26fb305576c98579ab9d02b36714a5e6b25cde422 \ @@ -5836,19 +5866,19 @@ torchvision==0.24.1 \ # docling-ibm-models # easyocr # timm -tornado==6.5.2 \ - --hash=sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c \ - --hash=sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6 \ - --hash=sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef \ - --hash=sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4 \ - --hash=sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0 \ - --hash=sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e \ - --hash=sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882 \ - --hash=sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04 \ - --hash=sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0 \ - --hash=sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af \ - --hash=sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f \ - --hash=sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108 +tornado==6.5.4 \ + --hash=sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1 \ + --hash=sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1 \ + --hash=sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843 \ + --hash=sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335 \ + --hash=sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8 \ + --hash=sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f \ + --hash=sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84 \ + --hash=sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7 \ + --hash=sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17 \ + --hash=sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9 \ + --hash=sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f \ + --hash=sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc # via # ipykernel # jupyter-client @@ -6008,9 +6038,9 @@ types-protobuf==3.19.22 \ # via # feast (setup.py) # mypy-protobuf -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) types-pyopenssl==24.1.0.20240722 \ --hash=sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39 \ @@ -6036,9 +6066,9 @@ types-requests==2.30.0.0 \ --hash=sha256:c6cf08e120ca9f0dc4fa4e32c3f953c3fba222bcc1db6b97695bce8da1ba9864 \ --hash=sha256:dec781054324a70ba64430ae9e62e7e9c8e4618c185a5cb3f87a6738251b5a31 # via feast (setup.py) -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via # feast (setup.py) # types-cffi @@ -6097,9 +6127,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via # arrow # pandas @@ -6199,9 +6229,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.11-minimal-requirements.txt b/sdk/python/requirements/py3.11-minimal-requirements.txt index eafab51c27d..93613cb6e50 100644 --- a/sdk/python/requirements/py3.11-minimal-requirements.txt +++ b/sdk/python/requirements/py3.11-minimal-requirements.txt @@ -174,9 +174,9 @@ attrs==25.4.0 \ # aiohttp # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -192,9 +192,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -469,13 +469,13 @@ cryptography==46.0.0 \ # pyjwt # pyopenssl # snowflake-connector-python -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -541,9 +541,9 @@ durationpy==0.10 \ --hash=sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba \ --hash=sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286 # via kubernetes -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -551,9 +551,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python frozenlist==1.8.0 \ --hash=sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686 \ @@ -707,9 +707,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -728,19 +728,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -750,49 +750,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -875,6 +874,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1073,9 +1073,9 @@ idna==3.11 \ # requests # snowflake-connector-python # yarl -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -1102,83 +1102,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1279,9 +1279,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1569,125 +1569,123 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -1778,9 +1776,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -1928,9 +1926,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -1960,26 +1958,28 @@ protobuf==6.33.2 \ # grpcio-status # proto-plus # pymilvus -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2241,9 +2241,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2555,12 +2555,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2579,7 +2581,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2597,9 +2601,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2607,6 +2611,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette tabulate==0.9.0 \ --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f @@ -2684,13 +2689,13 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2721,9 +2726,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -2811,9 +2816,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt b/sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt index 08b3ebd9c79..beaafd3e5fd 100644 --- a/sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt +++ b/sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt @@ -97,7 +97,9 @@ cffi==2.0.0 \ coherent-licensed==0.5.2 \ --hash=sha256:d8071403ce742d3ac3592ddc4fb7057a46caffb415b928b4d52802e5f208416d \ --hash=sha256:edccc5193ca2786f8fb3f0c7374637a143985f781f7eaa21aca3af2bd634b82f - # via zipp + # via + # importlib-metadata + # zipp cython==3.0.12 \ --hash=sha256:0038c9bae46c459669390e53a1ec115f8096b2e4647ae007ff1bf4e6dee92806 \ --hash=sha256:0faa5e39e5c8cdf6f9c3b1c3f24972826e45911e7f5b99cf99453fca5432f45e \ @@ -170,46 +172,46 @@ cython==3.0.12 \ # pyyaml # snowflake-connector-python # sqlalchemy -cython==3.2.2 \ - --hash=sha256:034ab96cb8bc8e7432bc27491f8d66f51e435b1eb21ddc03aa844be8f21ad847 \ - --hash=sha256:098590c1dc309f8a0406ade031963a95a87714296b425539f9920aebf924560d \ - --hash=sha256:0e35ff0f1bb3a7a5c40afb8fb540e4178b6551909f10748bf39d323f8140ccf3 \ - --hash=sha256:13b99ecb9482aff6a6c12d1ca6feef6940c507af909914b49f568de74fa965fb \ - --hash=sha256:14432d7f207245a3c35556155873f494784169297b28978a6204f1c60d31553e \ - --hash=sha256:177faf4d61e9f2d4d2db61194ac9ec16d3fe3041c1b6830f871a01935319eeb3 \ - --hash=sha256:2b910b89a2a71004064c5e890b9512a251eda63fae252caa0feb9835057035f9 \ - --hash=sha256:3de43a5786033a27fae1c882feb5ff0d023c38b83356e6800c1be0bcd6cf9f11 \ - --hash=sha256:436eb562d0affbc0b959f62f3f9c1ed251b9499e4f29c1d19514ae859894b6bf \ - --hash=sha256:50bbaabee733fd2780985e459fc20f655e02def83e8eff10220ad88455a34622 \ - --hash=sha256:5f818d40bbcf17e2089e2de7840f0de1c0ca527acf9b044aba79d5f5d8a5bdba \ - --hash=sha256:60f4aa425e1ff98abf8d965ae7020f06dd2cbc01dbd945137d2f9cca4ff0524a \ - --hash=sha256:692a41c8fe06fb2dc55ca2c8d71c80c469fd16fe69486ed99f3b3cbb2d3af83f \ - --hash=sha256:820c4a99dbf6b3e6c0300be42b4040b501eff0e1feeb80cfa52c48a346fb0df2 \ - --hash=sha256:826cad0ad43ab05a26e873b5d625f64d458dc739ec6fdeecab848b60a91c4252 \ - --hash=sha256:86b1d39a1ea974dd16fe3bcef0df7b64dadd0bd38d05a339f287b48d37cb109f \ - --hash=sha256:8c9265b3e84ae2d999b7c3165c683e366bbbbbe4346468055ca2366fe013f2df \ - --hash=sha256:8db28aef793c81dc69383b619ca508668998aaf099cd839d3cbae85184cce744 \ - --hash=sha256:8e72ee88a9a5381d30a6da116a3c8352730b9b038a49ed9bc5c3d0ed6d69b06c \ - --hash=sha256:9cd2ede6af225499ad22888dbfb13b92d71fc1016f401ee637559a5831b177c2 \ - --hash=sha256:a3898c076e9c458bcb3e4936187919fda5f5365fe4c567d35d2b003444b6f3fe \ - --hash=sha256:a473df474ba89e9fee81ee82b31062a267f9e598096b222783477e56d02ad12c \ - --hash=sha256:a6387e3ad31342443916db9a419509935fddd8d4cbac34aab9c895ae55326a56 \ - --hash=sha256:a9509f1e9c41c86b790cff745bb31927bbc861662a3b462596d71d3d2a578abb \ - --hash=sha256:aa24cd0bdab27ca099b2467806c684404add597c1108e07ddf7b6471653c85d7 \ - --hash=sha256:aff11412ed5fc78bd8b148621f4d1034fcad6cfcba468c20cd9f327b4f61ec3e \ - --hash=sha256:b223c1f84c3420c24f6a4858e979524bd35a79437a5839e29d41201c87ed119d \ - --hash=sha256:b4df52101209817fde7284cf779156f79142fb639b1d7840f11680ff4bb30604 \ - --hash=sha256:b4fe499eed7cd70b2aa4e096b9ce2588f5e6fdf049b46d40a5e55efcde6e4904 \ - --hash=sha256:b5afac4e77e71a9010dc7fd3191ced00f9b12b494dd7525c140781054ce63a73 \ - --hash=sha256:c3add3d483acc73129a61d105389344d792c17e7c1cee24863f16416bd071634 \ - --hash=sha256:ca18d9d53c0e2f0c9347478b37532b46e0dc34c704e052ab1b0d8b21a290fc0f \ - --hash=sha256:d140c2701cbb8cf960300cf1b67f3b4fa9d294d32e51b85f329bff56936a82fd \ - --hash=sha256:d7b3447b2005dffc5f276d420a480d2b57d15091242652d410b6a46fb00ed251 \ - --hash=sha256:d8c93fe128b58942832b1fcac96e48f93c2c69b569eff0d38d30fb5995fecfa0 \ - --hash=sha256:e7200309b81f4066cf36a96efeec646716ca74afd73d159045169263db891133 \ - --hash=sha256:f560ff3aea5b5df93853ec7bf1a1e9623d6d511f4192f197559aca18fca43392 \ - --hash=sha256:fed44d0ab2d36f1b0301c770b0dafec23bcb9700d58e7769cd6d9136b3304c11 \ - --hash=sha256:ff07e784ea748225bbdea07fec0ac451379e9e41a0a84cb57b36db19dd01ae71 +cython==3.2.3 \ + --hash=sha256:0145e64485f0a9741c9314ae176282dffeb48d2ef30ae315d7224698867c317f \ + --hash=sha256:06a1317097f540d3bb6c7b81ed58a0d8b9dbfa97abf39dfd4c22ee87a6c7241e \ + --hash=sha256:0a75a04688875b275a6c875565e672325bae04327dd6ec2fc25aeb5c6cf82fce \ + --hash=sha256:1309bdce06f767e8514377f44b3a5b9e5b91e58af1348010cca10b572e1852ad \ + --hash=sha256:18b5e738c9dbb1cb488b51e35c3a1b9aa7363166cce40158fe6ccb454f6498ac \ + --hash=sha256:18edc858e6a52de47fe03ffa97ea14dadf450e20069de0a8aef531006c4bbd93 \ + --hash=sha256:1d097ad4686b58b8c03d760d08eca28f79878d404ef7452c49636170571654e0 \ + --hash=sha256:228f11be8406015d1ce84a25bf4f96167ff6fc18b834deca5716d95ae15a818c \ + --hash=sha256:22a624290c2883387b2c2cfb5224c15bff21432c6a2cf0c23ac8df3dcbd45e96 \ + --hash=sha256:25732f3981a93407826297f4423206e5e22c3cfccfc74e37bf444453bbdc076f \ + --hash=sha256:26404441f733fd1cfb0dd9c45477f501437e7d51fad05bb402bd2feb4e127aa3 \ + --hash=sha256:283262b8f902323ceb6ed3b643f275a2a963e7ab059f0714a467933383cbc56d \ + --hash=sha256:2a18f2e3bcd018416157d0a83446e29b4a31437ab79061fe5504c077e70389d0 \ + --hash=sha256:3141734fb15f8b5e9402b9240f8da8336edecae91742b41c85678c31ab68f66d \ + --hash=sha256:3829f99d611412288f44ff543e9d2b5c0c83274998b2a6680bbe5cca3539c1fd \ + --hash=sha256:4f40efa83c93060a271046930d2322ec045abb9722d25a377702cb57aa823c2b \ + --hash=sha256:51fd1a56d0fc682c05ecc44f11927dbe28dd2867c30148557b62d7d1017a13d8 \ + --hash=sha256:55c0157a5940fbf0b054508207fe0fc5cc796d0532af492c0fa35b5b41a883f7 \ + --hash=sha256:60d19376252722241a3d3ec8a695c5cae4deb053486d2e5f9a40cb569a0cf984 \ + --hash=sha256:6b01b36c9eb1b68c25bddbeef7379f7bfc37f7c9afc044e71840ffab761a2dd0 \ + --hash=sha256:6b6dd6b7aca8447b2a6779b314cc402f1e4990754507a88477e535b3c8b41ad1 \ + --hash=sha256:73afc824896ffaf22bf8122d0a7107f0120e3188a353bdcfa92317fc0d9a87ce \ + --hash=sha256:74f482da8b605c61b4df6ff716d013f20131949cb2fa59b03e63abd36ef5bac0 \ + --hash=sha256:80f20369d7aaf4e76cfef902025256918a5cc6eb0aed6d8783e4b1c563e4f6c4 \ + --hash=sha256:84330e7c8bf220a82b633678b9f99e10227c8f4c406d67c5552449ab2afedef8 \ + --hash=sha256:9a24cc653fad3adbd9cbaa638d80df3aa08a1fe27f62eb35850971c70be680df \ + --hash=sha256:9aa1a8abf3d8bb53cc19cfaa21c004afad8d4ccb17513f8aa11a788d1f525abd \ + --hash=sha256:9c5ac7201d8382c0da69e4a119c14be6acd7c286615a0383ffbd1dbfdbaa3df7 \ + --hash=sha256:b39dff92db70cbd95528f3b81d70e06bd6d3fc9c1dd91321e4d3b999ece3bceb \ + --hash=sha256:c041f7e338cca2422e0924716b04fabeda57636214324fc1941396acce99e7c7 \ + --hash=sha256:c102388cf7604ff5647164d5041fd5de2393198a87883fdb50f6c078fc2f4f8e \ + --hash=sha256:c2365a0c79ab9c0fa86d30a4a6ba7e37fc1be9537c48b79b9d63ee7e08bf2fef \ + --hash=sha256:cf210228c15b5c625824d8e31d43b6fea25f9e13c81dac632f2f7d838e0229a5 \ + --hash=sha256:d1f8700ba89c977438744f083890d87187f15709507a5489e0f6d682053b7fa0 \ + --hash=sha256:e31f52ea7e35463b21410f150006eb07b663a0b3ceea8ee8f35e0b8e02b75f50 \ + --hash=sha256:e4293f1861480b397809a6f021a6c12e15e918feae1c7add80c99d07af206578 \ + --hash=sha256:f13832412d633376ffc08d751cc18ed0d7d00a398a4065e2871db505258748a6 \ + --hash=sha256:f5bf0cebeb4147e172a114437d3fce5a507595d8fdd821be792b1bb25c691514 \ + --hash=sha256:fabe2f37acb63a5521d16193effb15acd082e35458f30f1c1f3e506271fee8a7 # via uvloop dunamai==1.25.0 \ --hash=sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab \ @@ -326,83 +328,83 @@ jinja2==3.1.6 \ # via # poetry-dynamic-versioning # uv-dynamic-versioning -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy markupsafe==3.0.3 \ --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ @@ -495,21 +497,21 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -maturin==1.10.2 \ - --hash=sha256:04df81ee295dcda37828bd025a4ac688ea856e3946e4cb300a8f44a448de0069 \ - --hash=sha256:07a82864352feeaf2167247c8206937ef6c6ae9533025d416b7004ade0ea601d \ - --hash=sha256:11c73815f21a755d2129c410e6cb19dbfacbc0155bfc46c706b69930c2eb794b \ - --hash=sha256:259292563da89850bf8f7d37aa4ddba22905214c1e180b1c8f55505dfd8c0e81 \ - --hash=sha256:7fbd997c5347649ee7987bd05a92bd5b8b07efa4ac3f8bcbf6196e07eb573d89 \ - --hash=sha256:96e1d391e4c1fa87edf2a37e4d53d5f2e5f39dd880b9d8306ac9f8eb212d23f8 \ - --hash=sha256:a217aa7c42aa332fb8e8377eb07314e1f02cf0fe036f614aca4575121952addd \ - --hash=sha256:a41ec70d99e27c05377be90f8e3c3def2a7bae4d0d9d5ea874aaf2d1da625d5c \ - --hash=sha256:a4c29a770ea2c76082e0afc6d4efd8ee94405588bfae00d10828f72e206c739b \ - --hash=sha256:da031771d9fb6ddb1d373638ec2556feee29e4507365cd5749a2d354bcadd818 \ - --hash=sha256:da777766fd584440dc9fecd30059a94f85e4983f58b09e438ae38ee4b494024c \ - --hash=sha256:e3ce9b2ad4fb9c341f450a6d32dc3edb409a2d582a81bc46ba55f6e3b6196b22 \ - --hash=sha256:efcd496a3202ffe0d0489df1f83d08b91399782fb2dd545d5a1e7bf6fd81af39 \ - --hash=sha256:f0d1b7b5f73c8d30a7e71cd2a2189a7f0126a3a3cd8b3d6843e7e1d4db50f759 +maturin==1.11.0 \ + --hash=sha256:0fbe565ede0901de7743cd028ad6c13be623b1c7158641f8a50d7a4353f4a97c \ + --hash=sha256:16cb48f1f2b6b3d8c2732f77d98d8f7f0ab84765abf0c1c82df2c8ea7d8ef2ec \ + --hash=sha256:276a900d4096c246cc236aa00460adb3ab195c37172a9f1087bbde6a127f0780 \ + --hash=sha256:51cadd0373950cfae6aac6823a3d2bf56e34e4efed0abae8c7d15e337d9bb5e6 \ + --hash=sha256:83b73299f36301d943550c609e0a0dff08d21e3674c1369c10df77ce470fd97b \ + --hash=sha256:8695b79462e1f46013993d715485db289cf5a7702aa2d9941ac333564ca20d79 \ + --hash=sha256:8bf16fc56f4abcf3af7d5fb6dab3888f73e3648287c8efe77e14fa1b006a3ef4 \ + --hash=sha256:95c5d778c96ab237837cd6d38e01f0bdca52c64e0d00647a69133a8e7ae4eed4 \ + --hash=sha256:9aaaec73e120ac7add99f53d606aa6d432c8e0337af742b2ca26fb8d17181500 \ + --hash=sha256:aa2d9db1c03e9eb0640a578caf00a6fa2d9399abb7375a970b0f6d6e934b5441 \ + --hash=sha256:d13d3721931d407491d9b3fe161146aa78ab08a8fc9735302abee1d368aedb03 \ + --hash=sha256:d53bde4f939dac9340aa253c2765073de6b8595a29a294503042fcbfec8bd842 \ + --hash=sha256:dba7daeb54615532c11f8fe39bc9514b81215f6f4e91909ec227e06227c286cf \ + --hash=sha256:debf472d3ecd76a3a750b056b99dcb64c119467dc44f0e2d6e6363acb128b96a # via # cryptography # pydantic-core @@ -518,9 +520,11 @@ maturin==1.10.2 \ meson-python==0.15.0 \ --hash=sha256:3ae38253ff02b2e947a05e362a2eaf5a9a09d133c5666b4123399ee5fbf2e591 \ --hash=sha256:fddb73eecd49e89c1c41c87937cd89c2d0b65a1c63ba28238681d4bd9484d26f - # via - # numpy - # pandas + # via pandas +meson-python==0.18.0 \ + --hash=sha256:3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 \ + --hash=sha256:c56a99ec9df669a40662fe46960321af6e4b14106c14db228709c1628e23848d + # via numpy meson==1.7.1 \ --hash=sha256:155780a5be87f6dd7f427ad8bcbf0f2b2c5f62ee5fdacca7caa9de8439a24b89 \ --hash=sha256:6d9cbc9ce87a70243c75e4cc668ee3f206ab50b184beb0a08ece948112f19bd7 @@ -531,81 +535,79 @@ mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # pandas # pyarrow @@ -615,6 +617,7 @@ packaging==24.2 \ # via # dunamai # hatchling + # meson-python # pyproject-metadata # scikit-build-core # setuptools-scm @@ -776,9 +779,9 @@ types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via mypy -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via mypy typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -786,9 +789,9 @@ typing-extensions==4.15.0 \ # via # mypy # setuptools-scm -uv-dynamic-versioning==0.11.2 \ - --hash=sha256:4c785ea02e00b93896d015fd3613c451735af1715a7f5f52e8e4e1d76e6ec3c5 \ - --hash=sha256:563ab4b7a93904eb8fb8fd9f2959dad853d62baa71f3cdb0233acf8a749d512f +uv-dynamic-versioning==0.12.0 \ + --hash=sha256:2d2f1fb806c2e351d0d0a3840aaf7b3c6ce73757080b1ada4ac5dc44f7dd4c9e \ + --hash=sha256:e853e0c5b2425a68005580325d4975a8c37b66015589ca45ef96e660fe0f8f16 # via mcp versioneer==0.29 \ --hash=sha256:0f1a137bb5d6811e96a79bb0486798aeae9b9c6efc24b389659cebb0ee396cb9 \ diff --git a/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt index 9ff17ded290..3fb8dbf6562 100644 --- a/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt @@ -182,9 +182,9 @@ babel==2.17.0 \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 # via sphinx -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -200,9 +200,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth calver==2025.3.31 \ --hash=sha256:07511edf5e7fa75ae97445c8c5921240e0fe62937289a3ebe6963eddd3c691b6 \ @@ -547,13 +547,13 @@ cython==3.0.12 \ --hash=sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3 \ --hash=sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -561,9 +561,9 @@ dill==0.3.9 \ --hash=sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a \ --hash=sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c # via feast (setup.py) -docutils==0.22.3 \ - --hash=sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd \ - --hash=sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb +docutils==0.22.4 \ + --hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968 \ + --hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de # via sphinx duckdb==1.1.3 \ --hash=sha256:00cca22df96aa3473fe4584f84888e2cf1c516e8c2dd837210daec44eadba586 \ @@ -627,9 +627,9 @@ durationpy==0.10 \ --hash=sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba \ --hash=sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286 # via kubernetes -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -637,9 +637,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python flit-core==3.12.0 \ --hash=sha256:18f63100d6f94385c6ed57a72073443e1a71a4acb4339491615d0f16d6ff01b2 \ @@ -797,9 +797,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -818,19 +818,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -840,49 +840,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1015,6 +1014,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1238,9 +1238,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -1270,83 +1270,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1447,9 +1447,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1739,125 +1739,123 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -1955,9 +1953,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -2131,9 +2129,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -2164,26 +2162,28 @@ protobuf==6.33.2 \ # proto-plus # pymilvus # substrait -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2454,9 +2454,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2581,9 +2581,9 @@ rich==13.9.4 \ # fastapi-mcp # ibis-framework # typer -roman-numerals==3.1.0 \ - --hash=sha256:384e36fc1e8d4bd361bdb3672841faae7a345b3f708aae9895d074c878332551 \ - --hash=sha256:842ae5fd12912d62720c9aad8cab706e8c692556d01a38443e051ee6cc158d90 +roman-numerals==4.1.0 \ + --hash=sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2 \ + --hash=sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7 # via sphinx rpds-py==0.30.0 \ --hash=sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f \ @@ -2815,12 +2815,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2839,7 +2841,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2857,9 +2861,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2867,6 +2871,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -2956,17 +2961,17 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via feast (setup.py) -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2997,9 +3002,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -3087,9 +3092,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.11-requirements.txt b/sdk/python/requirements/py3.11-requirements.txt index 0bdcae16825..8253a7a0800 100644 --- a/sdk/python/requirements/py3.11-requirements.txt +++ b/sdk/python/requirements/py3.11-requirements.txt @@ -20,9 +20,9 @@ attrs==25.4.0 \ # via # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -158,17 +158,17 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) dill==0.3.9 \ --hash=sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a \ --hash=sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c # via feast (setup.py) -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via feast (setup.py) fsspec==2025.12.0 \ --hash=sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b \ @@ -235,9 +235,9 @@ idna==3.11 \ # via # anyio # requests -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via dask jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ @@ -251,83 +251,83 @@ jsonschema-specifications==2025.9.1 \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -547,125 +547,123 @@ mmh3==5.2.0 \ --hash=sha256:fdfd3fb739f4e22746e13ad7ba0c6eedf5f454b18d11249724a388868e308ee4 \ --hash=sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110 # via feast (setup.py) -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -759,26 +757,28 @@ protobuf==6.33.2 \ --hash=sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43 \ --hash=sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4 # via feast (setup.py) -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via feast (setup.py) pyarrow==21.0.0 \ --hash=sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4 \ @@ -1199,12 +1199,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -1223,7 +1225,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -1285,13 +1289,13 @@ typing-inspection==0.4.2 \ --hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 \ --hash=sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464 # via pydantic -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ diff --git a/sdk/python/requirements/py3.12-ci-requirements.txt b/sdk/python/requirements/py3.12-ci-requirements.txt index ee0d183d79f..50efe8231a9 100644 --- a/sdk/python/requirements/py3.12-ci-requirements.txt +++ b/sdk/python/requirements/py3.12-ci-requirements.txt @@ -250,9 +250,9 @@ attrs==25.4.0 \ # jsonlines # jsonschema # referencing -azure-core==1.36.0 \ - --hash=sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7 \ - --hash=sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b +azure-core==1.37.0 \ + --hash=sha256:7064f2c11e4b97f340e8e8c6d923b822978be3016e46b7bc4aa4b337cfb48aee \ + --hash=sha256:b3abe2c59e7d6bb18b38c275a5029ff80f98990e7c90a5e646249a56630fcc19 # via # azure-identity # azure-storage-blob @@ -341,9 +341,9 @@ beautifulsoup4==4.14.3 \ # via # docling # nbconvert -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) bleach[css]==6.3.0 \ --hash=sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22 \ @@ -373,9 +373,9 @@ build==1.3.0 \ # feast (setup.py) # pip-tools # singlestoredb -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth cassandra-driver==3.29.3 \ --hash=sha256:064bf45d3ca87239e11168c0110676fc64f7fdbddb4bcba9be787b8ad5f6d734 \ @@ -782,99 +782,99 @@ couchbase-columnar==1.0.0 \ --hash=sha256:fc0fad2d386c5b5df7aaaccd8751e01caa886cc640cc8c92523dd07c4e7be519 \ --hash=sha256:fc4efa3e15190c3731478006de494b046bc57785e9c8ae99ac8b375a91683e38 # via feast (setup.py) -coverage[toml]==7.13.0 \ - --hash=sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe \ - --hash=sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b \ - --hash=sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070 \ - --hash=sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e \ - --hash=sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053 \ - --hash=sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080 \ - --hash=sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc \ - --hash=sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb \ - --hash=sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf \ - --hash=sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820 \ - --hash=sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b \ - --hash=sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232 \ - --hash=sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657 \ - --hash=sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef \ - --hash=sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd \ - --hash=sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259 \ - --hash=sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833 \ - --hash=sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d \ - --hash=sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f \ - --hash=sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493 \ - --hash=sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8 \ - --hash=sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf \ - --hash=sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9 \ - --hash=sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19 \ - --hash=sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98 \ - --hash=sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f \ - --hash=sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b \ - --hash=sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9 \ - --hash=sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b \ - --hash=sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e \ - --hash=sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc \ - --hash=sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256 \ - --hash=sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8 \ - --hash=sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927 \ - --hash=sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae \ - --hash=sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f \ - --hash=sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe \ - --hash=sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f \ - --hash=sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621 \ - --hash=sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1 \ - --hash=sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137 \ - --hash=sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9 \ - --hash=sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74 \ - --hash=sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46 \ - --hash=sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8 \ - --hash=sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940 \ - --hash=sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39 \ - --hash=sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a \ - --hash=sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d \ - --hash=sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b \ - --hash=sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0 \ - --hash=sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a \ - --hash=sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2 \ - --hash=sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb \ - --hash=sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303 \ - --hash=sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971 \ - --hash=sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030 \ - --hash=sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96 \ - --hash=sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb \ - --hash=sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33 \ - --hash=sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8 \ - --hash=sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904 \ - --hash=sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d \ - --hash=sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28 \ - --hash=sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e \ - --hash=sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e \ - --hash=sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9 \ - --hash=sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74 \ - --hash=sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8 \ - --hash=sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032 \ - --hash=sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57 \ - --hash=sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be \ - --hash=sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936 \ - --hash=sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f \ - --hash=sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c \ - --hash=sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a \ - --hash=sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791 \ - --hash=sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5 \ - --hash=sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e \ - --hash=sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a \ - --hash=sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7 \ - --hash=sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a \ - --hash=sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753 \ - --hash=sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3 \ - --hash=sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6 \ - --hash=sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e \ - --hash=sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071 \ - --hash=sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b \ - --hash=sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511 \ - --hash=sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff \ - --hash=sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7 \ - --hash=sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6 +coverage[toml]==7.13.1 \ + --hash=sha256:0403f647055de2609be776965108447deb8e384fe4a553c119e3ff6bfbab4784 \ + --hash=sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e \ + --hash=sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3 \ + --hash=sha256:0d2c11f3ea4db66b5cbded23b20185c35066892c67d80ec4be4bab257b9ad1e0 \ + --hash=sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79 \ + --hash=sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75 \ + --hash=sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6 \ + --hash=sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f \ + --hash=sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88 \ + --hash=sha256:1dcb645d7e34dcbcc96cd7c132b1fc55c39263ca62eb961c064eb3928997363b \ + --hash=sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573 \ + --hash=sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0 \ + --hash=sha256:309ef5706e95e62578cda256b97f5e097916a2c26247c287bbe74794e7150df2 \ + --hash=sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0 \ + --hash=sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba \ + --hash=sha256:3d42df8201e00384736f0df9be2ced39324c3907607d17d50d50116c989d84cd \ + --hash=sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c \ + --hash=sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673 \ + --hash=sha256:3fc6a169517ca0d7ca6846c3c5392ef2b9e38896f61d615cb75b9e7134d4ee1e \ + --hash=sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee \ + --hash=sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3 \ + --hash=sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e \ + --hash=sha256:549d195116a1ba1e1ae2f5ca143f9777800f6636eab917d4f02b5310d6d73461 \ + --hash=sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6 \ + --hash=sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6 \ + --hash=sha256:5899d28b5276f536fcf840b18b61a9fce23cc3aec1d114c44c07fe94ebeaa500 \ + --hash=sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a \ + --hash=sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9 \ + --hash=sha256:67170979de0dacac3f3097d02b0ad188d8edcea44ccc44aaa0550af49150c7dc \ + --hash=sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5 \ + --hash=sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3 \ + --hash=sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d \ + --hash=sha256:75a6f4aa904301dab8022397a22c0039edc1f51e90b83dbd4464b8a38dc87842 \ + --hash=sha256:77545b5dcda13b70f872c3b5974ac64c21d05e65b1590b441c8560115dc3a0d1 \ + --hash=sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486 \ + --hash=sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29 \ + --hash=sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968 \ + --hash=sha256:868a2fae76dfb06e87291bcbd4dcbcc778a8500510b618d50496e520bd94d9b9 \ + --hash=sha256:8842af7f175078456b8b17f1b73a0d16a65dcbdc653ecefeb00a56b3c8c298c4 \ + --hash=sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c \ + --hash=sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a \ + --hash=sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465 \ + --hash=sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8 \ + --hash=sha256:92f980729e79b5d16d221038dbf2e8f9a9136afa072f9d5d6ed4cb984b126a09 \ + --hash=sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416 \ + --hash=sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894 \ + --hash=sha256:985b7836931d033570b94c94713c6dba5f9d3ff26045f72c3e5dbc5fe3361e5a \ + --hash=sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9 \ + --hash=sha256:9edd0e01a343766add6817bc448408858ba6b489039eaaa2018474e4001651a4 \ + --hash=sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5 \ + --hash=sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f \ + --hash=sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb \ + --hash=sha256:a4d240d260a1aed814790bbe1f10a5ff31ce6c21bc78f0da4a1e8268d6c80dbd \ + --hash=sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae \ + --hash=sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a \ + --hash=sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e \ + --hash=sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564 \ + --hash=sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd \ + --hash=sha256:bb3f6562e89bad0110afbe64e485aac2462efdce6232cdec7862a095dc3412f6 \ + --hash=sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f \ + --hash=sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7 \ + --hash=sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a \ + --hash=sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee \ + --hash=sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62 \ + --hash=sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d \ + --hash=sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef \ + --hash=sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b \ + --hash=sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1 \ + --hash=sha256:cb237bfd0ef4d5eb6a19e29f9e528ac67ac3be932ea6b44fb6cc09b9f3ecff78 \ + --hash=sha256:ccd7a6fca48ca9c131d9b0a2972a581e28b13416fc313fb98b6d24a03ce9a398 \ + --hash=sha256:d10a2ed46386e850bb3de503a54f9fe8192e5917fcbb143bfef653a9355e9a53 \ + --hash=sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d \ + --hash=sha256:d2287ac9360dec3837bfdad969963a5d073a09a85d898bd86bea82aa8876ef3c \ + --hash=sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909 \ + --hash=sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f \ + --hash=sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9 \ + --hash=sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90 \ + --hash=sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851 \ + --hash=sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147 \ + --hash=sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf \ + --hash=sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864 \ + --hash=sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4 \ + --hash=sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf \ + --hash=sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4 \ + --hash=sha256:f80e2bb21bfab56ed7405c2d79d34b5dc0bc96c2c1d2a067b643a09fb756c43a \ + --hash=sha256:f83351e0f7dcdb14d7326c3d8d8c4e915fa685cbfdc6281f9470d97a04e9dfe4 \ + --hash=sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c \ + --hash=sha256:fa3edde1aa8807de1d05934982416cb3ec46d1d4d91e280bcce7cca01c507992 \ + --hash=sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c \ + --hash=sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19 \ + --hash=sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7 \ + --hash=sha256:ffed1e4980889765c84a5d1a566159e363b71d6b6fbaf0bebc9d3c30bc016766 # via pytest-cov cryptography==43.0.3 \ --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \ @@ -919,51 +919,51 @@ cryptography==43.0.3 \ # snowflake-connector-python # types-pyopenssl # types-redis -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) datasets==4.0.0 \ --hash=sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d \ --hash=sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1 # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq -debugpy==1.8.17 \ - --hash=sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1 \ - --hash=sha256:1440fd514e1b815edd5861ca394786f90eb24960eb26d6f7200994333b1d79e3 \ - --hash=sha256:17e456da14848d618662354e1dccfd5e5fb75deec3d1d48dc0aa0baacda55860 \ - --hash=sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc \ - --hash=sha256:3a32c0af575749083d7492dc79f6ab69f21b2d2ad4cd977a958a07d5865316e4 \ - --hash=sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088 \ - --hash=sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670 \ - --hash=sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef \ - --hash=sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf \ - --hash=sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420 \ - --hash=sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464 \ - --hash=sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c \ - --hash=sha256:8deb4e31cd575c9f9370042876e078ca118117c1b5e1f22c32befcfbb6955f0c \ - --hash=sha256:a3aad0537cf4d9c1996434be68c6c9a6d233ac6f76c2a482c7803295b4e4f99a \ - --hash=sha256:b13eea5587e44f27f6c48588b5ad56dcb74a4f3a5f89250443c94587f3eb2ea1 \ - --hash=sha256:b532282ad4eca958b1b2d7dbcb2b7218e02cb934165859b918e3b6ba7772d3f4 \ - --hash=sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f \ - --hash=sha256:b75868b675949a96ab51abc114c7163f40ff0d8f7d6d5fd63f8932fd38e9c6d7 \ - --hash=sha256:bb1bbf92317e1f35afcf3ef0450219efb3afe00be79d8664b250ac0933b9015f \ - --hash=sha256:c41d2ce8bbaddcc0009cc73f65318eedfa3dbc88a8298081deb05389f1ab5542 \ - --hash=sha256:c6bdf134457ae0cac6fb68205776be635d31174eeac9541e1d0c062165c6461f \ - --hash=sha256:d3fce3f0e3de262a3b67e69916d001f3e767661c6e1ee42553009d445d1cd840 \ - --hash=sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83 \ - --hash=sha256:e79a195f9e059edfe5d8bf6f3749b2599452d3e9380484cd261f6b7cd2c7c4da \ - --hash=sha256:e851beb536a427b5df8aa7d0c7835b29a13812f41e46292ff80b2ef77327355a \ - --hash=sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464 \ - --hash=sha256:eaa85bce251feca8e4c87ce3b954aba84b8c645b90f0e6a515c00394a9f5c0e7 \ - --hash=sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d \ - --hash=sha256:f2ac8055a0c4a09b30b931100996ba49ef334c6947e7ae365cdd870416d7513e \ - --hash=sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e +debugpy==1.8.19 \ + --hash=sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b \ + --hash=sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa \ + --hash=sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af \ + --hash=sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62 \ + --hash=sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38 \ + --hash=sha256:4468de0c30012d367944f0eab4ecb8371736e8ef9522a465f61214f344c11183 \ + --hash=sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee \ + --hash=sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d \ + --hash=sha256:76f566baaf7f3e06adbe67ffedccd2ee911d1e486f55931939ce3f0fe1090774 \ + --hash=sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4 \ + --hash=sha256:7b62c0f015120ede25e5124a5f9d8a424e1208e3d96a36c89958f046ee21fff6 \ + --hash=sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488 \ + --hash=sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606 \ + --hash=sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f \ + --hash=sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d \ + --hash=sha256:a21bfdea088f713df05fa246ba0520f6ba44dd7eaec224742f51987a6979a648 \ + --hash=sha256:b1cb98e5325da3059ca24445fca48314bfddfdf65ce1b59ff07055e723f06bd2 \ + --hash=sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976 \ + --hash=sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5 \ + --hash=sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e \ + --hash=sha256:c047177ab2d286451f242b855b650d313198c4a987140d4b35218b2855a64a4a \ + --hash=sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73 \ + --hash=sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b \ + --hash=sha256:c9b9bf440141a36836bdbe4320a2b126bb38aafa85e1aed05d7bfbb0e2a278bf \ + --hash=sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809 \ + --hash=sha256:d9b6f633fd2865af2afba2beb0c1819b6ecd4aed1c8f90f5d1bbca3272306b10 \ + --hash=sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2 \ + --hash=sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de \ + --hash=sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb \ + --hash=sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254 # via ipykernel decorator==5.2.1 \ --hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \ @@ -1005,9 +1005,9 @@ docling==2.27.0 \ --hash=sha256:1288ed75b27e33bf94daff34faffc6d11b7d7ccc13e3df84fb24adad3991f72d \ --hash=sha256:faba35662612a2c687a3a463e501d95f645316436084af92a0442ce162429a3d # via feast (setup.py) -docling-core[chunking]==2.54.1 \ - --hash=sha256:2d22ee1cd8508fa7ffdd2e01ef30d7521390ff55ef240610f16be0cf54ffe73e \ - --hash=sha256:c6595e8b84f5e9de7a0a6298206d749f4be5730824604e684f204078a3689985 +docling-core[chunking]==2.57.0 \ + --hash=sha256:24b71172e8bc4fbe2b4213b29f51878114f4c13f25fc0bc9920168505c76c1a3 \ + --hash=sha256:398768b4d275ad2e11703ad9446fd0315a9a5fc8d09bc45ed207302d844d6ed5 # via # docling # docling-ibm-models @@ -1120,13 +1120,13 @@ durationpy==0.10 \ easyocr==1.7.2 \ --hash=sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c # via docling -elastic-transport==9.2.0 \ - --hash=sha256:0331466ca8febdb7d168c0fbf159294b0066492733b51da94f4dd28a0ee596cd \ - --hash=sha256:f52b961e58e6b76d488993286907f61a6ddccbdae8e0135ce8d369227b6282d8 +elastic-transport==9.2.1 \ + --hash=sha256:39e1a25e486af34ce7aa1bc9005d1c736f1b6fb04c9b64ea0604ded5a61fc1d4 \ + --hash=sha256:97d9abd638ba8aa90faa4ca1bf1a18bde0fe2088fbc8757f2eb7b299f205773d # via elasticsearch -elasticsearch==9.2.0 \ - --hash=sha256:87090fe98c515ec0fce82f633fe11d7e90e04d93581b6b3e05de29efe4cc8b74 \ - --hash=sha256:99656baa34b10130402b6c38429feddf7aee1c3247566e8f95f0d0267fe9f9ab +elasticsearch==9.2.1 \ + --hash=sha256:8665f5a0b4d29a7c2772851c05ea8a09279abb7928b7d727524613bd61d75958 \ + --hash=sha256:97f473418e8976611349757287ac982acf12f4e305182863d985d5a031c36830 # via feast (setup.py) entrypoints==0.4 \ --hash=sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4 \ @@ -1173,9 +1173,9 @@ faiss-cpu==1.10.0 \ --hash=sha256:e71f7e24d5b02d3a51df47b77bd10f394a1b48a8331d5c817e71e9e27a8a75ac \ --hash=sha256:f71c5860c860df2320299f9e4f2ca1725beb559c04acb1cf961ed24e6218277a # via feast (setup.py) -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -1187,9 +1187,9 @@ fastjsonschema==2.21.2 \ --hash=sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 \ --hash=sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de # via nbformat -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via # datasets # huggingface-hub @@ -1367,9 +1367,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-storage # opencensus # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -1388,19 +1388,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -1410,49 +1410,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1539,6 +1538,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1880,9 +1880,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==8.7.0 \ - --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ - --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +importlib-metadata==8.7.1 \ + --hash=sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb \ + --hash=sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 # via opentelemetry-api importlib-resources==6.5.2 \ --hash=sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c \ @@ -1951,9 +1951,9 @@ jmespath==1.0.1 \ # aiobotocore # boto3 # botocore -joblib==1.5.2 \ - --hash=sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55 \ - --hash=sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241 +joblib==1.5.3 \ + --hash=sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 \ + --hash=sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3 # via scikit-learn json5==0.12.1 \ --hash=sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990 \ @@ -2033,9 +2033,9 @@ jupyter-server-terminals==0.5.3 \ --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa \ --hash=sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269 # via jupyter-server -jupyterlab==4.5.0 \ - --hash=sha256:88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a \ - --hash=sha256:aec33d6d8f1225b495ee2cf20f0514f45e6df8e360bdd7ac9bace0b7ac5177ea +jupyterlab==4.5.1 \ + --hash=sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9 \ + --hash=sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514 # via notebook jupyterlab-pygments==0.3.0 \ --hash=sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d \ @@ -2381,9 +2381,9 @@ markupsafe==3.0.3 \ # jinja2 # nbconvert # werkzeug -marshmallow==3.26.1 \ - --hash=sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c \ - --hash=sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6 +marshmallow==3.26.2 \ + --hash=sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73 \ + --hash=sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57 # via great-expectations matplotlib-inline==0.2.1 \ --hash=sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76 \ @@ -2391,9 +2391,9 @@ matplotlib-inline==0.2.1 \ # via # ipykernel # ipython -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -2411,9 +2411,9 @@ minio==7.2.11 \ --hash=sha256:153582ed52ff3b5005ba558e1f25bfe1e9e834f7f0745e594777f28e3e81e1a0 \ --hash=sha256:4db95a21fe1e2022ec975292d8a1f83bd5b18f830d23d42a4518ac7a5281d7c5 # via feast (setup.py) -mistune==3.1.4 \ - --hash=sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d \ - --hash=sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164 +mistune==3.2.0 \ + --hash=sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a \ + --hash=sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1 # via # great-expectations # nbconvert @@ -2836,9 +2836,9 @@ mypy-protobuf==3.3.0 \ --hash=sha256:15604f6943b16c05db646903261e3b3e775cf7f7990b7c37b03d043a907b650d \ --hash=sha256:24f3b0aecb06656e983f58e07c732a90577b9d7af3e1066fc2b663bbf0370248 # via feast (setup.py) -nbclient==0.10.2 \ - --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d \ - --hash=sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193 +nbclient==0.10.4 \ + --hash=sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9 \ + --hash=sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440 # via nbconvert nbconvert==7.16.6 \ --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b \ @@ -2883,13 +2883,13 @@ ninja==1.13.0 \ --hash=sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa \ --hash=sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e # via easyocr -nodeenv==1.9.1 \ - --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ - --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 +nodeenv==1.10.0 \ + --hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 \ + --hash=sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb # via pre-commit -notebook==7.5.0 \ - --hash=sha256:3300262d52905ca271bd50b22617681d95f08a8360d099e097726e6d2efb5811 \ - --hash=sha256:3b27eaf9913033c28dde92d02139414c608992e1df4b969c843219acf2ff95e4 +notebook==7.5.1 \ + --hash=sha256:b2fb4cef4d47d08c33aecce1c6c6e84be05436fbd791f88fce8df9fbca088b75 \ + --hash=sha256:f4e2451c19910c33b88709b84537e11f6368c1cdff1aa0c43db701aea535dd44 # via great-expectations notebook-shim==0.2.4 \ --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef \ @@ -2897,81 +2897,79 @@ notebook-shim==0.2.4 \ # via # jupyterlab # notebook -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # accelerate @@ -3030,30 +3028,30 @@ openshift-client==1.0.18 \ --hash=sha256:be3979440cfd96788146a3a1650dabe939d4d516eea0b39f87e66d2ab39495b1 \ --hash=sha256:d8a84080307ccd9556f6c62a3707a3e6507baedee36fa425754f67db9ded528b # via codeflare-sdk -opentelemetry-api==1.39.0 \ - --hash=sha256:3c3b3ca5c5687b1b5b37e5c5027ff68eacea8675241b29f13110a8ffbb8f0459 \ - --hash=sha256:6130644268c5ac6bdffaf660ce878f10906b3e789f7e2daa5e169b047a2933b9 +opentelemetry-api==1.39.1 \ + --hash=sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950 \ + --hash=sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c # via # opentelemetry-exporter-prometheus # opentelemetry-sdk # opentelemetry-semantic-conventions -opentelemetry-exporter-prometheus==0.60b0 \ - --hash=sha256:4f616397040257fae4c5e5272b57b47c13372e3b7f0f2db2427fd4dbe69c60b5 \ - --hash=sha256:c6ae33e52cdd1dbfed1f7436935df94eb03c725b57322026d04e6fbc37108e6e +opentelemetry-exporter-prometheus==0.60b1 \ + --hash=sha256:49f59178de4f4590e3cef0b8b95cf6e071aae70e1f060566df5546fad773b8fd \ + --hash=sha256:a4011b46906323f71724649d301b4dc188aaa068852e814f4df38cc76eac616b # via ray opentelemetry-proto==1.27.0 \ --hash=sha256:33c9345d91dafd8a74fc3d7576c5a38f18b7fdf8d02983ac67485386132aedd6 \ --hash=sha256:b133873de5581a50063e1e4b29cdcf0c5e253a8c2d8dc1229add20a4c3830ace # via ray -opentelemetry-sdk==1.39.0 \ - --hash=sha256:90cfb07600dfc0d2de26120cebc0c8f27e69bf77cd80ef96645232372709a514 \ - --hash=sha256:c22204f12a0529e07aa4d985f1bca9d6b0e7b29fe7f03e923548ae52e0e15dde +opentelemetry-sdk==1.39.1 \ + --hash=sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c \ + --hash=sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6 # via # opentelemetry-exporter-prometheus # ray -opentelemetry-semantic-conventions==0.60b0 \ - --hash=sha256:069530852691136018087b52688857d97bba61cd641d0f8628d2d92788c4f78a \ - --hash=sha256:227d7aa73cbb8a2e418029d6b6465553aa01cf7e78ec9d0bc3255c7b3ac5bf8f +opentelemetry-semantic-conventions==0.60b1 \ + --hash=sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953 \ + --hash=sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb # via opentelemetry-sdk orjson==3.11.5 \ --hash=sha256:0522003e9f7fba91982e83a97fec0708f5a714c96c4209db7104e6b9d132f111 \ @@ -3583,9 +3581,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -4262,9 +4260,9 @@ pyopenssl==25.1.0 \ --hash=sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab \ --hash=sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b # via snowflake-connector-python -pyparsing==3.2.5 \ - --hash=sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6 \ - --hash=sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e +pyparsing==3.3.1 \ + --hash=sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82 \ + --hash=sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c # via great-expectations pypdfium2==4.30.0 \ --hash=sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e \ @@ -4287,8 +4285,8 @@ pyproject-hooks==1.2.0 \ # via # build # pip-tools -pyspark==4.0.1 \ - --hash=sha256:9d1f22d994f60369228397e3479003ffe2dd736ba79165003246ff7bd48e2c73 +pyspark==4.1.0 \ + --hash=sha256:09c714ada88dfac3e1213c066617c6f473c1e22fbe279855028f77e12434147d # via feast (setup.py) pytest==7.4.4 \ --hash=sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280 \ @@ -4485,9 +4483,9 @@ python-keycloak==4.2.2 \ --hash=sha256:1d43a1accd4a038ed39317fcb3eb78211df6c75bbcbc4c482c99ee76327136f2 \ --hash=sha256:5137fd87c69031a372a578df96bae96b9aead2c9dad976613bc978e9e0246a1e # via feast (setup.py) -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp python-pptx==1.0.2 \ --hash=sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba \ @@ -4692,9 +4690,9 @@ pyzmq==27.1.0 \ # ipykernel # jupyter-client # jupyter-server -qdrant-client==1.16.1 \ - --hash=sha256:1eefe89f66e8a468ba0de1680e28b441e69825cfb62e8fb2e457c15e24ce5e3b \ - --hash=sha256:676c7c10fd4d4cb2981b8fcb32fd764f5f661b04b7334d024034d07212f971fd +qdrant-client==1.16.2 \ + --hash=sha256:442c7ef32ae0f005e88b5d3c0783c63d4912b97ae756eb5e052523be682f17d3 \ + --hash=sha256:ca4ef5f9be7b5eadeec89a085d96d5c723585a391eb8b2be8192919ab63185f0 # via feast (setup.py) ray[data, default]==2.52.1 \ --hash=sha256:08eb8f5fd55292ba6bee363a32491136a5e54af54e007f81e0603986fbea41a4 \ @@ -5051,26 +5049,26 @@ ruamel-yaml==0.17.17 \ --hash=sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be \ --hash=sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f # via great-expectations -ruff==0.14.8 \ - --hash=sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7 \ - --hash=sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344 \ - --hash=sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c \ - --hash=sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e \ - --hash=sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b \ - --hash=sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52 \ - --hash=sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f \ - --hash=sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a \ - --hash=sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed \ - --hash=sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a \ - --hash=sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9 \ - --hash=sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99 \ - --hash=sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097 \ - --hash=sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b \ - --hash=sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2 \ - --hash=sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b \ - --hash=sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb \ - --hash=sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6 \ - --hash=sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf +ruff==0.14.10 \ + --hash=sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6 \ + --hash=sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405 \ + --hash=sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a \ + --hash=sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f \ + --hash=sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154 \ + --hash=sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e \ + --hash=sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f \ + --hash=sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830 \ + --hash=sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f \ + --hash=sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77 \ + --hash=sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f \ + --hash=sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49 \ + --hash=sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4 \ + --hash=sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d \ + --hash=sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935 \ + --hash=sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60 \ + --hash=sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d \ + --hash=sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6 \ + --hash=sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d # via feast (setup.py) s3transfer==0.13.1 \ --hash=sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724 \ @@ -5105,29 +5103,56 @@ safetensors[torch]==0.7.0 \ # docling-ibm-models # timm # transformers -scikit-image==0.25.2 \ - --hash=sha256:24cc986e1f4187a12aa319f777b36008764e856e5013666a4a83f8df083c2641 \ - --hash=sha256:28182a9d3e2ce3c2e251383bdda68f8d88d9fff1a3ebe1eb61206595c9773341 \ - --hash=sha256:330d061bd107d12f8d68f1d611ae27b3b813b8cdb0300a71d07b1379178dd4cd \ - --hash=sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed \ - --hash=sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063 \ - --hash=sha256:60516257c5a2d2f74387c502aa2f15a0ef3498fbeaa749f730ab18f0a40fd054 \ - --hash=sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f \ - --hash=sha256:7efa888130f6c548ec0439b1a7ed7295bc10105458a421e9bf739b457730b6da \ - --hash=sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb \ - --hash=sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d \ - --hash=sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824 \ - --hash=sha256:a4c464b90e978d137330be433df4e76d92ad3c5f46a22f159520ce0fdbea8a09 \ - --hash=sha256:b2cfc96b27afe9a05bc92f8c6235321d3a66499995675b27415e0d0c76625173 \ - --hash=sha256:b4f6b61fc2db6340696afe3db6b26e0356911529f5f6aee8c322aa5157490c9b \ - --hash=sha256:b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147 \ - --hash=sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2 \ - --hash=sha256:be455aa7039a6afa54e84f9e38293733a2622b8c2fb3362b822d459cc5605e99 \ - --hash=sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78 \ - --hash=sha256:d989d64ff92e0c6c0f2018c7495a5b20e2451839299a018e0e5108b2680f71e0 \ - --hash=sha256:dd8011efe69c3641920614d550f5505f83658fe33581e49bed86feab43a180fc \ - --hash=sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde \ - --hash=sha256:f4bac9196fb80d37567316581c6060763b0f4893d3aca34a9ede3825bc035b17 +scikit-image==0.26.0 \ + --hash=sha256:0608aa4a9ec39e0843de10d60edb2785a30c1c47819b67866dd223ebd149acaf \ + --hash=sha256:0660b83968c15293fd9135e8d860053ee19500d52bf55ca4fb09de595a1af650 \ + --hash=sha256:09bad6a5d5949c7896c8347424c4cca899f1d11668030e5548813ab9c2865dcb \ + --hash=sha256:0baa0108d2d027f34d748e84e592b78acc23e965a5de0e4bb03cf371de5c0581 \ + --hash=sha256:163e9afb5b879562b9aeda0dd45208a35316f26cc7a3aed54fd601604e5cf46f \ + --hash=sha256:20ef4a155e2e78b8ab973998e04d8a361d49d719e65412405f4dadd9155a61d9 \ + --hash=sha256:21a818ee6ca2f2131b9e04d8eb7637b5c18773ebe7b399ad23dcc5afaa226d2d \ + --hash=sha256:27d58bc8b2acd351f972c6508c1b557cfed80299826080a4d803dd29c51b707e \ + --hash=sha256:2c1e7bd342f43e7a97e571b3f03ba4c1293ea1a35c3f13f41efdc8a81c1dc8f2 \ + --hash=sha256:3268f13310e6857508bd87202620df996199a016a1d281b309441d227c822394 \ + --hash=sha256:3409e89d66eff5734cd2b672d1c48d2759360057e714e1d92a11df82c87cba37 \ + --hash=sha256:3f5bf622d7c0435884e1e141ebbe4b2804e16b2dd23ae4c6183e2ea99233be70 \ + --hash=sha256:4c717490cec9e276afb0438dd165b7c3072d6c416709cc0f9f5a4c1070d23a44 \ + --hash=sha256:4d57e39ef67a95d26860c8caf9b14b8fb130f83b34c6656a77f191fa6d1d04d8 \ + --hash=sha256:52c496f75a7e45844d951557f13c08c81487c6a1da2e3c9c8a39fcde958e02cc \ + --hash=sha256:6381edf972b32e4f54085449afde64365a57316637496c1325a736987083e2ab \ + --hash=sha256:63af3d3a26125f796f01052052f86806da5b5e54c6abef152edb752683075a9c \ + --hash=sha256:6caec76e16c970c528d15d1c757363334d5cb3069f9cea93d2bead31820511f3 \ + --hash=sha256:724f79fd9b6cb6f4a37864fe09f81f9f5d5b9646b6868109e1b100d1a7019e59 \ + --hash=sha256:74aa5518ccea28121f57a95374581d3b979839adc25bb03f289b1bc9b99c58af \ + --hash=sha256:7af7aa331c6846bd03fa28b164c18d0c3fd419dbb888fb05e958ac4257a78fdd \ + --hash=sha256:7df650e79031634ac90b11e64a9eedaf5a5e06fcd09bcd03a34be01745744466 \ + --hash=sha256:915bb3ba66455cf8adac00dc8fdf18a4cd29656aec7ddd38cb4dda90289a6f21 \ + --hash=sha256:92242351bccf391fc5df2d1529d15470019496d2498d615beb68da85fe7fdf37 \ + --hash=sha256:9490360c8d3f9a7e85c8de87daf7c0c66507960cf4947bb9610d1751928721c7 \ + --hash=sha256:98329aab3bc87db352b9887f64ce8cdb8e75f7c2daa19927f2e121b797b678d5 \ + --hash=sha256:9ea6207d9e9d21c3f464efe733121c0504e494dbdc7728649ff3e23c3c5a4953 \ + --hash=sha256:9eefb4adad066da408a7601c4c24b07af3b472d90e08c3e7483d4e9e829d8c49 \ + --hash=sha256:a07200fe09b9d99fcdab959859fe0f7db8df6333d6204344425d476850ce3604 \ + --hash=sha256:a2d211bc355f59725efdcae699b93b30348a19416cc9e017f7b2fb599faf7219 \ + --hash=sha256:a2e852eccf41d2d322b8e60144e124802873a92b8d43a6f96331aa42888491c7 \ + --hash=sha256:abed017474593cd3056ae0fe948d07d0747b27a085e92df5474f4955dd65aec0 \ + --hash=sha256:ac529eb9dbd5954f9aaa2e3fe9a3fd9661bfe24e134c688587d811a0233127f1 \ + --hash=sha256:aeb14db1ed09ad4bee4ceb9e635547a8d5f3549be67fc6c768c7f923e027e6cd \ + --hash=sha256:b1ede33a0fb3731457eaf53af6361e73dd510f449dac437ab54573b26788baf0 \ + --hash=sha256:b36ab5e778bf50af5ff386c3ac508027dc3aaeccf2161bdf96bde6848f44d21b \ + --hash=sha256:b702c3bb115e1dcf4abf5297429b5c90f2189655888cbed14921f3d26f81d3a4 \ + --hash=sha256:b8d14d3181c21c11170477a42542c1addc7072a90b986675a71266ad17abc37f \ + --hash=sha256:c6624a76c6085218248154cc7e1500e6b488edcd9499004dd0d35040607d7505 \ + --hash=sha256:c9087cf7d0e7f33ab5c46d2068d86d785e70b05400a891f73a13400f1e1faf6a \ + --hash=sha256:cde0bbd57e6795eba83cb10f71a677f7239271121dc950bc060482834a668ad1 \ + --hash=sha256:ce00600cd70d4562ed59f80523e18cdcc1fae0e10676498a01f73c255774aefd \ + --hash=sha256:cefd85033e66d4ea35b525bb0937d7f42d4cdcfed2d1888e1570d5ce450d3932 \ + --hash=sha256:d454b93a6fa770ac5ae2d33570f8e7a321bb80d29511ce4b6b78058ebe176e8c \ + --hash=sha256:d5c244656de905e195a904e36dbc18585e06ecf67d90f0482cbde63d7f9ad59d \ + --hash=sha256:ede4d6d255cc5da9faeb2f9ba7fedbc990abbc652db429f40a16b22e770bb578 \ + --hash=sha256:f5f970ab04efad85c24714321fcc91613fcb64ef2a892a13167df2f3e59199fa \ + --hash=sha256:f775f0e420faac9c2aa6757135f4eb468fb7b70e0b67fa77a5e79be3c30ee331 \ + --hash=sha256:fac96a1f9b06cd771cbbb3cd96c5332f36d4efd839b1d8b053f79e5887acde62 # via easyocr scikit-learn==1.8.0 \ --hash=sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2 \ @@ -5389,9 +5414,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via snowflake-connector-python -soupsieve==2.8 \ - --hash=sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c \ - --hash=sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f +soupsieve==2.8.1 \ + --hash=sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350 \ + --hash=sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434 # via beautifulsoup4 sphinx==6.2.1 \ --hash=sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b \ @@ -5433,12 +5458,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -5457,7 +5484,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -5551,9 +5580,9 @@ sqlparams==6.2.0 \ --hash=sha256:3744a2ad16f71293db6505b21fd5229b4757489a9b09f3553656a1ae97ba7ca5 \ --hash=sha256:63b32ed9051bdc52e7e8b38bc4f78aed51796cdd9135e730f4c6a7db1048dedf # via singlestoredb -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp stack-data==0.6.3 \ --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ @@ -5565,6 +5594,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -5663,9 +5693,9 @@ thriftpy2==0.5.3 \ --hash=sha256:fd4c6131ca6e919f03263cc83b713f1797bc20126a858da8518ed49b3e32c334 \ --hash=sha256:fdc5676b52fa6a3009d205360eb9ba257b8b4813883ed52797a20838bcc45dde # via happybase -tifffile==2025.10.16 \ - --hash=sha256:41463d979c1c262b0a5cdef2a7f95f0388a072ad82d899458b154a48609d759c \ - --hash=sha256:425179ec7837ac0e07bc95d2ea5bea9b179ce854967c12ba07fc3f093e58efc1 +tifffile==2025.12.20 \ + --hash=sha256:bc0345a20675149353cfcb3f1c48d0a3654231ee26bd46beebaab4d2168feeb6 \ + --hash=sha256:cb8a4fee327d15b3e3eeac80bbdd8a53b323c80473330bcfb99418ee4c1c827f # via scikit-image timm==1.0.22 \ --hash=sha256:14fd74bcc17db3856b1a47d26fb305576c98579ab9d02b36714a5e6b25cde422 \ @@ -5825,19 +5855,19 @@ torchvision==0.24.1 \ # docling-ibm-models # easyocr # timm -tornado==6.5.2 \ - --hash=sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c \ - --hash=sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6 \ - --hash=sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef \ - --hash=sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4 \ - --hash=sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0 \ - --hash=sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e \ - --hash=sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882 \ - --hash=sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04 \ - --hash=sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0 \ - --hash=sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af \ - --hash=sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f \ - --hash=sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108 +tornado==6.5.4 \ + --hash=sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1 \ + --hash=sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1 \ + --hash=sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843 \ + --hash=sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335 \ + --hash=sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8 \ + --hash=sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f \ + --hash=sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84 \ + --hash=sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7 \ + --hash=sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17 \ + --hash=sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9 \ + --hash=sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f \ + --hash=sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc # via # ipykernel # jupyter-client @@ -5997,9 +6027,9 @@ types-protobuf==3.19.22 \ # via # feast (setup.py) # mypy-protobuf -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) types-pyopenssl==24.1.0.20240722 \ --hash=sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39 \ @@ -6025,9 +6055,9 @@ types-requests==2.30.0.0 \ --hash=sha256:c6cf08e120ca9f0dc4fa4e32c3f953c3fba222bcc1db6b97695bce8da1ba9864 \ --hash=sha256:dec781054324a70ba64430ae9e62e7e9c8e4618c185a5cb3f87a6738251b5a31 # via feast (setup.py) -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via # feast (setup.py) # types-cffi @@ -6085,9 +6115,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via # arrow # pandas @@ -6187,9 +6217,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.12-minimal-requirements.txt b/sdk/python/requirements/py3.12-minimal-requirements.txt index b0f2f48c9b0..d2064d4ed78 100644 --- a/sdk/python/requirements/py3.12-minimal-requirements.txt +++ b/sdk/python/requirements/py3.12-minimal-requirements.txt @@ -170,9 +170,9 @@ attrs==25.4.0 \ # aiohttp # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -188,9 +188,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -465,13 +465,13 @@ cryptography==46.0.0 \ # pyjwt # pyopenssl # snowflake-connector-python -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -537,9 +537,9 @@ durationpy==0.10 \ --hash=sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba \ --hash=sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286 # via kubernetes -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -547,9 +547,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python frozenlist==1.8.0 \ --hash=sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686 \ @@ -703,9 +703,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -724,19 +724,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -746,49 +746,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -871,6 +870,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1094,83 +1094,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1271,9 +1271,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1561,125 +1561,123 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -1770,9 +1768,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -1920,9 +1918,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -1952,26 +1950,28 @@ protobuf==6.33.2 \ # grpcio-status # proto-plus # pymilvus -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2233,9 +2233,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2547,12 +2547,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2571,7 +2573,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2589,9 +2593,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2599,6 +2603,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette tabulate==0.9.0 \ --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f @@ -2676,13 +2681,13 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2713,9 +2718,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -2803,9 +2808,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.12-minimal-sdist-requirements-build.txt b/sdk/python/requirements/py3.12-minimal-sdist-requirements-build.txt index 329c5840ede..20d5e108fcc 100644 --- a/sdk/python/requirements/py3.12-minimal-sdist-requirements-build.txt +++ b/sdk/python/requirements/py3.12-minimal-sdist-requirements-build.txt @@ -166,46 +166,46 @@ cython==3.0.12 \ # pyyaml # snowflake-connector-python # sqlalchemy -cython==3.2.2 \ - --hash=sha256:034ab96cb8bc8e7432bc27491f8d66f51e435b1eb21ddc03aa844be8f21ad847 \ - --hash=sha256:098590c1dc309f8a0406ade031963a95a87714296b425539f9920aebf924560d \ - --hash=sha256:0e35ff0f1bb3a7a5c40afb8fb540e4178b6551909f10748bf39d323f8140ccf3 \ - --hash=sha256:13b99ecb9482aff6a6c12d1ca6feef6940c507af909914b49f568de74fa965fb \ - --hash=sha256:14432d7f207245a3c35556155873f494784169297b28978a6204f1c60d31553e \ - --hash=sha256:177faf4d61e9f2d4d2db61194ac9ec16d3fe3041c1b6830f871a01935319eeb3 \ - --hash=sha256:2b910b89a2a71004064c5e890b9512a251eda63fae252caa0feb9835057035f9 \ - --hash=sha256:3de43a5786033a27fae1c882feb5ff0d023c38b83356e6800c1be0bcd6cf9f11 \ - --hash=sha256:436eb562d0affbc0b959f62f3f9c1ed251b9499e4f29c1d19514ae859894b6bf \ - --hash=sha256:50bbaabee733fd2780985e459fc20f655e02def83e8eff10220ad88455a34622 \ - --hash=sha256:5f818d40bbcf17e2089e2de7840f0de1c0ca527acf9b044aba79d5f5d8a5bdba \ - --hash=sha256:60f4aa425e1ff98abf8d965ae7020f06dd2cbc01dbd945137d2f9cca4ff0524a \ - --hash=sha256:692a41c8fe06fb2dc55ca2c8d71c80c469fd16fe69486ed99f3b3cbb2d3af83f \ - --hash=sha256:820c4a99dbf6b3e6c0300be42b4040b501eff0e1feeb80cfa52c48a346fb0df2 \ - --hash=sha256:826cad0ad43ab05a26e873b5d625f64d458dc739ec6fdeecab848b60a91c4252 \ - --hash=sha256:86b1d39a1ea974dd16fe3bcef0df7b64dadd0bd38d05a339f287b48d37cb109f \ - --hash=sha256:8c9265b3e84ae2d999b7c3165c683e366bbbbbe4346468055ca2366fe013f2df \ - --hash=sha256:8db28aef793c81dc69383b619ca508668998aaf099cd839d3cbae85184cce744 \ - --hash=sha256:8e72ee88a9a5381d30a6da116a3c8352730b9b038a49ed9bc5c3d0ed6d69b06c \ - --hash=sha256:9cd2ede6af225499ad22888dbfb13b92d71fc1016f401ee637559a5831b177c2 \ - --hash=sha256:a3898c076e9c458bcb3e4936187919fda5f5365fe4c567d35d2b003444b6f3fe \ - --hash=sha256:a473df474ba89e9fee81ee82b31062a267f9e598096b222783477e56d02ad12c \ - --hash=sha256:a6387e3ad31342443916db9a419509935fddd8d4cbac34aab9c895ae55326a56 \ - --hash=sha256:a9509f1e9c41c86b790cff745bb31927bbc861662a3b462596d71d3d2a578abb \ - --hash=sha256:aa24cd0bdab27ca099b2467806c684404add597c1108e07ddf7b6471653c85d7 \ - --hash=sha256:aff11412ed5fc78bd8b148621f4d1034fcad6cfcba468c20cd9f327b4f61ec3e \ - --hash=sha256:b223c1f84c3420c24f6a4858e979524bd35a79437a5839e29d41201c87ed119d \ - --hash=sha256:b4df52101209817fde7284cf779156f79142fb639b1d7840f11680ff4bb30604 \ - --hash=sha256:b4fe499eed7cd70b2aa4e096b9ce2588f5e6fdf049b46d40a5e55efcde6e4904 \ - --hash=sha256:b5afac4e77e71a9010dc7fd3191ced00f9b12b494dd7525c140781054ce63a73 \ - --hash=sha256:c3add3d483acc73129a61d105389344d792c17e7c1cee24863f16416bd071634 \ - --hash=sha256:ca18d9d53c0e2f0c9347478b37532b46e0dc34c704e052ab1b0d8b21a290fc0f \ - --hash=sha256:d140c2701cbb8cf960300cf1b67f3b4fa9d294d32e51b85f329bff56936a82fd \ - --hash=sha256:d7b3447b2005dffc5f276d420a480d2b57d15091242652d410b6a46fb00ed251 \ - --hash=sha256:d8c93fe128b58942832b1fcac96e48f93c2c69b569eff0d38d30fb5995fecfa0 \ - --hash=sha256:e7200309b81f4066cf36a96efeec646716ca74afd73d159045169263db891133 \ - --hash=sha256:f560ff3aea5b5df93853ec7bf1a1e9623d6d511f4192f197559aca18fca43392 \ - --hash=sha256:fed44d0ab2d36f1b0301c770b0dafec23bcb9700d58e7769cd6d9136b3304c11 \ - --hash=sha256:ff07e784ea748225bbdea07fec0ac451379e9e41a0a84cb57b36db19dd01ae71 +cython==3.2.3 \ + --hash=sha256:0145e64485f0a9741c9314ae176282dffeb48d2ef30ae315d7224698867c317f \ + --hash=sha256:06a1317097f540d3bb6c7b81ed58a0d8b9dbfa97abf39dfd4c22ee87a6c7241e \ + --hash=sha256:0a75a04688875b275a6c875565e672325bae04327dd6ec2fc25aeb5c6cf82fce \ + --hash=sha256:1309bdce06f767e8514377f44b3a5b9e5b91e58af1348010cca10b572e1852ad \ + --hash=sha256:18b5e738c9dbb1cb488b51e35c3a1b9aa7363166cce40158fe6ccb454f6498ac \ + --hash=sha256:18edc858e6a52de47fe03ffa97ea14dadf450e20069de0a8aef531006c4bbd93 \ + --hash=sha256:1d097ad4686b58b8c03d760d08eca28f79878d404ef7452c49636170571654e0 \ + --hash=sha256:228f11be8406015d1ce84a25bf4f96167ff6fc18b834deca5716d95ae15a818c \ + --hash=sha256:22a624290c2883387b2c2cfb5224c15bff21432c6a2cf0c23ac8df3dcbd45e96 \ + --hash=sha256:25732f3981a93407826297f4423206e5e22c3cfccfc74e37bf444453bbdc076f \ + --hash=sha256:26404441f733fd1cfb0dd9c45477f501437e7d51fad05bb402bd2feb4e127aa3 \ + --hash=sha256:283262b8f902323ceb6ed3b643f275a2a963e7ab059f0714a467933383cbc56d \ + --hash=sha256:2a18f2e3bcd018416157d0a83446e29b4a31437ab79061fe5504c077e70389d0 \ + --hash=sha256:3141734fb15f8b5e9402b9240f8da8336edecae91742b41c85678c31ab68f66d \ + --hash=sha256:3829f99d611412288f44ff543e9d2b5c0c83274998b2a6680bbe5cca3539c1fd \ + --hash=sha256:4f40efa83c93060a271046930d2322ec045abb9722d25a377702cb57aa823c2b \ + --hash=sha256:51fd1a56d0fc682c05ecc44f11927dbe28dd2867c30148557b62d7d1017a13d8 \ + --hash=sha256:55c0157a5940fbf0b054508207fe0fc5cc796d0532af492c0fa35b5b41a883f7 \ + --hash=sha256:60d19376252722241a3d3ec8a695c5cae4deb053486d2e5f9a40cb569a0cf984 \ + --hash=sha256:6b01b36c9eb1b68c25bddbeef7379f7bfc37f7c9afc044e71840ffab761a2dd0 \ + --hash=sha256:6b6dd6b7aca8447b2a6779b314cc402f1e4990754507a88477e535b3c8b41ad1 \ + --hash=sha256:73afc824896ffaf22bf8122d0a7107f0120e3188a353bdcfa92317fc0d9a87ce \ + --hash=sha256:74f482da8b605c61b4df6ff716d013f20131949cb2fa59b03e63abd36ef5bac0 \ + --hash=sha256:80f20369d7aaf4e76cfef902025256918a5cc6eb0aed6d8783e4b1c563e4f6c4 \ + --hash=sha256:84330e7c8bf220a82b633678b9f99e10227c8f4c406d67c5552449ab2afedef8 \ + --hash=sha256:9a24cc653fad3adbd9cbaa638d80df3aa08a1fe27f62eb35850971c70be680df \ + --hash=sha256:9aa1a8abf3d8bb53cc19cfaa21c004afad8d4ccb17513f8aa11a788d1f525abd \ + --hash=sha256:9c5ac7201d8382c0da69e4a119c14be6acd7c286615a0383ffbd1dbfdbaa3df7 \ + --hash=sha256:b39dff92db70cbd95528f3b81d70e06bd6d3fc9c1dd91321e4d3b999ece3bceb \ + --hash=sha256:c041f7e338cca2422e0924716b04fabeda57636214324fc1941396acce99e7c7 \ + --hash=sha256:c102388cf7604ff5647164d5041fd5de2393198a87883fdb50f6c078fc2f4f8e \ + --hash=sha256:c2365a0c79ab9c0fa86d30a4a6ba7e37fc1be9537c48b79b9d63ee7e08bf2fef \ + --hash=sha256:cf210228c15b5c625824d8e31d43b6fea25f9e13c81dac632f2f7d838e0229a5 \ + --hash=sha256:d1f8700ba89c977438744f083890d87187f15709507a5489e0f6d682053b7fa0 \ + --hash=sha256:e31f52ea7e35463b21410f150006eb07b663a0b3ceea8ee8f35e0b8e02b75f50 \ + --hash=sha256:e4293f1861480b397809a6f021a6c12e15e918feae1c7add80c99d07af206578 \ + --hash=sha256:f13832412d633376ffc08d751cc18ed0d7d00a398a4065e2871db505258748a6 \ + --hash=sha256:f5bf0cebeb4147e172a114437d3fce5a507595d8fdd821be792b1bb25c691514 \ + --hash=sha256:fabe2f37acb63a5521d16193effb15acd082e35458f30f1c1f3e506271fee8a7 # via uvloop dunamai==1.25.0 \ --hash=sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab \ @@ -321,83 +321,83 @@ jinja2==3.1.6 \ # via # poetry-dynamic-versioning # uv-dynamic-versioning -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy markupsafe==3.0.3 \ --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ @@ -490,21 +490,21 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -maturin==1.10.2 \ - --hash=sha256:04df81ee295dcda37828bd025a4ac688ea856e3946e4cb300a8f44a448de0069 \ - --hash=sha256:07a82864352feeaf2167247c8206937ef6c6ae9533025d416b7004ade0ea601d \ - --hash=sha256:11c73815f21a755d2129c410e6cb19dbfacbc0155bfc46c706b69930c2eb794b \ - --hash=sha256:259292563da89850bf8f7d37aa4ddba22905214c1e180b1c8f55505dfd8c0e81 \ - --hash=sha256:7fbd997c5347649ee7987bd05a92bd5b8b07efa4ac3f8bcbf6196e07eb573d89 \ - --hash=sha256:96e1d391e4c1fa87edf2a37e4d53d5f2e5f39dd880b9d8306ac9f8eb212d23f8 \ - --hash=sha256:a217aa7c42aa332fb8e8377eb07314e1f02cf0fe036f614aca4575121952addd \ - --hash=sha256:a41ec70d99e27c05377be90f8e3c3def2a7bae4d0d9d5ea874aaf2d1da625d5c \ - --hash=sha256:a4c29a770ea2c76082e0afc6d4efd8ee94405588bfae00d10828f72e206c739b \ - --hash=sha256:da031771d9fb6ddb1d373638ec2556feee29e4507365cd5749a2d354bcadd818 \ - --hash=sha256:da777766fd584440dc9fecd30059a94f85e4983f58b09e438ae38ee4b494024c \ - --hash=sha256:e3ce9b2ad4fb9c341f450a6d32dc3edb409a2d582a81bc46ba55f6e3b6196b22 \ - --hash=sha256:efcd496a3202ffe0d0489df1f83d08b91399782fb2dd545d5a1e7bf6fd81af39 \ - --hash=sha256:f0d1b7b5f73c8d30a7e71cd2a2189a7f0126a3a3cd8b3d6843e7e1d4db50f759 +maturin==1.11.0 \ + --hash=sha256:0fbe565ede0901de7743cd028ad6c13be623b1c7158641f8a50d7a4353f4a97c \ + --hash=sha256:16cb48f1f2b6b3d8c2732f77d98d8f7f0ab84765abf0c1c82df2c8ea7d8ef2ec \ + --hash=sha256:276a900d4096c246cc236aa00460adb3ab195c37172a9f1087bbde6a127f0780 \ + --hash=sha256:51cadd0373950cfae6aac6823a3d2bf56e34e4efed0abae8c7d15e337d9bb5e6 \ + --hash=sha256:83b73299f36301d943550c609e0a0dff08d21e3674c1369c10df77ce470fd97b \ + --hash=sha256:8695b79462e1f46013993d715485db289cf5a7702aa2d9941ac333564ca20d79 \ + --hash=sha256:8bf16fc56f4abcf3af7d5fb6dab3888f73e3648287c8efe77e14fa1b006a3ef4 \ + --hash=sha256:95c5d778c96ab237837cd6d38e01f0bdca52c64e0d00647a69133a8e7ae4eed4 \ + --hash=sha256:9aaaec73e120ac7add99f53d606aa6d432c8e0337af742b2ca26fb8d17181500 \ + --hash=sha256:aa2d9db1c03e9eb0640a578caf00a6fa2d9399abb7375a970b0f6d6e934b5441 \ + --hash=sha256:d13d3721931d407491d9b3fe161146aa78ab08a8fc9735302abee1d368aedb03 \ + --hash=sha256:d53bde4f939dac9340aa253c2765073de6b8595a29a294503042fcbfec8bd842 \ + --hash=sha256:dba7daeb54615532c11f8fe39bc9514b81215f6f4e91909ec227e06227c286cf \ + --hash=sha256:debf472d3ecd76a3a750b056b99dcb64c119467dc44f0e2d6e6363acb128b96a # via # cryptography # pydantic-core @@ -513,9 +513,11 @@ maturin==1.10.2 \ meson-python==0.15.0 \ --hash=sha256:3ae38253ff02b2e947a05e362a2eaf5a9a09d133c5666b4123399ee5fbf2e591 \ --hash=sha256:fddb73eecd49e89c1c41c87937cd89c2d0b65a1c63ba28238681d4bd9484d26f - # via - # numpy - # pandas + # via pandas +meson-python==0.18.0 \ + --hash=sha256:3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 \ + --hash=sha256:c56a99ec9df669a40662fe46960321af6e4b14106c14db228709c1628e23848d + # via numpy meson==1.7.1 \ --hash=sha256:155780a5be87f6dd7f427ad8bcbf0f2b2c5f62ee5fdacca7caa9de8439a24b89 \ --hash=sha256:6d9cbc9ce87a70243c75e4cc668ee3f206ab50b184beb0a08ece948112f19bd7 @@ -526,81 +528,79 @@ mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # pandas # pyarrow @@ -610,6 +610,7 @@ packaging==24.2 \ # via # dunamai # hatchling + # meson-python # pyproject-metadata # scikit-build-core # setuptools-scm @@ -769,9 +770,9 @@ types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via mypy -types-setuptools==80.9.0.20250822 \ - --hash=sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965 \ - --hash=sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3 +types-setuptools==80.9.0.20251223 \ + --hash=sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6 \ + --hash=sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2 # via mypy typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -779,9 +780,9 @@ typing-extensions==4.15.0 \ # via # mypy # setuptools-scm -uv-dynamic-versioning==0.11.2 \ - --hash=sha256:4c785ea02e00b93896d015fd3613c451735af1715a7f5f52e8e4e1d76e6ec3c5 \ - --hash=sha256:563ab4b7a93904eb8fb8fd9f2959dad853d62baa71f3cdb0233acf8a749d512f +uv-dynamic-versioning==0.12.0 \ + --hash=sha256:2d2f1fb806c2e351d0d0a3840aaf7b3c6ce73757080b1ada4ac5dc44f7dd4c9e \ + --hash=sha256:e853e0c5b2425a68005580325d4975a8c37b66015589ca45ef96e660fe0f8f16 # via mcp versioneer==0.29 \ --hash=sha256:0f1a137bb5d6811e96a79bb0486798aeae9b9c6efc24b389659cebb0ee396cb9 \ diff --git a/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt index 9f25dc790ef..ac6f755be87 100644 --- a/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt @@ -178,9 +178,9 @@ babel==2.17.0 \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 # via sphinx -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) boto3==1.38.27 \ --hash=sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859 \ @@ -196,9 +196,9 @@ botocore==1.38.46 \ # boto3 # s3transfer # snowflake-connector-python -cachetools==6.2.2 \ - --hash=sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace \ - --hash=sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6 +cachetools==6.2.4 \ + --hash=sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51 \ + --hash=sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607 # via google-auth calver==2025.3.31 \ --hash=sha256:07511edf5e7fa75ae97445c8c5921240e0fe62937289a3ebe6963eddd3c691b6 \ @@ -543,13 +543,13 @@ cython==3.0.12 \ --hash=sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3 \ --hash=sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) -db-dtypes==1.4.4 \ - --hash=sha256:26f53db5df1acd746b88c5647913a1b20f731c0af1b11abcb6bec5365f31098a \ - --hash=sha256:32c13039982656a8598a0835f25f0e07e34c9a423e471ee60c2553240b7fcf1e +db-dtypes==1.5.0 \ + --hash=sha256:abdbb2e4eb965800ed6f98af0c5c1cafff9063ace09114be2d26a7f046be2c8a \ + --hash=sha256:ad9e94243f53e104bc77dbf9ae44b580d83a770d3694483aba59c9767966daa5 # via # google-cloud-bigquery # pandas-gbq @@ -557,9 +557,9 @@ dill==0.3.9 \ --hash=sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a \ --hash=sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c # via feast (setup.py) -docutils==0.22.3 \ - --hash=sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd \ - --hash=sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb +docutils==0.22.4 \ + --hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968 \ + --hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de # via sphinx duckdb==1.1.3 \ --hash=sha256:00cca22df96aa3473fe4584f84888e2cf1c516e8c2dd837210daec44eadba586 \ @@ -623,9 +623,9 @@ durationpy==0.10 \ --hash=sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba \ --hash=sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286 # via kubernetes -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via # feast (setup.py) # fastapi-mcp @@ -633,9 +633,9 @@ fastapi-mcp==0.4.0 \ --hash=sha256:d4a3fe7966af24d44e4b412720561c95eb12bed999a4443a88221834b3b15aec \ --hash=sha256:d4ca9410996f4c7b8ea0d7b20fdf79878dc359ebf89cbf3b222e0b675a55097d # via feast (setup.py) -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via snowflake-connector-python flit-core==3.12.0 \ --hash=sha256:18f63100d6f94385c6ed57a72073443e1a71a4acb4339491615d0f16d6ff01b2 \ @@ -793,9 +793,9 @@ google-api-core[grpc]==2.28.1 \ # google-cloud-datastore # google-cloud-storage # pandas-gbq -google-auth==2.43.0 \ - --hash=sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483 \ - --hash=sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16 +google-auth==2.45.0 \ + --hash=sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36 \ + --hash=sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3 # via # google-api-core # google-auth-oauthlib @@ -814,19 +814,19 @@ google-auth-oauthlib==1.2.2 \ # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[pandas]==3.38.0 \ - --hash=sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520 \ - --hash=sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6 +google-cloud-bigquery[pandas]==3.39.0 \ + --hash=sha256:cb375e1d63dea9bd5bf735e66024338f294159d43afdf63e1d023f5fcbbf55ea \ + --hash=sha256:dc7a64921465859105461b43c42562e38e797d7a73feb72b3cfc4865b7b1c5ef # via # feast (setup.py) # pandas-gbq -google-cloud-bigquery-storage==2.35.0 \ - --hash=sha256:c9bab6b8e41d6cb9806e589e65f320c89ada84f466e61566b7208d87924c1430 \ - --hash=sha256:f2e3a08882155de1e9ec53c71c5784eb1f25dc6514c535f5796c3c9eeac17d17 +google-cloud-bigquery-storage==2.36.0 \ + --hash=sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0 \ + --hash=sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f # via feast (setup.py) -google-cloud-bigtable==2.34.0 \ - --hash=sha256:773258b00cd3f9a3a35639cc38bd711f4f1418aaa0c8d70cb028978ed98dc2c2 \ - --hash=sha256:a4a8db4903840cd3f89fb19c060eea2e7c09c1265cb0538cfc11288dbc6000e4 +google-cloud-bigtable==2.35.0 \ + --hash=sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50 \ + --hash=sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b # via feast (setup.py) google-cloud-core==2.5.0 \ --hash=sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc \ @@ -836,49 +836,48 @@ google-cloud-core==2.5.0 \ # google-cloud-bigtable # google-cloud-datastore # google-cloud-storage -google-cloud-datastore==2.21.0 \ - --hash=sha256:eee454dd4a55f5b327f9f344928ff1a09a6f77c23d5e3d908ad31a13cc2f4073 \ - --hash=sha256:f303f27cd1983383f20bd227019cd8a7897419e0ec6b878367c58c66245f9d9b +google-cloud-datastore==2.23.0 \ + --hash=sha256:24a1b1d29b902148fe41b109699f76fd3aa60591e9d547c0f8b87d7bf9ff213f \ + --hash=sha256:80049883a4ae928fdcc661ba6803ec267665dc0e6f3ce2da91441079a6bb6387 # via feast (setup.py) google-cloud-storage==2.19.0 \ --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 # via feast (setup.py) -google-crc32c==1.7.1 \ - --hash=sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db \ - --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ - --hash=sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c \ - --hash=sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242 \ - --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ - --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ - --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ - --hash=sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3 \ - --hash=sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582 \ - --hash=sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d \ - --hash=sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6 \ - --hash=sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82 \ - --hash=sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06 \ - --hash=sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349 \ - --hash=sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a \ - --hash=sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d \ - --hash=sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48 \ - --hash=sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb \ - --hash=sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315 \ - --hash=sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589 \ - --hash=sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76 \ - --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ - --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 \ - --hash=sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127 \ - --hash=sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53 \ - --hash=sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603 \ - --hash=sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35 \ - --hash=sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9 \ - --hash=sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638 \ - --hash=sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9 \ - --hash=sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77 \ - --hash=sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14 \ - --hash=sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b \ - --hash=sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb +google-crc32c==1.8.0 \ + --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ + --hash=sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a \ + --hash=sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff \ + --hash=sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288 \ + --hash=sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411 \ + --hash=sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a \ + --hash=sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15 \ + --hash=sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb \ + --hash=sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa \ + --hash=sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962 \ + --hash=sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215 \ + --hash=sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b \ + --hash=sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27 \ + --hash=sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113 \ + --hash=sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f \ + --hash=sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f \ + --hash=sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d \ + --hash=sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2 \ + --hash=sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092 \ + --hash=sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7 \ + --hash=sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2 \ + --hash=sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93 \ + --hash=sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8 \ + --hash=sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21 \ + --hash=sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79 \ + --hash=sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2 \ + --hash=sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc \ + --hash=sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454 \ + --hash=sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2 \ + --hash=sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733 \ + --hash=sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697 \ + --hash=sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651 \ + --hash=sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c # via # google-cloud-bigtable # google-cloud-storage @@ -1011,6 +1010,7 @@ grpcio==1.62.3 \ # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage + # google-cloud-datastore # googleapis-common-protos # grpc-google-iam-v1 # grpcio-health-checking @@ -1262,83 +1262,83 @@ kubernetes==33.1.0 \ --hash=sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5 \ --hash=sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993 # via feast (setup.py) -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -1439,9 +1439,9 @@ markupsafe==3.0.3 \ --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 -mcp==1.23.3 \ - --hash=sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031 \ - --hash=sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201 +mcp==1.25.0 \ + --hash=sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802 \ + --hash=sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a # via fastapi-mcp mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -1731,125 +1731,123 @@ multidict==6.7.0 \ # aiobotocore # aiohttp # yarl -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -1947,9 +1945,9 @@ pandas==2.3.3 \ # pandas-gbq # pymilvus # snowflake-connector-python -pandas-gbq==0.31.1 \ - --hash=sha256:a5d6e897917302c50feaca2ed1ce6a284abd8b9139383bf063307aab8d0556d9 \ - --hash=sha256:c59878504adee211cf1c34b22cf94393c59cc953626c61ce76e06c8d25fd146d +pandas-gbq==0.32.0 \ + --hash=sha256:249623d574c65e98cf19b7b7ecda97729f4f0a843eae3a0a82d9ef50adcdf4ef \ + --hash=sha256:28018ff09f2e49ab2b01a11329bd4e562fd65da406030b4a8001a3a4e80a1e34 # via google-cloud-bigquery parsy==2.2 \ --hash=sha256:5e981613d9d2d8b68012d1dd0afe928967bea2e4eefdb76c2f545af0dd02a9e7 \ @@ -2123,9 +2121,9 @@ propcache==0.4.1 \ # via # aiohttp # yarl -proto-plus==1.26.1 \ - --hash=sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66 \ - --hash=sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012 +proto-plus==1.27.0 \ + --hash=sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82 \ + --hash=sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4 # via # google-api-core # google-cloud-bigquery-storage @@ -2156,26 +2154,28 @@ protobuf==6.33.2 \ # proto-plus # pymilvus # substrait -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via # feast (setup.py) # pandas-gbq @@ -2446,9 +2446,9 @@ python-dotenv==1.2.1 \ # pydantic-settings # pymilvus # uvicorn -python-multipart==0.0.20 \ - --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 \ - --hash=sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13 +python-multipart==0.0.21 \ + --hash=sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92 \ + --hash=sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090 # via mcp pytz==2025.2 \ --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ @@ -2573,9 +2573,9 @@ rich==13.9.4 \ # fastapi-mcp # ibis-framework # typer -roman-numerals==3.1.0 \ - --hash=sha256:384e36fc1e8d4bd361bdb3672841faae7a345b3f708aae9895d074c878332551 \ - --hash=sha256:842ae5fd12912d62720c9aad8cab706e8c692556d01a38443e051ee6cc158d90 +roman-numerals==4.1.0 \ + --hash=sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2 \ + --hash=sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7 # via sphinx rpds-py==0.30.0 \ --hash=sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f \ @@ -2807,12 +2807,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -2831,7 +2833,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -2849,9 +2853,9 @@ sqlglot==25.20.2 \ --hash=sha256:169fe8308dd70d7bd40117b2221b62bdc7c4e2ea8eb07394b2a6146cdedf05ab \ --hash=sha256:cdbfd7ce3f2f39f32bd7b4c23fd9e0fd261636a6b14285b914e8def25fd0a567 # via ibis-framework -sse-starlette==3.0.3 \ - --hash=sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971 \ - --hash=sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431 +sse-starlette==3.1.1 \ + --hash=sha256:bb38f71ae74cfd86b529907a9fda5632195dfa6ae120f214ea4c890c7ee9d436 \ + --hash=sha256:bffa531420c1793ab224f63648c059bcadc412bf9fdb1301ac8de1cf9a67b7fb # via mcp starlette==0.50.0 \ --hash=sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca \ @@ -2859,6 +2863,7 @@ starlette==0.50.0 \ # via # fastapi # mcp + # sse-starlette substrait==0.24.2 \ --hash=sha256:743cc352e96b0927b2cd37cd5a8fdac0a96a68df9600bd104fc36aebd222a836 \ --hash=sha256:d1d475833566fa9d67eed3273456883c0568486ccced92b524b31709d2817e19 @@ -2948,17 +2953,17 @@ typeguard==4.4.4 \ --hash=sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74 \ --hash=sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e # via feast (setup.py) -typer==0.20.0 \ - --hash=sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37 \ - --hash=sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a +typer==0.21.0 \ + --hash=sha256:c79c01ca6b30af9fd48284058a7056ba0d3bf5cf10d0ff3d0c5b11b68c258ac6 \ + --hash=sha256:c87c0d2b6eee3b49c5c64649ec92425492c14488096dfbc8a0c2799b2f6f9c53 # via fastapi-mcp types-psutil==7.0.0.20250218 \ --hash=sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121 \ --hash=sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c # via feast (setup.py) -types-pymysql==1.1.0.20250916 \ - --hash=sha256:873eb9836bb5e3de4368cc7010ca72775f86e9692a5c7810f8c7f48da082e55b \ - --hash=sha256:98d75731795fcc06723a192786662bdfa760e1e00f22809c104fbb47bac5e29b +types-pymysql==1.1.0.20251220 \ + --hash=sha256:ae1c3df32a777489431e2e9963880a0df48f6591e0aa2fd3a6fabd9dee6eca54 \ + --hash=sha256:fa1082af7dea6c53b6caa5784241924b1296ea3a8d3bd060417352c5e10c0618 # via feast (setup.py) typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ @@ -2989,9 +2994,9 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas ujson==5.11.0 \ --hash=sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80 \ @@ -3079,9 +3084,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.12-requirements.txt b/sdk/python/requirements/py3.12-requirements.txt index 6e6f3194c68..697d4f25b0c 100644 --- a/sdk/python/requirements/py3.12-requirements.txt +++ b/sdk/python/requirements/py3.12-requirements.txt @@ -20,9 +20,9 @@ attrs==25.4.0 \ # via # jsonschema # referencing -bigtree==1.0.3 \ - --hash=sha256:18402a143130868b17ca84a74ca263e6f32f046d6978c30d244f8b94c4a01227 \ - --hash=sha256:99a18b6937a9b4ab8e560fec5c0720e10ebf37f84e44f9b5f47702c2e84c9aaa +bigtree==1.0.4 \ + --hash=sha256:e4af0c5bc0d2cd72e18442965e4509f642b16a0de65db6d0ec116e30f959010c \ + --hash=sha256:f58a3238bb9b1142d893c9de4921bfd18d435427c75e0c168dd580eabf6dc7fd # via feast (setup.py) certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ @@ -158,17 +158,17 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via feast (setup.py) -dask[dataframe]==2025.11.0 \ - --hash=sha256:08c35a8146c05c93b34f83cf651009129c42ee71762da7ca452fb7308641c2b8 \ - --hash=sha256:23d59e624b80ee05b7cc8df858682cca58262c4c3b197ccf61da0f6543c8f7c3 +dask[dataframe]==2025.12.0 \ + --hash=sha256:4213ce9c5d51d6d89337cff69de35d902aa0bf6abdb8a25c942a4d0281f3a598 \ + --hash=sha256:8d478f2aabd025e2453cf733ad64559de90cf328c20209e4574e9543707c3e1b # via feast (setup.py) dill==0.3.9 \ --hash=sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a \ --hash=sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c # via feast (setup.py) -fastapi==0.124.0 \ - --hash=sha256:260cd178ad75e6d259991f2fd9b0fee924b224850079df576a3ba604ce58f4e6 \ - --hash=sha256:91596bdc6dde303c318f06e8d2bc75eafb341fc793a0c9c92c0bc1db1ac52480 +fastapi==0.128.0 \ + --hash=sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a \ + --hash=sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d # via feast (setup.py) fsspec==2025.12.0 \ --hash=sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b \ @@ -247,83 +247,83 @@ jsonschema-specifications==2025.9.1 \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema -librt==0.7.3 \ - --hash=sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a \ - --hash=sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3 \ - --hash=sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678 \ - --hash=sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93 \ - --hash=sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc \ - --hash=sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e \ - --hash=sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec \ - --hash=sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7 \ - --hash=sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712 \ - --hash=sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5 \ - --hash=sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71 \ - --hash=sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f \ - --hash=sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a \ - --hash=sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2 \ - --hash=sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809 \ - --hash=sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18 \ - --hash=sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093 \ - --hash=sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e \ - --hash=sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a \ - --hash=sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292 \ - --hash=sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798 \ - --hash=sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65 \ - --hash=sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec \ - --hash=sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe \ - --hash=sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806 \ - --hash=sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42 \ - --hash=sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0 \ - --hash=sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed \ - --hash=sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b \ - --hash=sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70 \ - --hash=sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e \ - --hash=sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720 \ - --hash=sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af \ - --hash=sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0 \ - --hash=sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218 \ - --hash=sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b \ - --hash=sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea \ - --hash=sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c \ - --hash=sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e \ - --hash=sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f \ - --hash=sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a \ - --hash=sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90 \ - --hash=sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055 \ - --hash=sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e \ - --hash=sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910 \ - --hash=sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207 \ - --hash=sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a \ - --hash=sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b \ - --hash=sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b \ - --hash=sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a \ - --hash=sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed \ - --hash=sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7 \ - --hash=sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d \ - --hash=sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b \ - --hash=sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7 \ - --hash=sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e \ - --hash=sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258 \ - --hash=sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e \ - --hash=sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0 \ - --hash=sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd \ - --hash=sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010 \ - --hash=sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5 \ - --hash=sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620 \ - --hash=sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f \ - --hash=sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e \ - --hash=sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60 \ - --hash=sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b \ - --hash=sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445 \ - --hash=sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a \ - --hash=sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a \ - --hash=sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f \ - --hash=sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135 \ - --hash=sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51 \ - --hash=sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3 \ - --hash=sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c \ - --hash=sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc +librt==0.7.5 \ + --hash=sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee \ + --hash=sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1 \ + --hash=sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4 \ + --hash=sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899 \ + --hash=sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49 \ + --hash=sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d \ + --hash=sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760 \ + --hash=sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335 \ + --hash=sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8 \ + --hash=sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2 \ + --hash=sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec \ + --hash=sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b \ + --hash=sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0 \ + --hash=sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717 \ + --hash=sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325 \ + --hash=sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45 \ + --hash=sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d \ + --hash=sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233 \ + --hash=sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d \ + --hash=sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544 \ + --hash=sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802 \ + --hash=sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2 \ + --hash=sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d \ + --hash=sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f \ + --hash=sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169 \ + --hash=sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe \ + --hash=sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982 \ + --hash=sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2 \ + --hash=sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa \ + --hash=sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4 \ + --hash=sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4 \ + --hash=sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57 \ + --hash=sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26 \ + --hash=sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361 \ + --hash=sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad \ + --hash=sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e \ + --hash=sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf \ + --hash=sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f \ + --hash=sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af \ + --hash=sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2 \ + --hash=sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89 \ + --hash=sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904 \ + --hash=sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6 \ + --hash=sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276 \ + --hash=sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e \ + --hash=sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6 \ + --hash=sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409 \ + --hash=sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7 \ + --hash=sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a \ + --hash=sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4 \ + --hash=sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775 \ + --hash=sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203 \ + --hash=sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419 \ + --hash=sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5 \ + --hash=sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023 \ + --hash=sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b \ + --hash=sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b \ + --hash=sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d \ + --hash=sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3 \ + --hash=sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e \ + --hash=sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a \ + --hash=sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b \ + --hash=sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db \ + --hash=sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd \ + --hash=sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa \ + --hash=sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1 \ + --hash=sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805 \ + --hash=sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a \ + --hash=sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25 \ + --hash=sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6 \ + --hash=sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b \ + --hash=sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5 \ + --hash=sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416 \ + --hash=sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc \ + --hash=sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7 \ + --hash=sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96 # via mypy locket==1.0.0 \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ @@ -543,125 +543,123 @@ mmh3==5.2.0 \ --hash=sha256:fdfd3fb739f4e22746e13ad7ba0c6eedf5f454b18d11249724a388868e308ee4 \ --hash=sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110 # via feast (setup.py) -mypy==1.19.0 \ - --hash=sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9 \ - --hash=sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495 \ - --hash=sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018 \ - --hash=sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c \ - --hash=sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d \ - --hash=sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab \ - --hash=sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b \ - --hash=sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6 \ - --hash=sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299 \ - --hash=sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e \ - --hash=sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c \ - --hash=sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7 \ - --hash=sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364 \ - --hash=sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1 \ - --hash=sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee \ - --hash=sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2 \ - --hash=sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8 \ - --hash=sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835 \ - --hash=sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e \ - --hash=sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7 \ - --hash=sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f \ - --hash=sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18 \ - --hash=sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106 \ - --hash=sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39 \ - --hash=sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6 \ - --hash=sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e \ - --hash=sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134 \ - --hash=sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53 \ - --hash=sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7 \ - --hash=sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3 \ - --hash=sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5 \ - --hash=sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431 \ - --hash=sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d \ - --hash=sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760 \ - --hash=sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528 \ - --hash=sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7 \ - --hash=sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba \ - --hash=sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d +mypy==1.19.1 \ + --hash=sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd \ + --hash=sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b \ + --hash=sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1 \ + --hash=sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba \ + --hash=sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b \ + --hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045 \ + --hash=sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac \ + --hash=sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6 \ + --hash=sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a \ + --hash=sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24 \ + --hash=sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957 \ + --hash=sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042 \ + --hash=sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e \ + --hash=sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec \ + --hash=sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3 \ + --hash=sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718 \ + --hash=sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f \ + --hash=sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331 \ + --hash=sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1 \ + --hash=sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1 \ + --hash=sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13 \ + --hash=sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67 \ + --hash=sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2 \ + --hash=sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a \ + --hash=sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b \ + --hash=sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8 \ + --hash=sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376 \ + --hash=sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef \ + --hash=sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288 \ + --hash=sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75 \ + --hash=sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74 \ + --hash=sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250 \ + --hash=sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab \ + --hash=sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6 \ + --hash=sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247 \ + --hash=sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925 \ + --hash=sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e \ + --hash=sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e # via sqlalchemy mypy-extensions==1.1.0 \ --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 # via mypy -numpy==2.3.5 \ - --hash=sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b \ - --hash=sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae \ - --hash=sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3 \ - --hash=sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0 \ - --hash=sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b \ - --hash=sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa \ - --hash=sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28 \ - --hash=sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e \ - --hash=sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 \ - --hash=sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41 \ - --hash=sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e \ - --hash=sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63 \ - --hash=sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9 \ - --hash=sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8 \ - --hash=sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff \ - --hash=sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7 \ - --hash=sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139 \ - --hash=sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4 \ - --hash=sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748 \ - --hash=sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952 \ - --hash=sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd \ - --hash=sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b \ - --hash=sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce \ - --hash=sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f \ - --hash=sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5 \ - --hash=sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42 \ - --hash=sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7 \ - --hash=sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248 \ - --hash=sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e \ - --hash=sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3 \ - --hash=sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b \ - --hash=sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e \ - --hash=sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0 \ - --hash=sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa \ - --hash=sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a \ - --hash=sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5 \ - --hash=sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d \ - --hash=sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4 \ - --hash=sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c \ - --hash=sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52 \ - --hash=sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5 \ - --hash=sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d \ - --hash=sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1 \ - --hash=sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c \ - --hash=sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18 \ - --hash=sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7 \ - --hash=sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 \ - --hash=sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218 \ - --hash=sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2 \ - --hash=sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903 \ - --hash=sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c \ - --hash=sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c \ - --hash=sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234 \ - --hash=sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82 \ - --hash=sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39 \ - --hash=sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf \ - --hash=sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20 \ - --hash=sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946 \ - --hash=sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0 \ - --hash=sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9 \ - --hash=sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff \ - --hash=sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad \ - --hash=sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227 \ - --hash=sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10 \ - --hash=sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e \ - --hash=sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf \ - --hash=sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769 \ - --hash=sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310 \ - --hash=sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425 \ - --hash=sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013 \ - --hash=sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c \ - --hash=sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb \ - --hash=sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d \ - --hash=sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520 +numpy==2.4.0 \ + --hash=sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee \ + --hash=sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3 \ + --hash=sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5 \ + --hash=sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548 \ + --hash=sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d \ + --hash=sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9 \ + --hash=sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded \ + --hash=sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93 \ + --hash=sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b \ + --hash=sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8 \ + --hash=sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037 \ + --hash=sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83 \ + --hash=sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d \ + --hash=sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e \ + --hash=sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf \ + --hash=sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df \ + --hash=sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb \ + --hash=sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce \ + --hash=sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6 \ + --hash=sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667 \ + --hash=sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d \ + --hash=sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e \ + --hash=sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e \ + --hash=sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6 \ + --hash=sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471 \ + --hash=sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7 \ + --hash=sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c \ + --hash=sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344 \ + --hash=sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c \ + --hash=sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98 \ + --hash=sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344 \ + --hash=sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e \ + --hash=sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475 \ + --hash=sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e \ + --hash=sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98 \ + --hash=sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db \ + --hash=sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51 \ + --hash=sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa \ + --hash=sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934 \ + --hash=sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6 \ + --hash=sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f \ + --hash=sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3 \ + --hash=sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53 \ + --hash=sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479 \ + --hash=sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a \ + --hash=sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba \ + --hash=sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d \ + --hash=sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c \ + --hash=sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a \ + --hash=sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95 \ + --hash=sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f \ + --hash=sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea \ + --hash=sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db \ + --hash=sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b \ + --hash=sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d \ + --hash=sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346 \ + --hash=sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4 \ + --hash=sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4 \ + --hash=sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4 \ + --hash=sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6 \ + --hash=sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681 \ + --hash=sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63 \ + --hash=sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b \ + --hash=sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac \ + --hash=sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6 \ + --hash=sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544 \ + --hash=sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63 \ + --hash=sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9 \ + --hash=sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25 \ + --hash=sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059 \ + --hash=sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c \ + --hash=sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2 # via # feast (setup.py) # dask @@ -755,26 +753,28 @@ protobuf==6.33.2 \ --hash=sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43 \ --hash=sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4 # via feast (setup.py) -psutil==7.1.3 \ - --hash=sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc \ - --hash=sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251 \ - --hash=sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa \ - --hash=sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0 \ - --hash=sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab \ - --hash=sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264 \ - --hash=sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7 \ - --hash=sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 \ - --hash=sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b \ - --hash=sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74 \ - --hash=sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9 \ - --hash=sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7 \ - --hash=sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b \ - --hash=sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353 \ - --hash=sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 \ - --hash=sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1 \ - --hash=sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee \ - --hash=sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd \ - --hash=sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f +psutil==7.2.1 \ + --hash=sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 \ + --hash=sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266 \ + --hash=sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442 \ + --hash=sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79 \ + --hash=sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf \ + --hash=sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f \ + --hash=sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679 \ + --hash=sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 \ + --hash=sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49 \ + --hash=sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f \ + --hash=sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129 \ + --hash=sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67 \ + --hash=sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 \ + --hash=sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 \ + --hash=sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 \ + --hash=sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d \ + --hash=sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672 \ + --hash=sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a \ + --hash=sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc \ + --hash=sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3 \ + --hash=sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8 # via feast (setup.py) pyarrow==21.0.0 \ --hash=sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4 \ @@ -1195,12 +1195,14 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:1d8b4a7a8c9b537509d56d5cd10ecdcfbb95912d72480c8861524efecc6a3fff \ --hash=sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4 \ --hash=sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33 \ + --hash=sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56 \ --hash=sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177 \ --hash=sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b \ --hash=sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177 \ --hash=sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a \ --hash=sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0 \ --hash=sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2 \ + --hash=sha256:5964f832431b7cdfaaa22a660b4c7eb1dfcd6ed41375f67fd3e3440fd95cb3cc \ --hash=sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e \ --hash=sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e \ --hash=sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1 \ @@ -1219,7 +1221,9 @@ sqlalchemy[mypy]==2.0.45 \ --hash=sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b \ --hash=sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d \ --hash=sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6 \ + --hash=sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85 \ --hash=sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b \ + --hash=sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b \ --hash=sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0 \ --hash=sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c \ --hash=sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a \ @@ -1281,13 +1285,13 @@ typing-inspection==0.4.2 \ --hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 \ --hash=sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464 # via pydantic -tzdata==2025.2 \ - --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ - --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +tzdata==2025.3 \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.1 \ - --hash=sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f \ - --hash=sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ diff --git a/setup.py b/setup.py index 44344f5666d..d4ecc5ee0af 100644 --- a/setup.py +++ b/setup.py @@ -207,7 +207,7 @@ "mock==2.0.0", "moto==4.2.14", "mypy>=1.4.1,<1.11.3", - "urllib3>=1.25.4,<3", + "urllib3>=2.6.0,<3", "psutil==5.9.0", "py>=1.11.0", # https://github.com/pytest-dev/pytest/issues/10420 "pytest>=6.0.0,<8", From e484c12a65d4c23ebc0163d4b27843797e092204 Mon Sep 17 00:00:00 2001 From: Aniket Paluskar <64416568+aniketpalu@users.noreply.github.com> Date: Tue, 30 Dec 2025 20:36:08 +0530 Subject: [PATCH 07/26] feat: Offline Store historical features retrieval based on datetime range in Ray (#5738) * feat: Offline Store historical features retrieval based on datetime range in Ray Signed-off-by: Aniket Paluskar * Reforamatted code to fix lint issues Signed-off-by: Aniket Paluskar * preserve event_timestamp in non-entity mode for correct point-in-time joins Signed-off-by: Aniket Paluskar * Minor lint changes Signed-off-by: Aniket Paluskar * Added test cases for datetime range based feature retrieval in Ray Signed-off-by: Aniket Paluskar --------- Signed-off-by: Aniket Paluskar --- .../contrib/ray_offline_store/ray.py | 197 +++++++++++++++++- .../tests/test_ray_integration.py | 125 +++++++++++ 2 files changed, 318 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/ray.py b/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/ray.py index 98247c6c0e0..b7b3619c15a 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/ray.py +++ b/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/ray.py @@ -1,7 +1,7 @@ import logging import os import uuid -from datetime import datetime +from datetime import datetime, timedelta from pathlib import Path from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union @@ -1197,6 +1197,171 @@ def schema(self) -> pa.Schema: return pa.Table.from_pandas(df).schema +def _compute_non_entity_dates_ray( + feature_views: List[FeatureView], + start_date_opt: Optional[datetime], + end_date_opt: Optional[datetime], +) -> Tuple[datetime, datetime]: + # Why: derive bounded time window when no entity_df is provided using explicit dates or max TTL fallback + end_date = ( + make_tzaware(end_date_opt) if end_date_opt else make_tzaware(datetime.utcnow()) + ) + if start_date_opt is None: + max_ttl_seconds = 0 + for fv in feature_views: + if getattr(fv, "ttl", None): + try: + ttl_val = fv.ttl + if isinstance(ttl_val, timedelta): + max_ttl_seconds = max( + max_ttl_seconds, int(ttl_val.total_seconds()) + ) + except Exception: + pass + start_date = ( + end_date - timedelta(seconds=max_ttl_seconds) + if max_ttl_seconds > 0 + else end_date - timedelta(days=30) + ) + else: + start_date = make_tzaware(start_date_opt) + return start_date, end_date + + +def _make_filter_range(timestamp_field: str, start_date: datetime, end_date: datetime): + # Why: factory function for time-range filtering in Ray map_batches + def _filter_range(batch: pd.DataFrame) -> pd.Series: + ts = pd.to_datetime(batch[timestamp_field], utc=True) + return (ts >= start_date) & (ts <= end_date) + + return _filter_range + + +def _make_select_distinct_entity_timestamps(join_keys: List[str], timestamp_field: str): + # Why: factory function for distinct (entity_keys, event_timestamp) projection in Ray map_batches + # This preserves multiple transactions per entity ID with different timestamps for proper PIT joins + def _select_distinct_entity_timestamps(batch: pd.DataFrame) -> pd.DataFrame: + cols = [c for c in join_keys if c in batch.columns] + if timestamp_field in batch.columns: + # Rename timestamp to standardized event_timestamp + batch = batch.copy() + if timestamp_field != "event_timestamp": + batch["event_timestamp"] = batch[timestamp_field] + cols = cols + ["event_timestamp"] + if not cols: + return pd.DataFrame(columns=join_keys + ["event_timestamp"]) + return batch[cols].drop_duplicates().reset_index(drop=True) + + return _select_distinct_entity_timestamps + + +def _distinct_entities_for_feature_view_ray( + store: "RayOfflineStore", + config: RepoConfig, + fv: FeatureView, + registry: BaseRegistry, + project: str, + start_date: datetime, + end_date: datetime, +) -> Tuple[Dataset, List[str]]: + # Why: read minimal columns, filter by time, and project distinct (join_keys, event_timestamp) per FeatureView + # This preserves multiple transactions per entity ID for proper point-in-time joins + ray_wrapper = get_ray_wrapper() + entities = fv.entities or [] + entity_objs = [registry.get_entity(e, project) for e in entities] + original_join_keys, _rev_feats, timestamp_field, _created_col = _get_column_names( + fv, entity_objs + ) + + source_info = resolve_feature_view_source_with_fallback( + fv, config, is_materialization=False + ) + source_path = store._get_source_path(source_info.data_source, config) + required_columns = list(set(original_join_keys + [timestamp_field])) + ds = ray_wrapper.read_parquet(source_path, columns=required_columns) + + field_mapping = getattr(fv.batch_source, "field_mapping", None) + if field_mapping: + ds = apply_field_mapping(ds, field_mapping) + original_join_keys = [field_mapping.get(k, k) for k in original_join_keys] + timestamp_field = field_mapping.get(timestamp_field, timestamp_field) + + if fv.projection.join_key_map: + join_keys = [ + fv.projection.join_key_map.get(key, key) for key in original_join_keys + ] + else: + join_keys = original_join_keys + + ds = ensure_timestamp_compatibility(ds, [timestamp_field]) + ds = ds.filter(_make_filter_range(timestamp_field, start_date, end_date)) + # Extract distinct (entity_keys, event_timestamp) combinations - not just entity_keys + ds = ds.map_batches( + _make_select_distinct_entity_timestamps(join_keys, timestamp_field), + batch_format="pandas", + ) + return ds, join_keys + + +def _make_align_columns(all_join_keys: List[str], include_timestamp: bool = False): + # Why: factory function for schema alignment in Ray map_batches + # When include_timestamp=True, also aligns event_timestamp column for proper PIT joins + def _align_columns(batch: pd.DataFrame) -> pd.DataFrame: + batch = batch.copy() + output_cols = list(all_join_keys) + if include_timestamp: + output_cols = output_cols + ["event_timestamp"] + for k in output_cols: + if k not in batch.columns: + batch[k] = pd.NA + return batch[output_cols] + + return _align_columns + + +def _make_distinct_by_keys(keys: List[str], include_timestamp: bool = False): + # Why: factory function for deduplication in Ray map_batches + # When include_timestamp=True, deduplicates on (keys + event_timestamp) for proper PIT joins + def _distinct(batch: pd.DataFrame) -> pd.DataFrame: + subset = list(keys) + if include_timestamp and "event_timestamp" in batch.columns: + subset = subset + ["event_timestamp"] + return batch.drop_duplicates(subset=subset).reset_index(drop=True) + + return _distinct + + +def _align_and_union_entities_ray( + datasets: List[Dataset], + all_join_keys: List[str], + include_timestamp: bool = False, +) -> Dataset: + # Why: align schemas across FeatureViews and union to a unified entity set + # When include_timestamp=True, preserves distinct (entity_keys, event_timestamp) combinations + # for proper point-in-time joins with multiple transactions per entity + ray_wrapper = get_ray_wrapper() + output_cols = list(all_join_keys) + if include_timestamp: + output_cols = output_cols + ["event_timestamp"] + if not datasets: + return ray_wrapper.from_pandas(pd.DataFrame(columns=output_cols)) + + aligned = [ + ds.map_batches( + _make_align_columns(all_join_keys, include_timestamp=include_timestamp), + batch_format="pandas", + ) + for ds in datasets + ] + entity_ds = aligned[0] + for ds in aligned[1:]: + entity_ds = entity_ds.union(ds) + return entity_ds.map_batches( + _make_distinct_by_keys(all_join_keys, include_timestamp=include_timestamp), + batch_format="pandas", + ) + + class RayOfflineStore(OfflineStore): def __init__(self) -> None: self._staging_location: Optional[str] = None @@ -1874,17 +2039,41 @@ def get_historical_features( config: RepoConfig, feature_views: List[FeatureView], feature_refs: List[str], - entity_df: Union[pd.DataFrame, str], + entity_df: Optional[Union[pd.DataFrame, str]], registry: BaseRegistry, project: str, full_feature_names: bool = False, + **kwargs: Any, ) -> RetrievalJob: store = RayOfflineStore() store._init_ray(config) - # Load entity_df as Ray dataset for distributed processing + # Load or derive entity dataset for distributed processing ray_wrapper = get_ray_wrapper() - if isinstance(entity_df, str): + if entity_df is None: + # Non-entity mode: derive entity set from feature sources within a bounded time window + # Preserves distinct (entity_keys, event_timestamp) combinations for proper PIT joins + # This handles cases where multiple transactions per entity ID exist + start_date, end_date = _compute_non_entity_dates_ray( + feature_views, kwargs.get("start_date"), kwargs.get("end_date") + ) + per_view_entity_ds: List[Dataset] = [] + all_join_keys: List[str] = [] + for fv in feature_views: + ds, join_keys = _distinct_entities_for_feature_view_ray( + store, config, fv, registry, project, start_date, end_date + ) + per_view_entity_ds.append(ds) + for k in join_keys: + if k not in all_join_keys: + all_join_keys.append(k) + # Use include_timestamp=True to preserve actual event_timestamp from data + # instead of assigning a fixed end_date to all entities + entity_ds = _align_and_union_entities_ray( + per_view_entity_ds, all_join_keys, include_timestamp=True + ) + entity_df_sample = entity_ds.limit(1000).to_pandas() + elif isinstance(entity_df, str): entity_ds = ray_wrapper.read_csv(entity_df) entity_df_sample = entity_ds.limit(1000).to_pandas() else: diff --git a/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/tests/test_ray_integration.py b/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/tests/test_ray_integration.py index 5ab82f8ef47..0420054b8fb 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/tests/test_ray_integration.py +++ b/sdk/python/feast/infra/offline_stores/contrib/ray_offline_store/tests/test_ray_integration.py @@ -1,3 +1,5 @@ +from datetime import timedelta + import pandas as pd import pytest @@ -144,3 +146,126 @@ def test_ray_offline_store_persist(environment, universal_data_sources): import os assert os.path.exists(saved_path) + + +@pytest.mark.integration +@pytest.mark.universal_offline_stores +def test_ray_offline_store_non_entity_mode_basic(environment, universal_data_sources): + """Test historical features retrieval without entity_df (non-entity mode). + + This tests the basic functionality where entity_df=None and start_date/end_date + are provided to retrieve all features within the time range. + """ + store = environment.feature_store + + (entities, datasets, data_sources) = universal_data_sources + feature_views = construct_universal_feature_views(data_sources) + + store.apply( + [ + driver(), + feature_views.driver, + ] + ) + + # Use the environment's start and end dates for the query + start_date = environment.start_date + end_date = environment.end_date + + # Non-entity mode: entity_df=None with start_date and end_date + result_df = store.get_historical_features( + entity_df=None, + features=[ + "driver_stats:conv_rate", + "driver_stats:acc_rate", + "driver_stats:avg_daily_trips", + ], + full_feature_names=False, + start_date=start_date, + end_date=end_date, + ).to_df() + + # Verify data was retrieved + assert len(result_df) > 0, "Non-entity mode should return data" + assert "conv_rate" in result_df.columns + assert "acc_rate" in result_df.columns + assert "avg_daily_trips" in result_df.columns + assert "event_timestamp" in result_df.columns + assert "driver_id" in result_df.columns + + # Verify timestamps are within the requested range + result_df["event_timestamp"] = pd.to_datetime( + result_df["event_timestamp"], utc=True + ) + assert (result_df["event_timestamp"] >= start_date).all() + assert (result_df["event_timestamp"] <= end_date).all() + + +@pytest.mark.integration +@pytest.mark.universal_offline_stores +def test_ray_offline_store_non_entity_mode_preserves_multiple_timestamps( + environment, universal_data_sources +): + """Test that non-entity mode preserves multiple transactions per entity ID. + + This is a regression test for the fix that ensures distinct (entity_key, event_timestamp) + combinations are preserved, not just distinct entity keys. This is critical for + proper point-in-time joins when an entity has multiple transactions. + """ + store = environment.feature_store + + (entities, datasets, data_sources) = universal_data_sources + feature_views = construct_universal_feature_views(data_sources) + + store.apply( + [ + driver(), + feature_views.driver, + ] + ) + + now = _utc_now() + ts1 = pd.Timestamp(now - timedelta(hours=2)).round("ms") + ts2 = pd.Timestamp(now - timedelta(hours=1)).round("ms") + ts3 = pd.Timestamp(now).round("ms") + + # Write data with multiple timestamps for the same entity (driver_id=9001) + df_to_write = pd.DataFrame.from_dict( + { + "event_timestamp": [ts1, ts2, ts3], + "driver_id": [9001, 9001, 9001], # Same entity, different timestamps + "conv_rate": [0.1, 0.2, 0.3], + "acc_rate": [0.9, 0.8, 0.7], + "avg_daily_trips": [10, 20, 30], + "created": [ts1, ts2, ts3], + }, + ) + + store.write_to_offline_store( + feature_views.driver.name, df_to_write, allow_registry_cache=False + ) + + # Query without entity_df - should get all 3 rows for driver_id=9001 + result_df = store.get_historical_features( + entity_df=None, + features=[ + "driver_stats:conv_rate", + "driver_stats:acc_rate", + ], + full_feature_names=False, + start_date=ts1 - timedelta(minutes=1), + end_date=ts3 + timedelta(minutes=1), + ).to_df() + + # Filter to just our test entity + result_df = result_df[result_df["driver_id"] == 9001] + + # Verify we got all 3 rows with different timestamps (not just 1 row) + assert len(result_df) == 3, ( + f"Expected 3 rows for driver_id=9001 (one per timestamp), got {len(result_df)}" + ) + + # Verify the feature values are correct for each timestamp + result_df = result_df.sort_values("event_timestamp").reset_index(drop=True) + assert list(result_df["conv_rate"]) == [0.1, 0.2, 0.3] + assert list(result_df["acc_rate"]) == [0.9, 0.8, 0.7] From 103c5e9477a81671a6f405fde5145611afa67995 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 31 Dec 2025 06:42:04 +0200 Subject: [PATCH 08/26] fix: Support arro3 table schema with newer deltalake packages (#5799) * fix: Support arro3 table schema with newer deltalake packages Signed-off-by: Anton Shtarev * Fix lint Signed-off-by: Anton Shtarev --------- Signed-off-by: Anton Shtarev --- .../feast/infra/offline_stores/file_source.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sdk/python/feast/infra/offline_stores/file_source.py b/sdk/python/feast/infra/offline_stores/file_source.py index 12524ab4fc2..02d40ad770b 100644 --- a/sdk/python/feast/infra/offline_stores/file_source.py +++ b/sdk/python/feast/infra/offline_stores/file_source.py @@ -202,11 +202,18 @@ def get_table_column_names_and_types( "AWS_ENDPOINT_URL": str(self.s3_endpoint_override), } - schema = ( - DeltaTable(self.path, storage_options=storage_options) - .schema() - .to_pyarrow() - ) + delta_schema = DeltaTable( + self.path, storage_options=storage_options + ).schema() + if hasattr(delta_schema, "to_arrow"): + # deltalake >= 0.10.0 + arro3_schema = delta_schema.to_arrow() + schema = pyarrow.schema(arro3_schema) + elif hasattr(delta_schema, "to_pyarrow"): + # deltalake < 0.10.0 + schema = delta_schema.to_pyarrow() + else: + raise Exception("Unknown DeltaTable package version") else: raise Exception(f"Unknown FileFormat -> {self.file_format}") From 58d0325477626cb5637edd824505bf57a95a422a Mon Sep 17 00:00:00 2001 From: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> Date: Fri, 2 Jan 2026 08:58:16 +0100 Subject: [PATCH 09/26] fix: Spark Materialization Engine Cannot Infer Schema (#5806) * fix: build Spark DataFrame from Arrow with schema and empty handling(#5594) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> * fix: build Spark DataFrame from Arrow with schema and empty handling(#5594) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --------- Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --- sdk/python/feast/infra/compute_engines/spark/nodes.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/infra/compute_engines/spark/nodes.py b/sdk/python/feast/infra/compute_engines/spark/nodes.py index fa5a7bd6208..124ce65ff90 100644 --- a/sdk/python/feast/infra/compute_engines/spark/nodes.py +++ b/sdk/python/feast/infra/compute_engines/spark/nodes.py @@ -4,6 +4,7 @@ import pandas as pd from pyspark.sql import DataFrame, SparkSession, Window from pyspark.sql import functions as F +from pyspark.sql.pandas.types import from_arrow_schema from feast import BatchFeatureView, StreamFeatureView from feast.aggregation import Aggregation @@ -80,7 +81,14 @@ def execute(self, context: ExecutionContext) -> DAGValue: if isinstance(retrieval_job, SparkRetrievalJob): spark_df = cast(SparkRetrievalJob, retrieval_job).to_spark_df() else: - spark_df = self.spark_session.createDataFrame(retrieval_job.to_arrow()) + arrow_table = retrieval_job.to_arrow() + if arrow_table.num_rows == 0: + spark_schema = from_arrow_schema(arrow_table.schema) + spark_df = self.spark_session.createDataFrame( + self.spark_session.sparkContext.emptyRDD(), schema=spark_schema + ) + else: + spark_df = self.spark_session.createDataFrame(arrow_table.to_pandas()) return DAGValue( data=spark_df, From 5b787afce9263a5cc37bf69119d505d3ffd5f13c Mon Sep 17 00:00:00 2001 From: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> Date: Fri, 2 Jan 2026 09:00:49 +0100 Subject: [PATCH 10/26] feat: Support staging for spark materialization (#5671) (#5797) * feat: support staging for spark materialization (#5671) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> * feat: support staging for spark materialization ([#5671](https://github.com/feast-dev/feast/issues/5671)) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --------- Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --- docs/reference/offline-stores/spark.md | 6 +- .../contrib/spark_offline_store/spark.py | 208 ++++++++++++++---- .../contrib/spark_offline_store/test_spark.py | 208 ++++++++++++++++++ 3 files changed, 374 insertions(+), 48 deletions(-) diff --git a/docs/reference/offline-stores/spark.md b/docs/reference/offline-stores/spark.md index 2e2facba64a..7f2d4094785 100644 --- a/docs/reference/offline-stores/spark.md +++ b/docs/reference/offline-stores/spark.md @@ -32,9 +32,13 @@ offline_store: spark.sql.session.timeZone: "UTC" spark.sql.execution.arrow.fallback.enabled: "true" spark.sql.execution.arrow.pyspark.enabled: "true" + # Optional: spill large materializations to the staging location instead of collecting in the driver + staging_location: "s3://my-bucket/tmp/feast" online_store: path: data/online_store.db ``` + +> The `staging_location` can point to object storage (like S3, GCS, or Azure blobs) or a local filesystem directory (e.g., `/tmp/feast/staging`) to spill large materialization outputs before reading them back into Feast. {% endcode %} The full set of configuration options is available in [SparkOfflineStoreConfig](https://rtd.feast.dev/en/master/#feast.infra.offline_stores.contrib.spark_offline_store.spark.SparkOfflineStoreConfig). @@ -60,7 +64,7 @@ Below is a matrix indicating which functionality is supported by `SparkRetrieval | export to arrow table | yes | | export to arrow batches | no | | export to SQL | no | -| export to data lake (S3, GCS, etc.) | no | +| export to data lake (S3, GCS, etc.) | yes | | export to data warehouse | no | | export as Spark dataframe | yes | | local execution of Python-based on-demand transforms | no | diff --git a/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py b/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py index 47e76a014f0..af83d303504 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py +++ b/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py @@ -16,6 +16,7 @@ Union, cast, ) +from urllib.parse import urlparse if TYPE_CHECKING: from feast.saved_dataset import ValidationReference @@ -24,6 +25,7 @@ import pandas import pandas as pd import pyarrow +import pyarrow.dataset as ds import pyarrow.parquet as pq import pyspark from pydantic import StrictStr @@ -445,8 +447,43 @@ def _to_df_internal(self, timeout: Optional[int] = None) -> pd.DataFrame: def _to_arrow_internal(self, timeout: Optional[int] = None) -> pyarrow.Table: """Return dataset as pyarrow Table synchronously""" + if self._should_use_staging_for_arrow(): + return self._to_arrow_via_staging() + return pyarrow.Table.from_pandas(self._to_df_internal(timeout=timeout)) + def _should_use_staging_for_arrow(self) -> bool: + offline_store = getattr(self._config, "offline_store", None) + return bool( + isinstance(offline_store, SparkOfflineStoreConfig) + and getattr(offline_store, "staging_location", None) + ) + + def _to_arrow_via_staging(self) -> pyarrow.Table: + paths = self.to_remote_storage() + if not paths: + return pyarrow.table({}) + + parquet_paths = _filter_parquet_files(paths) + if not parquet_paths: + return pyarrow.table({}) + + normalized_paths = self._normalize_staging_paths(parquet_paths) + dataset = ds.dataset(normalized_paths, format="parquet") + return dataset.to_table() + + def _normalize_staging_paths(self, paths: List[str]) -> List[str]: + """Normalize staging paths for PyArrow datasets.""" + normalized = [] + for path in paths: + if path.startswith("file://"): + normalized.append(path[len("file://") :]) + elif "://" in path: + normalized.append(path) + else: + normalized.append(path) + return normalized + def to_feast_df( self, validation_reference: Optional["ValidationReference"] = None, @@ -508,55 +545,53 @@ def supports_remote_storage_export(self) -> bool: def to_remote_storage(self) -> List[str]: """Currently only works for local and s3-based staging locations""" - if self.supports_remote_storage_export(): - sdf: pyspark.sql.DataFrame = self.to_spark_df() - - if self._config.offline_store.staging_location.startswith("/"): - local_file_staging_location = os.path.abspath( - self._config.offline_store.staging_location - ) - - # write to staging location - output_uri = os.path.join( - str(local_file_staging_location), str(uuid.uuid4()) - ) - sdf.write.parquet(output_uri) - - return _list_files_in_folder(output_uri) - elif self._config.offline_store.staging_location.startswith("s3://"): - from feast.infra.utils import aws_utils - - spark_compatible_s3_staging_location = ( - self._config.offline_store.staging_location.replace( - "s3://", "s3a://" - ) - ) - - # write to staging location - output_uri = os.path.join( - str(spark_compatible_s3_staging_location), str(uuid.uuid4()) - ) - sdf.write.parquet(output_uri) - - return aws_utils.list_s3_files( - self._config.offline_store.region, output_uri - ) - elif self._config.offline_store.staging_location.startswith("hdfs://"): - output_uri = os.path.join( - self._config.offline_store.staging_location, str(uuid.uuid4()) - ) - sdf.write.parquet(output_uri) - spark_session = get_spark_session_or_start_new_with_repoconfig( - store_config=self._config.offline_store - ) - return _list_hdfs_files(spark_session, output_uri) - else: - raise NotImplementedError( - "to_remote_storage is only implemented for file://, s3:// and hdfs:// uri schemes" - ) + if not self.supports_remote_storage_export(): + raise NotImplementedError() + + sdf: pyspark.sql.DataFrame = self.to_spark_df() + staging_location = self._config.offline_store.staging_location + + if staging_location.startswith("/"): + local_file_staging_location = os.path.abspath(staging_location) + output_uri = os.path.join(local_file_staging_location, str(uuid.uuid4())) + sdf.write.parquet(output_uri) + return _list_files_in_folder(output_uri) + elif staging_location.startswith("s3://"): + from feast.infra.utils import aws_utils + spark_compatible_s3_staging_location = staging_location.replace( + "s3://", "s3a://" + ) + output_uri = os.path.join( + spark_compatible_s3_staging_location, str(uuid.uuid4()) + ) + sdf.write.parquet(output_uri) + s3_uri_for_listing = output_uri.replace("s3a://", "s3://", 1) + return aws_utils.list_s3_files( + self._config.offline_store.region, s3_uri_for_listing + ) + elif staging_location.startswith("gs://"): + output_uri = os.path.join(staging_location, str(uuid.uuid4())) + sdf.write.parquet(output_uri) + return _list_gcs_files(output_uri) + elif staging_location.startswith(("wasbs://", "abfs://", "abfss://")) or ( + staging_location.startswith("https://") + and ".blob.core.windows.net" in staging_location + ): + output_uri = os.path.join(staging_location, str(uuid.uuid4())) + sdf.write.parquet(output_uri) + return _list_azure_files(output_uri) + elif staging_location.startswith("hdfs://"): + output_uri = os.path.join(staging_location, str(uuid.uuid4())) + sdf.write.parquet(output_uri) + spark_session = get_spark_session_or_start_new_with_repoconfig( + store_config=self._config.offline_store + ) + return _list_hdfs_files(spark_session, output_uri) else: - raise NotImplementedError() + raise NotImplementedError( + "to_remote_storage is only implemented for file://, s3://, gs://, azure, and hdfs uri schemes" + ) @property def metadata(self) -> Optional[RetrievalMetadata]: @@ -789,6 +824,10 @@ def _list_files_in_folder(folder): return files +def _filter_parquet_files(paths: List[str]) -> List[str]: + return [path for path in paths if path.endswith(".parquet")] + + def _list_hdfs_files(spark_session: SparkSession, uri: str) -> List[str]: jvm = spark_session._jvm jsc = spark_session._jsc @@ -805,6 +844,81 @@ def _list_hdfs_files(spark_session: SparkSession, uri: str) -> List[str]: return files +def _list_gcs_files(path: str) -> List[str]: + try: + from google.cloud import storage + except ImportError as e: + from feast.errors import FeastExtrasDependencyImportError + + raise FeastExtrasDependencyImportError("gcp", str(e)) + + assert path.startswith("gs://"), "GCS path must start with gs://" + bucket_path = path[len("gs://") :] + if "/" in bucket_path: + bucket, prefix = bucket_path.split("/", 1) + else: + bucket, prefix = bucket_path, "" + + client = storage.Client() + bucket_obj = client.bucket(bucket) + blobs = bucket_obj.list_blobs(prefix=prefix) + + files = [] + for blob in blobs: + if not blob.name.endswith("/"): + files.append(f"gs://{bucket}/{blob.name}") + return files + + +def _list_azure_files(path: str) -> List[str]: + try: + from azure.identity import DefaultAzureCredential + from azure.storage.blob import BlobServiceClient + except ImportError as e: + from feast.errors import FeastExtrasDependencyImportError + + raise FeastExtrasDependencyImportError("azure", str(e)) + + parsed = urlparse(path) + scheme = parsed.scheme + + if scheme in ("wasbs", "abfs", "abfss"): + if "@" not in parsed.netloc: + raise ValueError("Azure staging URI must include container@account host") + container, account_host = parsed.netloc.split("@", 1) + account_url = f"https://{account_host}" + base = f"{scheme}://{container}@{account_host}" + prefix = parsed.path.lstrip("/") + else: + account_url = f"{parsed.scheme}://{parsed.netloc}" + container_and_prefix = parsed.path.lstrip("/").split("/", 1) + container = container_and_prefix[0] + base = f"{account_url}/{container}" + prefix = container_and_prefix[1] if len(container_and_prefix) > 1 else "" + + credential = os.environ.get("AZURE_STORAGE_KEY") or os.environ.get( + "AZURE_STORAGE_ACCOUNT_KEY" + ) + if credential: + client = BlobServiceClient(account_url=account_url, credential=credential) + else: + default_credential = DefaultAzureCredential( + exclude_shared_token_cache_credential=True + ) + client = BlobServiceClient( + account_url=account_url, credential=default_credential + ) + + container_client = client.get_container_client(container) + blobs = container_client.list_blobs(name_starts_with=prefix if prefix else None) + + files = [] + for blob in blobs: + if not blob.name.endswith("/"): + files.append(f"{base}/{blob.name}") + return files + + def _cast_data_frame( df_new: pyspark.sql.DataFrame, df_existing: pyspark.sql.DataFrame ) -> pyspark.sql.DataFrame: diff --git a/sdk/python/tests/unit/infra/offline_stores/contrib/spark_offline_store/test_spark.py b/sdk/python/tests/unit/infra/offline_stores/contrib/spark_offline_store/test_spark.py index 22c75ebf387..fbbba055e56 100644 --- a/sdk/python/tests/unit/infra/offline_stores/contrib/spark_offline_store/test_spark.py +++ b/sdk/python/tests/unit/infra/offline_stores/contrib/spark_offline_store/test_spark.py @@ -1,13 +1,17 @@ +import os from datetime import datetime from unittest.mock import MagicMock, patch import pandas as pd +import pyarrow as pa from feast.entity import Entity from feast.feature_view import FeatureView, Field +from feast.infra.offline_stores.contrib.spark_offline_store import spark as spark_module from feast.infra.offline_stores.contrib.spark_offline_store.spark import ( SparkOfflineStore, SparkOfflineStoreConfig, + SparkRetrievalJob, ) from feast.infra.offline_stores.contrib.spark_offline_store.spark_source import ( SparkSource, @@ -504,3 +508,207 @@ def test_get_historical_features_non_entity_with_only_end_date(mock_get_spark_se # Verify data: mocked DataFrame flows to Pandas pdf = retrieval_job._to_df_internal() assert pdf.equals(expected_pdf) + + +def test_to_arrow_uses_staging_when_enabled(monkeypatch, tmp_path): + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location=str(tmp_path), + ), + ) + + job = SparkRetrievalJob( + spark_session=MagicMock(), + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + expected_table = pa.table({"a": [1]}) + dataset_mock = MagicMock() + + monkeypatch.setattr( + job, "to_remote_storage", MagicMock(return_value=["file:///test.parquet"]) + ) + monkeypatch.setattr( + spark_module.ds, "dataset", MagicMock(return_value=dataset_mock) + ) + dataset_mock.to_table.return_value = expected_table + + result = job._to_arrow_internal() + + job.to_remote_storage.assert_called_once() + spark_module.ds.dataset.assert_called_once_with(["/test.parquet"], format="parquet") + assert result.equals(expected_table) + + +def test_to_arrow_normalizes_local_staging_paths(monkeypatch, tmp_path): + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location=str(tmp_path / "local"), + ), + ) + + job = SparkRetrievalJob( + spark_session=MagicMock(), + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + expected_table = pa.table({"a": [1]}) + dataset_mock = MagicMock() + + raw_path = os.path.join(str(tmp_path), "staged.parquet") + monkeypatch.setattr(job, "to_remote_storage", MagicMock(return_value=[raw_path])) + monkeypatch.setattr( + spark_module.ds, "dataset", MagicMock(return_value=dataset_mock) + ) + dataset_mock.to_table.return_value = expected_table + + result = job._to_arrow_internal() + + job.to_remote_storage.assert_called_once() + spark_module.ds.dataset.assert_called_once_with([raw_path], format="parquet") + assert result.equals(expected_table) + + +def test_to_arrow_falls_back_to_pandas_when_staging_disabled(monkeypatch): + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location=None, + ), + ) + + job = SparkRetrievalJob( + spark_session=MagicMock(), + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + pdf = pd.DataFrame({"a": [1]}) + monkeypatch.setattr(job, "_to_df_internal", MagicMock(return_value=pdf)) + monkeypatch.setattr( + job, "to_remote_storage", MagicMock(side_effect=AssertionError("not called")) + ) + + result = job._to_arrow_internal() + + assert result.equals(pa.Table.from_pandas(pdf)) + + +@patch("feast.infra.utils.aws_utils.list_s3_files") +def test_to_remote_storage_lists_with_s3_scheme(mock_list_s3_files): + spark_df = MagicMock() + spark_df.write.parquet = MagicMock() + spark_session = MagicMock() + spark_session.sql.return_value = spark_df + + mock_list_s3_files.return_value = ["s3://bucket/prefix/file.parquet"] + + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location="s3://bucket/prefix", + region="us-west-2", + ), + ) + + job = SparkRetrievalJob( + spark_session=spark_session, + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + result = job.to_remote_storage() + + assert spark_df.write.parquet.call_args[0][0].startswith("s3a://bucket/prefix") + assert mock_list_s3_files.call_args[0][1].startswith("s3://bucket/prefix") + assert result == mock_list_s3_files.return_value + + +@patch("feast.infra.offline_stores.contrib.spark_offline_store.spark._list_gcs_files") +def test_to_remote_storage_lists_with_gcs_scheme(mock_list_gcs_files): + spark_df = MagicMock() + spark_df.write.parquet = MagicMock() + spark_session = MagicMock() + spark_session.sql.return_value = spark_df + + mock_list_gcs_files.return_value = ["gs://bucket/prefix/file.parquet"] + + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location="gs://bucket/prefix", + ), + ) + + job = SparkRetrievalJob( + spark_session=spark_session, + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + result = job.to_remote_storage() + + assert spark_df.write.parquet.call_args[0][0].startswith("gs://bucket/prefix") + mock_list_gcs_files.assert_called_once() + assert result == mock_list_gcs_files.return_value + + +@patch("feast.infra.offline_stores.contrib.spark_offline_store.spark._list_azure_files") +def test_to_remote_storage_lists_with_azure_scheme(mock_list_azure_files): + spark_df = MagicMock() + spark_df.write.parquet = MagicMock() + spark_session = MagicMock() + spark_session.sql.return_value = spark_df + + mock_list_azure_files.return_value = [ + "wasbs://container@account.blob.core.windows.net/path/file.parquet" + ] + + repo_config = RepoConfig( + project="test_project", + registry="test_registry", + provider="local", + offline_store=SparkOfflineStoreConfig( + type="spark", + staging_location="wasbs://container@account.blob.core.windows.net/path", + ), + ) + + job = SparkRetrievalJob( + spark_session=spark_session, + query="select 1", + full_feature_names=False, + config=repo_config, + ) + + result = job.to_remote_storage() + + assert spark_df.write.parquet.call_args[0][0].startswith( + "wasbs://container@account.blob.core.windows.net/path" + ) + mock_list_azure_files.assert_called_once() + assert result == mock_list_azure_files.return_value From b16fa09dace4665de1013acdc8057493aa651ac4 Mon Sep 17 00:00:00 2001 From: Srihari Venkataramaiah Date: Fri, 2 Jan 2026 13:32:58 +0530 Subject: [PATCH 11/26] test: Update Feast Connection workbench tests (#5794) test: Update Workbench Connection Tests Signed-off-by: Srihari --- .../feast_wb_connection_integration_test.go | 66 +++++- .../test/e2e_rhoai/feast_wb_milvus_test.go | 11 +- .../feast_wb_ray_offline_store_test.go | 7 +- .../test/e2e_rhoai/resources/custom-nb.yaml | 2 + .../feast-wb-connection-credit-scoring.ipynb | 221 ++++-------------- ...-test.ipynb => feast-wb-milvus-test.ipynb} | 0 .../test/utils/notebook_util.go | 25 +- infra/feast-operator/test/utils/test_util.go | 98 ++++++++ 8 files changed, 239 insertions(+), 191 deletions(-) rename infra/feast-operator/test/e2e_rhoai/resources/{feast-test.ipynb => feast-wb-milvus-test.ipynb} (100%) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go index 5b42bfe1276..43bfff17c2f 100644 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go @@ -22,6 +22,7 @@ package e2erhoai import ( "fmt" + "time" utils "github.com/feast-dev/feast/infra/feast-operator/test/utils" . "github.com/onsi/ginkgo/v2" @@ -43,6 +44,60 @@ var _ = Describe("Feast Workbench Integration Connection Testing", Ordered, func feastCRName = "credit-scoring" ) + // Verify feast ConfigMap + verifyFeastConfigMap := func(authEnabled bool) { + feastConfigMapName := "jupyter-nb-kube-3aadmin-feast-config" + configMapKey := "credit_scoring_local" + By(fmt.Sprintf("Listing ConfigMaps and verifying %s exists with correct content", feastConfigMapName)) + + // Build expected content based on auth type + expectedContent := []string{ + "project: credit_scoring_local", + } + if authEnabled { + expectedContent = append(expectedContent, "type: kubernetes") + } else { + expectedContent = append(expectedContent, "type: no_auth") + } + + // First, list ConfigMaps and check if target ConfigMap exists + // Retry with polling since the ConfigMap may be created asynchronously + const maxRetries = 5 + const retryInterval = 5 * time.Second + var configMapExists bool + var err error + + for i := 0; i < maxRetries; i++ { + exists, listErr := utils.VerifyConfigMapExistsInList(namespace, feastConfigMapName) + if listErr != nil { + err = listErr + if i < maxRetries-1 { + fmt.Printf("Failed to list ConfigMaps, retrying in %v... (attempt %d/%d)\n", retryInterval, i+1, maxRetries) + time.Sleep(retryInterval) + continue + } + } else if exists { + configMapExists = true + fmt.Printf("ConfigMap %s found in ConfigMap list\n", feastConfigMapName) + break + } + + if i < maxRetries-1 { + fmt.Printf("ConfigMap %s not found in list yet, retrying in %v... (attempt %d/%d)\n", feastConfigMapName, retryInterval, i+1, maxRetries) + time.Sleep(retryInterval) + } + } + + if !configMapExists { + Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to find ConfigMap %s in ConfigMap list after %d attempts: %v", feastConfigMapName, maxRetries, err)) + } + + // Once ConfigMap exists in list, verify content (project name and auth type) + err = utils.VerifyFeastConfigMapContent(namespace, feastConfigMapName, configMapKey, expectedContent) + Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to verify Feast ConfigMap %s content: %v", feastConfigMapName, err)) + fmt.Printf("Feast ConfigMap %s verified successfully with project and auth type\n", feastConfigMapName) + } + // Parameterized test function that handles both auth and non-auth scenarios runFeastWorkbenchIntegration := func(authEnabled bool) { // Apply permissions only if auth is enabled @@ -51,8 +106,15 @@ var _ = Describe("Feast Workbench Integration Connection Testing", Ordered, func utils.ApplyFeastPermissions(permissionFile, "/feast-data/credit_scoring_local/feature_repo/permissions.py", namespace, feastDeploymentName) } - // Use the shared RunNotebookTest function for common setup and execution - utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) + // Create notebook with all setup steps + // Pass feastProject parameter to set the opendatahub.io/feast-config annotation + utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "credit_scoring_local") + + // Verify Feast ConfigMap was created with correct auth type + verifyFeastConfigMap(authEnabled) + + // Monitor notebook execution + utils.MonitorNotebookTest(namespace, notebookName) } BeforeAll(func() { diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go index 4849670399d..b4e1d37b827 100644 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go @@ -32,11 +32,11 @@ var _ = Describe("Feast Jupyter Notebook Testing", Ordered, func() { namespace = "test-ns-feast-wb" configMapName = "feast-wb-cm" rolebindingName = "rb-feast-test" - notebookFile = "test/e2e_rhoai/resources/feast-test.ipynb" + notebookFile = "test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb" pvcFile = "test/e2e_rhoai/resources/pvc.yaml" notebookPVC = "jupyterhub-nb-kube-3aadmin-pvc" testDir = "/test/e2e_rhoai" - notebookName = "feast-test.ipynb" + notebookName = "feast-wb-milvus-test.ipynb" feastMilvusTest = "TestFeastMilvusNotebook" ) @@ -54,7 +54,12 @@ var _ = Describe("Feast Jupyter Notebook Testing", Ordered, func() { Context("Feast Jupyter Notebook Test", func() { It("Should create and run a "+feastMilvusTest+" successfully", func() { - utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) + // Create notebook with all setup steps + // Pass empty string for feastProject to keep annotation empty + utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "") + + // Monitor notebook execution + utils.MonitorNotebookTest(namespace, notebookName) }) }) }) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go index a7e482063f0..eb467ad07ff 100644 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go +++ b/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go @@ -71,7 +71,12 @@ var _ = Describe("Feast Jupyter Notebook Testing with Ray Offline Store", Ordere Context("Feast Jupyter Notebook Test with Ray Offline store", func() { It("Should create and run a "+feastRayTest+" successfully", func() { - utils.RunNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir) + // Create notebook with all setup steps + // Pass empty string for feastProject to keep annotation empty + utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "") + + // Monitor notebook execution + utils.MonitorNotebookTest(namespace, notebookName) }) }) }) diff --git a/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml b/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml index 6acf8bdf0cb..6dd9304e4b9 100644 --- a/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml +++ b/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml @@ -13,12 +13,14 @@ metadata: notebooks.opendatahub.io/last-size-selection: Small opendatahub.io/link: https://jupyter-nb-kube-3aadmin-{{.Namespace}}.{{.IngressDomain}}/notebook/{{.Namespace}}/jupyter-nb-kube-3aadmin opendatahub.io/username: {{.Username}} + opendatahub.io/feast-config: {{.FeastProject}} generation: 1 labels: app: jupyter-nb-kube-3aadmin opendatahub.io/dashboard: "true" opendatahub.io/odh-managed: "true" opendatahub.io/user: {{.Username}} + opendatahub.io/feast-integration: 'true' name: jupyter-nb-kube-3aadmin namespace: {{.Namespace}} spec: diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb index 6a775b772a5..39e1f9c6e37 100755 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb +++ b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb @@ -16,6 +16,45 @@ "print(f\"✅ Found Expected Feast version: {actual_version} in workbench\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# --- Configuration Variables ---\n", + "import os \n", + "\n", + "# Fetch token and server directly from oc CLI\n", + "import subprocess\n", + "\n", + "def oc(cmd):\n", + " return subprocess.check_output(cmd, shell=True).decode(\"utf-8\").strip()\n", + "\n", + "token = oc(\"oc whoami -t\")\n", + "server = oc(\"oc whoami --show-server\")\n", + "namespace = os.environ.get(\"NAMESPACE\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!oc login --token=$token --server=$server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Add user permission to namespace\n", + "!oc adm policy add-role-to-user admin $(oc whoami) -n $namespace" + ] + }, { "cell_type": "code", "execution_count": null, @@ -34,7 +73,7 @@ ").read()\n", "\n", "# Save the configmap data into an environment variable (if needed)\n", - "os.environ[\"CONFIGMAP_DATA\"] = yaml_content\n" + "os.environ[\"CONFIGMAP_DATA\"] = yaml_content" ] }, { @@ -43,186 +82,8 @@ "metadata": {}, "outputs": [], "source": [ - "#!/usr/bin/env python3\n", - "import os\n", - "import json\n", - "import yaml\n", - "from pathlib import Path\n", - "from typing import Dict, List, Any, Optional\n", "from feast import FeatureStore\n", - "from feast.repo_config import RepoConfig\n", - "\n", - "def create_feature_store_yaml(config_content: str, config_name: str) -> str:\n", - " \"\"\"\n", - " Create a feature_store.yaml file from config content.\n", - " \n", - " Args:\n", - " config_content: YAML content as string\n", - " config_name: Name identifier for the config (used for filename)\n", - " \n", - " Returns:\n", - " Path to the created YAML file\n", - " \"\"\"\n", - " # Parse the YAML content to validate it\n", - " try:\n", - " config_dict = yaml.safe_load(config_content)\n", - " except yaml.YAMLError as e:\n", - " raise ValueError(f\"Failed to parse YAML content for {config_name}: {e}\")\n", - " \n", - " # Ensure required fields are present\n", - " required_fields = ['project', 'registry', 'provider']\n", - " for field in required_fields:\n", - " if field not in config_dict:\n", - " raise ValueError(f\"Failed to create config {config_name}: missing required field '{field}'\")\n", - " \n", - " # Create filename\n", - " filename = f\"feature_store_{config_name}.yaml\"\n", - " filepath = Path(filename)\n", - " \n", - " # Write the YAML file\n", - " with open(filepath, 'w') as f:\n", - " yaml.dump(config_dict, f, default_flow_style=False, sort_keys=False)\n", - " \n", - " return str(filepath)\n", - "\n", - "\n", - "def create_feature_store_object(yaml_file_path: str) -> FeatureStore:\n", - " \"\"\"\n", - " Create a FeatureStore object from a YAML file.\n", - " \n", - " Args:\n", - " yaml_file_path: Path to the feature_store.yaml file\n", - " \n", - " Returns:\n", - " FeatureStore object\n", - " \"\"\"\n", - " try:\n", - " # Create FeatureStore from the YAML file\n", - " fs = FeatureStore(fs_yaml_file=Path(yaml_file_path))\n", - " return fs\n", - " except Exception as e:\n", - " raise RuntimeError(f\"Failed to create FeatureStore object from {yaml_file_path}: {e}\")\n", - "\n", - "\n", - "def process_client_configs(client_configs: Dict[str, str]) -> Dict[str, Dict[str, Any]]:\n", - " \"\"\"\n", - " Process multiple client config YAML contents and create feature stores.\n", - " \n", - " Args:\n", - " client_configs: Dictionary mapping config names to YAML content strings\n", - " \n", - " Returns:\n", - " Dictionary with results for each config\n", - " \"\"\"\n", - " results = {}\n", - " created_yamls = []\n", - " feature_stores = {}\n", - " \n", - " print(\"Creating feature store YAMLs and objects...\")\n", - " print(\"=\" * 50)\n", - " \n", - " for config_name, config_content in client_configs.items():\n", - " try:\n", - " print(f\"\\nProcessing config: {config_name}\")\n", - "\n", - " # Create YAML file\n", - " yaml_path = create_feature_store_yaml(config_content, config_name)\n", - " created_yamls.append(yaml_path)\n", - " print(f\"✓ Created YAML file: {yaml_path}\")\n", - " \n", - " # Create FeatureStore object\n", - " fs = create_feature_store_object(yaml_path)\n", - " fs_var_name = f\"fs_{fs.project}\"\n", - " globals()[fs_var_name] = fs\n", - " feature_stores[config_name] = fs_var_name\n", - " print(f\"✓ Created FeatureStore object: {fs_var_name}\")\n", - "\n", - " results[config_name] = {\n", - " 'yaml_path': yaml_path,\n", - " 'feature_store': fs_var_name,\n", - " 'project_name': fs.project,\n", - " 'success': True,\n", - " 'error': None\n", - " }\n", - " \n", - " except Exception as e:\n", - " print(f\"✗ Failed to process config {config_name}: {e}\")\n", - " results[config_name] = {\n", - " 'yaml_path': None,\n", - " 'feature_store': None,\n", - " 'project_name': None,\n", - " 'success': False,\n", - " 'error': str(e)\n", - " }\n", - " \n", - " return results\n", - "\n", - "\n", - "def print_summary(results: Dict[str, Dict[str, Any]]) -> None:\n", - " \"\"\"\n", - " Print summary of all operations.\n", - " \n", - " Args:\n", - " results: Results dictionary from process_client_configs\n", - " \"\"\"\n", - " print(\"\\n\" + \"=\" * 50)\n", - " print(\"SUMMARY\")\n", - " print(\"=\" * 50)\n", - "\n", - " successful_configs = [name for name, result in results.items() if result['success']]\n", - " failed_configs = [name for name, result in results.items() if not result['success']]\n", - " print(f\"\\n\\n✓✓Feature Store YAML files have been created in: {os.getcwd()}\")\n", - " print(f\"\\n✓ Successfully processed {len(successful_configs)} config(s):\")\n", - " for config_name in successful_configs:\n", - " result = results[config_name]\n", - " print(f\" - {config_name}: {result['yaml_path']} (Project: {result['project_name']})\")\n", - "\n", - " if failed_configs:\n", - " print(f\"\\n✗ Failed to process {len(failed_configs)} config(s):\")\n", - " for config_name in failed_configs:\n", - " result = results[config_name]\n", - " print(f\" - {config_name}: {result['error']}\")\n", - "\n", - " print(f\"\\n\\n✓✓ Feature Store Object(s) details:\")\n", - " for config_name in successful_configs:\n", - " result = results[config_name]\n", - " print(f\"> Object Name - {result['feature_store']} ; project name - {result['project_name']} ; yaml path - {result['yaml_path']}\")\n", - "\n", - " print(\"\\n\")\n", - " print(\"=\" * 25, \"Usage:\", \"=\" * 25)\n", - " print(\"You can now use feature store object(s) to access the feature store resources and functions!\")\n", - " print(\"\\n// Note: Replace object_name with the actual object name from the list above.\")\n", - " print(\"object_name.list_features()\\nobject_name.get_historical_features()\")\n", - " print(\"=\" * 58)\n", - "\n", - "\n", - "def main():\n", - " \"\"\"\n", - " Main function to demonstrate usage with example configs.\n", - " \"\"\"\n", - " yaml_content = os.getenv(\"CONFIGMAP_DATA\")\n", - "\n", - " if not yaml_content:\n", - " raise ValueError(\"CONFIGMAP_DATA environment variable is not set.\")\n", - "\n", - " # Use environment YAML as config\n", - " client_configs = {\n", - " \"feast_credit_scoring_client\": yaml_content\n", - " }\n", - "\n", - " print(\"=\" * 50)\n", - " print(\"This script will create feature store YAMLs and objects from client configs.\")\n", - " print(f\"Processing {len(client_configs)} selected configurations...\")\n", - " \n", - " # Process the configs\n", - " results = process_client_configs(client_configs)\n", - " \n", - " # Print summary\n", - " print_summary(results)\n", - "\n", - "\n", - "if __name__ == \"__main__\":\n", - " main()" + "fs_credit_scoring_local = FeatureStore(fs_yaml_file='/opt/app-root/src/feast-config/credit_scoring_local')" ] }, { diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-test.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb similarity index 100% rename from infra/feast-operator/test/e2e_rhoai/resources/feast-test.ipynb rename to infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb diff --git a/infra/feast-operator/test/utils/notebook_util.go b/infra/feast-operator/test/utils/notebook_util.go index cad4a734a01..8652b481889 100644 --- a/infra/feast-operator/test/utils/notebook_util.go +++ b/infra/feast-operator/test/utils/notebook_util.go @@ -29,6 +29,7 @@ type NotebookTemplateParams struct { PipTrustedHost string FeastVerison string OpenAIAPIKey string + FeastProject string } // CreateNotebook renders a notebook manifest from a template and applies it using kubectl. @@ -288,7 +289,8 @@ func BuildNotebookCommand(notebookName, testDir string) []string { } // GetNotebookParams builds and returns NotebookTemplateParams from environment variables and configuration -func GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir string) NotebookTemplateParams { +// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty +func GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir string, feastProject string) NotebookTemplateParams { username := GetOCUser(testDir) command := BuildNotebookCommand(notebookName, testDir) @@ -313,6 +315,7 @@ func GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, test PipTrustedHost: getEnv("PIP_TRUSTED_HOST"), FeastVerison: getEnv("FEAST_VERSION"), OpenAIAPIKey: getEnv("OPENAI_API_KEY"), + FeastProject: feastProject, } } @@ -342,9 +345,10 @@ func SetupNotebookEnvironment(namespace, configMapName, notebookFile, featureRep return nil } -// RunNotebookTest performs all the setup steps, creates a notebook, and monitors its execution. -// This function encapsulates the common notebook test workflow used across multiple test files. -func RunNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string) { +// CreateNotebookTest performs all the setup steps and creates a notebook. +// This function handles namespace context, ConfigMap, PVC, rolebinding, and notebook creation. +// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty +func CreateNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string, feastProject string) { // Execute common setup steps By(fmt.Sprintf("Setting namespace context to : %s", namespace)) Expect(SetNamespaceContext(namespace, testDir)).To(Succeed()) @@ -363,10 +367,21 @@ func RunNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pv fmt.Printf("Created rolebinding %s successfully\n", rolebindingName) // Build notebook parameters and create notebook - nbParams := GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir) + nbParams := GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir, feastProject) By("Creating Jupyter Notebook") Expect(CreateNotebook(nbParams)).To(Succeed(), "Failed to create notebook") +} +// MonitorNotebookTest monitors the notebook execution and verifies completion. +func MonitorNotebookTest(namespace, notebookName string) { By("Monitoring notebook logs") Expect(MonitorNotebookPod(namespace, "jupyter-nb-", notebookName)).To(Succeed(), "Notebook execution failed") } + +// RunNotebookTest performs all the setup steps, creates a notebook, and monitors its execution. +// This function is kept for backward compatibility. For new tests, use CreateNotebookTest and MonitorNotebookTest separately. +// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty +func RunNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string, feastProject string) { + CreateNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir, feastProject) + MonitorNotebookTest(namespace, notebookName) +} diff --git a/infra/feast-operator/test/utils/test_util.go b/infra/feast-operator/test/utils/test_util.go index 1f476708d4c..a883efc020d 100644 --- a/infra/feast-operator/test/utils/test_util.go +++ b/infra/feast-operator/test/utils/test_util.go @@ -152,6 +152,104 @@ func checkIfConfigMapExists(namespace, configMapName string) error { return nil } +// ListConfigMaps lists all ConfigMaps in the given namespace +func ListConfigMaps(namespace string) ([]string, error) { + cmd := exec.Command("kubectl", "get", "cm", "-n", namespace, "-o", "jsonpath={range .items[*]}{.metadata.name}{\"\\n\"}{end}") + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("failed to list config maps in namespace %s. Error: %v. Stderr: %s", + namespace, err, stderr.String()) + } + + configMaps := strings.Split(strings.TrimSpace(out.String()), "\n") + // Filter out empty strings + var result []string + for _, cm := range configMaps { + if cm != "" { + result = append(result, cm) + } + } + return result, nil +} + +// VerifyConfigMapExistsInList checks if a ConfigMap exists in the list of ConfigMaps +func VerifyConfigMapExistsInList(namespace, configMapName string) (bool, error) { + configMaps, err := ListConfigMaps(namespace) + if err != nil { + return false, err + } + + for _, cm := range configMaps { + if cm == configMapName { + return true, nil + } + } + + return false, nil +} + +// VerifyFeastConfigMapExists verifies that a ConfigMap exists and contains the specified key/file +func VerifyFeastConfigMapExists(namespace, configMapName, expectedKey string) error { + // First verify the ConfigMap exists + if err := checkIfConfigMapExists(namespace, configMapName); err != nil { + return fmt.Errorf("config map %s does not exist: %w", configMapName, err) + } + + // Get the ConfigMap data to verify the key exists + cmd := exec.Command("kubectl", "get", "cm", configMapName, "-n", namespace, "-o", "jsonpath={.data."+expectedKey+"}") + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to get config map data for %s in namespace %s. Error: %v. Stderr: %s", + configMapName, namespace, err, stderr.String()) + } + + configContent := out.String() + if configContent == "" { + return fmt.Errorf("config map %s does not contain key %s", configMapName, expectedKey) + } + + return nil +} + +// VerifyFeastConfigMapContent verifies that a ConfigMap contains the expected feast configuration content +// This assumes the ConfigMap and key already exist (use VerifyFeastConfigMapExists first) +func VerifyFeastConfigMapContent(namespace, configMapName, expectedKey string, expectedContent []string) error { + // Get the ConfigMap data + cmd := exec.Command("kubectl", "get", "cm", configMapName, "-n", namespace, "-o", "jsonpath={.data."+expectedKey+"}") + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to get config map data for %s in namespace %s. Error: %v. Stderr: %s", + configMapName, namespace, err, stderr.String()) + } + + configContent := out.String() + if configContent == "" { + return fmt.Errorf("config map %s does not contain key %s", configMapName, expectedKey) + } + + // Verify all expected content strings are present + for _, expected := range expectedContent { + if !strings.Contains(configContent, expected) { + return fmt.Errorf("config map %s content does not contain expected string: %s. Content:\n%s", + configMapName, expected, configContent) + } + } + + return nil +} + // validates if a kubernetes service exists using the kubectl CLI. func checkIfKubernetesServiceExists(namespace, serviceName string) error { cmd := exec.Command("kubectl", "get", "service", serviceName, "-n", namespace) From ce35ce6751a32373492b64de338771218a6dc4b1 Mon Sep 17 00:00:00 2001 From: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> Date: Sat, 3 Jan 2026 06:18:09 +0100 Subject: [PATCH 12/26] feat: Added batching to feature server /push to offline store (#5683) (#5729) * feat: added batching to feature server /push to offline store (#5683) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> fix: formatting,l int errors (#5683) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> * Merge branch 'master' into 5683-configurable-batching-feature-server-push Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> * feat: added batching to feature server /push to offline store ([#5683](https://github.com/feast-dev/feast/issues/5683)) Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --------- Signed-off-by: Jacob Weinhold <29459386+jfw-ppi@users.noreply.github.com> --- .../feature-servers/python-feature-server.md | 20 + docs/reference/feature-store-yaml.md | 16 + sdk/python/feast/feature_server.py | 341 +++++++++++++++++- .../infra/feature_servers/base_config.py | 22 ++ sdk/python/tests/unit/test_feature_server.py | 256 +++++++++++++ 5 files changed, 636 insertions(+), 19 deletions(-) diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index df0b0b1f78d..2668ffd8839 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -199,6 +199,26 @@ requests.post( "http://localhost:6566/push", data=json.dumps(push_data)) ``` +#### Offline write batching for `/push` + +The Python feature server supports configurable batching for the **offline** +portion of writes executed via the `/push` endpoint. + +Only the offline part of a push is affected: + +- `to: "offline"` → **fully batched** +- `to: "online_and_offline"` → **online written immediately**, **offline batched** +- `to: "online"` → unaffected, always immediate + +Enable batching in your `feature_store.yaml`: + +```yaml +feature_server: + type: local + offline_push_batching_enabled: true + offline_push_batching_batch_size: 1000 + offline_push_batching_batch_interval_seconds: 10 +``` ### Materializing features diff --git a/docs/reference/feature-store-yaml.md b/docs/reference/feature-store-yaml.md index 01f586c047b..820731064fc 100644 --- a/docs/reference/feature-store-yaml.md +++ b/docs/reference/feature-store-yaml.md @@ -25,6 +25,22 @@ online_store: * **project\_id** — Optional parameter for the datastore online store. Sets the GCP project id used by Feast, if not set Feast will use the default GCP project id in the local environment. * **project** — Defines a namespace for the entire feature store. Can be used to isolate multiple deployments in a single installation of Feast. +### feature_server + +The `feature_server` block configures the Python Feature Server when it is used +to serve online features and handle `/push` requests. This section is optional +and only applies when running the Python feature server. + +An example configuration: + +```yaml +feature_server: + type: local + offline_push_batching_enabled: true # Enables batching of offline writes processed by /push. Online writes are unaffected. + offline_push_batching_batch_size: 100 # Maximum number of buffered rows before writing to the offline store. + offline_push_batching_batch_interval_seconds: 5 # Maximum time rows may remain buffered before a forced flush. +``` + ## Providers The `provider` field defines the environment in which Feast will execute data flows. As a result, it also determines the default values for other fields. diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index fbbb38821af..ecad3404eaf 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -1,13 +1,29 @@ +# Copyright 2025 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import asyncio import os import sys import threading import time import traceback +from collections import defaultdict from contextlib import asynccontextmanager from datetime import datetime from importlib import resources as importlib_resources -from typing import Any, Dict, List, Optional, Union +from types import SimpleNamespace +from typing import Any, DefaultDict, Dict, List, NamedTuple, Optional, Set, Union import pandas as pd import psutil @@ -241,6 +257,41 @@ def get_app( registry_proto = None shutting_down = False active_timer: Optional[threading.Timer] = None + # --- Offline write batching config and batcher --- + fs_cfg = getattr(store.config, "feature_server", None) + batching_cfg = None + if fs_cfg is not None: + enabled = getattr(fs_cfg, "offline_push_batching_enabled", False) + batch_size = getattr(fs_cfg, "offline_push_batching_batch_size", None) + batch_interval_seconds = getattr( + fs_cfg, "offline_push_batching_batch_interval_seconds", None + ) + + if enabled is True: + size_ok = isinstance(batch_size, int) and not isinstance(batch_size, bool) + interval_ok = isinstance(batch_interval_seconds, int) and not isinstance( + batch_interval_seconds, bool + ) + if size_ok and interval_ok: + batching_cfg = SimpleNamespace( + enabled=True, + batch_size=batch_size, + batch_interval_seconds=batch_interval_seconds, + ) + else: + logger.warning( + "Offline write batching enabled but missing or invalid numeric values; " + "disabling batching (batch_size=%r, batch_interval_seconds=%r)", + batch_size, + batch_interval_seconds, + ) + + offline_batcher: Optional[OfflineWriteBatcher] = None + if batching_cfg is not None and batching_cfg.enabled is True: + offline_batcher = OfflineWriteBatcher(store=store, cfg=batching_cfg) + logger.debug("Offline write batching is ENABLED") + else: + logger.debug("Offline write batching is DISABLED") def stop_refresh(): nonlocal shutting_down @@ -268,9 +319,13 @@ async def lifespan(app: FastAPI): await store.initialize() async_refresh() - yield - stop_refresh() - await store.close() + try: + yield + finally: + stop_refresh() + if offline_batcher is not None: + offline_batcher.shutdown() + await store.close() app = FastAPI(lifespan=lifespan) @@ -340,7 +395,7 @@ async def retrieve_online_documents( return response_dict @app.post("/push", dependencies=[Depends(inject_user_details)]) - async def push(request: PushFeaturesRequest) -> None: + async def push(request: PushFeaturesRequest) -> Response: df = pd.DataFrame(request.df) actions = [] if request.to == "offline": @@ -375,22 +430,63 @@ async def push(request: PushFeaturesRequest) -> None: for feature_view in fvs_with_push_sources: assert_permissions(resource=feature_view, actions=actions) - push_params = dict( - push_source_name=request.push_source_name, - df=df, - allow_registry_cache=request.allow_registry_cache, - to=to, - transform_on_write=request.transform_on_write, - ) + async def _push_with_to(push_to: PushMode) -> None: + """ + Helper for performing a single push operation. + + NOTE: + - Feast providers **do not currently support async offline writes**. + - Therefore: + * ONLINE and ONLINE_AND_OFFLINE → may be async, depending on provider.async_supported.online.write + * OFFLINE → always synchronous, but executed via run_in_threadpool when called from HTTP handlers. + - The OfflineWriteBatcher handles offline writes directly in its own background thread, but the offline store writes are currently synchronous only. + """ + push_source_name = request.push_source_name + allow_registry_cache = request.allow_registry_cache + transform_on_write = request.transform_on_write + + # Async currently only applies to online store writes (ONLINE / ONLINE_AND_OFFLINE paths) as theres no async for offline store + if push_to in (PushMode.ONLINE, PushMode.ONLINE_AND_OFFLINE) and ( + store._get_provider().async_supported.online.write + ): + await store.push_async( + push_source_name=push_source_name, + df=df, + allow_registry_cache=allow_registry_cache, + to=push_to, + transform_on_write=transform_on_write, + ) + else: + await run_in_threadpool( + lambda: store.push( + push_source_name=push_source_name, + df=df, + allow_registry_cache=allow_registry_cache, + to=push_to, + transform_on_write=transform_on_write, + ) + ) - should_push_async = ( - store._get_provider().async_supported.online.write - and to in [PushMode.ONLINE, PushMode.ONLINE_AND_OFFLINE] - ) - if should_push_async: - await store.push_async(**push_params) + needs_online = to in (PushMode.ONLINE, PushMode.ONLINE_AND_OFFLINE) + needs_offline = to in (PushMode.OFFLINE, PushMode.ONLINE_AND_OFFLINE) + + status_code = status.HTTP_200_OK + + if offline_batcher is None or not needs_offline: + await _push_with_to(to) else: - store.push(**push_params) + if needs_online: + await _push_with_to(PushMode.ONLINE) + + offline_batcher.enqueue( + push_source_name=request.push_source_name, + df=df, + allow_registry_cache=request.allow_registry_cache, + transform_on_write=request.transform_on_write, + ) + status_code = status.HTTP_202_ACCEPTED + + return Response(status_code=status_code) async def _get_feast_object( feature_view_name: str, allow_registry_cache: bool @@ -732,3 +828,210 @@ def start_server( ) else: uvicorn.run(app, host=host, port=port, access_log=(not no_access_log)) + + +class _OfflineBatchKey(NamedTuple): + push_source_name: str + allow_registry_cache: bool + transform_on_write: bool + + +class OfflineWriteBatcher: + """ + In-process offline write batcher for /push requests. + + - Buffers DataFrames per (push_source_name, allow_registry_cache, transform_on_write) + - Flushes when either: + * total rows in a buffer >= batch_size, or + * time since last flush >= batch_interval_seconds + - Flush runs in a dedicated background thread so the HTTP event loop stays unblocked. + """ + + def __init__(self, store: "feast.FeatureStore", cfg: Any): + self._store = store + self._cfg = cfg + + # Buffers and timestamps keyed by batch key + self._buffers: DefaultDict[_OfflineBatchKey, List[pd.DataFrame]] = defaultdict( + list + ) + self._last_flush: DefaultDict[_OfflineBatchKey, float] = defaultdict(time.time) + self._inflight: Set[_OfflineBatchKey] = set() + + self._lock = threading.Lock() + self._stop_event = threading.Event() + + # Start background flusher thread + self._thread = threading.Thread( + target=self._run, name="offline_write_batcher", daemon=True + ) + self._thread.start() + + logger.debug( + "OfflineWriteBatcher initialized: batch_size=%s, batch_interval_seconds=%s", + getattr(cfg, "batch_size", None), + getattr(cfg, "batch_interval_seconds", None), + ) + + # ---------- Public API ---------- + + def enqueue( + self, + push_source_name: str, + df: pd.DataFrame, + allow_registry_cache: bool, + transform_on_write: bool, + ) -> None: + """ + Enqueue a dataframe for offline write, grouped by push source + flags. + Cheap and non-blocking; heavy I/O happens in background thread. + """ + key = _OfflineBatchKey( + push_source_name=push_source_name, + allow_registry_cache=allow_registry_cache, + transform_on_write=transform_on_write, + ) + + with self._lock: + self._buffers[key].append(df) + total_rows = sum(len(d) for d in self._buffers[key]) + should_flush = total_rows >= self._cfg.batch_size + + if should_flush: + # Size-based flush + logger.debug( + "OfflineWriteBatcher size threshold reached for %s: %s rows", + key, + total_rows, + ) + self._flush(key) + + def flush_all(self) -> None: + """ + Flush all buffers synchronously. Intended for graceful shutdown. + """ + with self._lock: + keys = list(self._buffers.keys()) + for key in keys: + self._flush(key) + + def shutdown(self, timeout: float = 5.0) -> None: + """ + Stop the background thread and perform a best-effort flush. + """ + logger.debug("Shutting down OfflineWriteBatcher") + self._stop_event.set() + try: + self._thread.join(timeout=timeout) + except Exception: + logger.exception("Error joining OfflineWriteBatcher thread") + + # Best-effort final flush + try: + self.flush_all() + except Exception: + logger.exception("Error during final OfflineWriteBatcher flush") + + # ---------- Internal helpers ---------- + + def _run(self) -> None: + """ + Background loop: periodically checks for buffers that should be flushed + based on time since last flush. + """ + interval = max(1, int(getattr(self._cfg, "batch_interval_seconds", 30))) + logger.debug( + "OfflineWriteBatcher background loop started with check interval=%s", + interval, + ) + + while not self._stop_event.wait(timeout=interval): + now = time.time() + try: + with self._lock: + keys_to_flush: List[_OfflineBatchKey] = [] + for key, dfs in list(self._buffers.items()): + if not dfs: + continue + last = self._last_flush[ + key + ] # this will also init the default timestamp + age = now - last + if age >= self._cfg.batch_interval_seconds: + logger.debug( + "OfflineWriteBatcher time threshold reached for %s: age=%s", + key, + age, + ) + keys_to_flush.append(key) + for key in keys_to_flush: + self._flush(key) + except Exception: + logger.exception("Error in OfflineWriteBatcher background loop") + + logger.debug("OfflineWriteBatcher background loop exiting") + + def _drain_locked(self, key: _OfflineBatchKey) -> Optional[List[pd.DataFrame]]: + """ + Drain a single buffer; caller must hold self._lock. + """ + if key in self._inflight: + return None + + dfs = self._buffers.get(key) + if not dfs: + return None + + self._buffers[key] = [] + self._inflight.add(key) + return dfs + + def _flush(self, key: _OfflineBatchKey) -> None: + """ + Flush a single buffer. Extracts data under lock, then does I/O without lock. + """ + while True: + with self._lock: + dfs = self._drain_locked(key) + + if not dfs: + return + + batch_df = pd.concat(dfs, ignore_index=True) + + # NOTE: offline writes are currently synchronous only, so we call directly + try: + self._store.push( + push_source_name=key.push_source_name, + df=batch_df, + allow_registry_cache=key.allow_registry_cache, + to=PushMode.OFFLINE, + transform_on_write=key.transform_on_write, + ) + except Exception: + logger.exception("Error flushing offline batch for %s", key) + with self._lock: + self._buffers[key] = dfs + self._buffers[key] + self._inflight.discard(key) + return + + logger.debug( + "Flushing offline batch for push_source=%s with %s rows", + key.push_source_name, + len(batch_df), + ) + + with self._lock: + self._last_flush[key] = time.time() + self._inflight.discard(key) + pending_rows = sum(len(d) for d in self._buffers.get(key, [])) + should_flush = pending_rows >= self._cfg.batch_size + + if not should_flush: + return + + logger.debug( + "OfflineWriteBatcher size threshold reached for %s: %s rows", + key, + pending_rows, + ) diff --git a/sdk/python/feast/infra/feature_servers/base_config.py b/sdk/python/feast/infra/feature_servers/base_config.py index 1a348032e17..b13e23d035e 100644 --- a/sdk/python/feast/infra/feature_servers/base_config.py +++ b/sdk/python/feast/infra/feature_servers/base_config.py @@ -1,3 +1,16 @@ +# Copyright 2025 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from typing import Optional from pydantic import StrictBool, StrictInt @@ -32,3 +45,12 @@ class BaseFeatureServerConfig(FeastConfigBaseModel): feature_logging: Optional[FeatureLoggingConfig] = None """ Feature logging configuration """ + + offline_push_batching_enabled: Optional[StrictBool] = None + """Whether to batch writes to the offline store via the `/push` endpoint.""" + + offline_push_batching_batch_size: Optional[StrictInt] = None + """The maximum batch size for offline writes via `/push`.""" + + offline_push_batching_batch_interval_seconds: Optional[StrictInt] = None + """The batch interval between offline writes via `/push`.""" diff --git a/sdk/python/tests/unit/test_feature_server.py b/sdk/python/tests/unit/test_feature_server.py index e3fd0387fb9..c271fad7fad 100644 --- a/sdk/python/tests/unit/test_feature_server.py +++ b/sdk/python/tests/unit/test_feature_server.py @@ -1,4 +1,20 @@ +# Copyright 2025 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import json +import time +from collections import Counter +from types import SimpleNamespace from unittest.mock import AsyncMock, MagicMock import pytest @@ -209,6 +225,246 @@ def test_materialize_request_model(): assert req2.end_ts == "2021-01-02T00:00:00" +def _enable_offline_batching_config( + fs, enabled: bool = True, batch_size: int = 1, batch_interval_seconds: int = 60 +): + """ + Attach a minimal feature_server.offline_push_batching config + to a mocked FeatureStore. + """ + if not hasattr(fs, "config") or fs.config is None: + fs.config = SimpleNamespace() + + if not hasattr(fs.config, "feature_server") or fs.config.feature_server is None: + fs.config.feature_server = SimpleNamespace() + + fs.config.feature_server.offline_push_batching_enabled = enabled + fs.config.feature_server.offline_push_batching_batch_size = batch_size + fs.config.feature_server.offline_push_batching_batch_interval_seconds = ( + batch_interval_seconds + ) + + +def push_body_many(push_mode=PushMode.ONLINE, count: int = 2, id_start: int = 100): + """Build a push body with multiple entities.""" + driver_ids = list(range(id_start, id_start + count)) + lats = [float(i) for i in driver_ids] + longs = [str(lat) for lat in lats] + event_ts = [str(_utc_now()) for _ in range(count)] + created_ts = [str(_utc_now()) for _ in range(count)] + + return { + "push_source_name": "driver_locations_push", + "df": { + "driver_lat": lats, + "driver_long": longs, + "driver_id": driver_ids, + "event_timestamp": event_ts, + "created_timestamp": created_ts, + }, + "to": push_mode.name.lower(), + } + + +@pytest.mark.parametrize("online_write", [True, False]) +@pytest.mark.parametrize("batching_enabled", [True, False]) +@pytest.mark.parametrize( + "push_mode", + [PushMode.ONLINE, PushMode.OFFLINE, PushMode.ONLINE_AND_OFFLINE], +) +def test_push_batched_matrix( + online_write, batching_enabled, push_mode, mock_fs_factory +): + """ + Matrix over: + - online_write ∈ {True, False} + - batching_enabled ∈ {True, False} + - push_mode ∈ {ONLINE, OFFLINE, ONLINE_AND_OFFLINE} + + Asserts: + - which of fs.push / fs.push_async are called + - how many times + - with which `to` values + + For batching_enabled=True, batch_size=1 ensures immediate flush of offline part. + """ + fs = mock_fs_factory(online_write=online_write) + + _enable_offline_batching_config( + fs, + enabled=batching_enabled, + batch_size=1, # flush immediately on a single offline request + batch_interval_seconds=60, + ) + + client = TestClient(get_app(fs)) + + # use a multi-row payload to ensure we test non-trivial dfs + resp = client.post("/push", json=push_body_many(push_mode, count=2, id_start=100)) + needs_offline = push_mode in (PushMode.OFFLINE, PushMode.ONLINE_AND_OFFLINE) + expected_status = 202 if batching_enabled and needs_offline else 200 + assert resp.status_code == expected_status + + # Collect calls + sync_calls = fs.push.call_args_list + async_calls = fs.push_async.await_args_list + sync_tos = [c.kwargs.get("to") for c in sync_calls] + async_tos = [c.kwargs.get("to") for c in async_calls] + + # ------------------------------- + # Build expectations + # ------------------------------- + expected_sync_calls = 0 + expected_async_calls = 0 + expected_sync_tos = [] + expected_async_tos = [] + + if push_mode == PushMode.ONLINE: + # Only online path, batching irrelevant + if online_write: + expected_async_calls = 1 + expected_async_tos = [PushMode.ONLINE] + else: + expected_sync_calls = 1 + expected_sync_tos = [PushMode.ONLINE] + + elif push_mode == PushMode.OFFLINE: + # Only offline path, never async + if batching_enabled: + # via batcher, but externally still one push(to=OFFLINE) + expected_sync_calls = 1 + expected_sync_tos = [PushMode.OFFLINE] + else: + # direct push(to=OFFLINE) + expected_sync_calls = 1 + expected_sync_tos = [PushMode.OFFLINE] + + elif push_mode == PushMode.ONLINE_AND_OFFLINE: + if not batching_enabled: + # Old behaviour: single call with to=ONLINE_AND_OFFLINE + if online_write: + expected_async_calls = 1 + expected_async_tos = [PushMode.ONLINE_AND_OFFLINE] + else: + expected_sync_calls = 1 + expected_sync_tos = [PushMode.ONLINE_AND_OFFLINE] + else: + # Batching enabled: ONLINE part and OFFLINE part are split + if online_write: + # async ONLINE + sync OFFLINE (via batcher) + expected_async_calls = 1 + expected_async_tos = [PushMode.ONLINE] + expected_sync_calls = 1 + expected_sync_tos = [PushMode.OFFLINE] + else: + # both ONLINE and OFFLINE via sync push + expected_sync_calls = 2 + expected_sync_tos = [PushMode.ONLINE, PushMode.OFFLINE] + + # ------------------------------- + # Assert counts + # ------------------------------- + assert fs.push.call_count == expected_sync_calls + assert fs.push_async.await_count == expected_async_calls + + # Allow ordering differences by comparing as multisets + assert Counter(sync_tos) == Counter(expected_sync_tos) + assert Counter(async_tos) == Counter(expected_async_tos) + + +def test_offline_batches_are_separated_by_flags(mock_fs_factory): + """ + Offline batches must be separated by (allow_registry_cache, transform_on_write). + + If we send three offline pushes with the same push_source_name but different + combinations of allow_registry_cache / transform_on_write, they must result + in three separate fs.push(...) calls, not one merged batch. + """ + fs = mock_fs_factory(online_write=True) + # Large batch_size so we rely on interval-based flush, not size-based. + _enable_offline_batching_config( + fs, enabled=True, batch_size=100, batch_interval_seconds=1 + ) + + client = TestClient(get_app(fs)) + + # Base body: allow_registry_cache=True, transform_on_write=True (default) + body_base = push_body_many(PushMode.OFFLINE, count=2, id_start=100) + + # 1) Default flags: allow_registry_cache=True, transform_on_write=True + resp1 = client.post("/push", json=body_base) + assert resp1.status_code == 202 + + # 2) Different allow_registry_cache + body_allow_false = dict(body_base) + body_allow_false["allow_registry_cache"] = False + resp2 = client.post("/push", json=body_allow_false) + assert resp2.status_code == 202 + + # 3) Different transform_on_write + body_transform_false = dict(body_base) + body_transform_false["transform_on_write"] = False + resp3 = client.post("/push", json=body_transform_false) + assert resp3.status_code == 202 + + # Immediately after: no flush expected yet (interval-based) + assert fs.push.call_count == 0 + + # Wait up to ~3 seconds for interval-based flush + deadline = time.time() + 3.0 + while time.time() < deadline and fs.push.call_count < 3: + time.sleep(0.1) + + # We expect exactly 3 separate pushes, each with 2 rows and to=OFFLINE + assert fs.push.call_count == 3 + + lengths = [c.kwargs["df"].shape[0] for c in fs.push.call_args_list] + tos = [c.kwargs["to"] for c in fs.push.call_args_list] + allow_flags = [c.kwargs["allow_registry_cache"] for c in fs.push.call_args_list] + transform_flags = [c.kwargs["transform_on_write"] for c in fs.push.call_args_list] + + assert all(t == PushMode.OFFLINE for t in tos) + assert lengths == [2, 2, 2] + + # Ensure we really saw 3 distinct (allow_registry_cache, transform_on_write) combos + assert len({(a, t) for a, t in zip(allow_flags, transform_flags)}) == 3 + + +def test_offline_batcher_interval_flush(mock_fs_factory): + """ + With batching enabled and a large batch_size, ensure that the time-based + flush still triggers even when the size threshold is never reached. + """ + fs = mock_fs_factory(online_write=True) + _enable_offline_batching_config( + fs, + enabled=True, + batch_size=100, # won't be hit by this test + batch_interval_seconds=1, # small interval + ) + + client = TestClient(get_app(fs)) + + # Send a single OFFLINE push (2 rows), below size threshold + resp = client.post( + "/push", json=push_body_many(PushMode.OFFLINE, count=2, id_start=500) + ) + assert resp.status_code == 202 + + # Immediately after: no sync push yet (buffer only) + assert fs.push.call_count == 0 + + # Wait up to ~3 seconds for interval-based flush + deadline = time.time() + 3.0 + while time.time() < deadline and fs.push.call_count < 1: + time.sleep(0.1) + + assert fs.push.call_count == 1 + kwargs = fs.push.call_args.kwargs + assert kwargs["to"] == PushMode.OFFLINE + assert len(kwargs["df"]) == 2 + + # Static Artifacts Tests @pytest.fixture def mock_store_with_static_artifacts(tmp_path): From 678589b65e0ed24a8369c9f34e94ee4acd7fb14e Mon Sep 17 00:00:00 2001 From: Yassin Nouh <70436855+YassinNouh21@users.noreply.github.com> Date: Mon, 5 Jan 2026 05:48:56 +0200 Subject: [PATCH 13/26] fix: Add hybrid online store to ONLINE_STORE_CLASS_FOR_TYPE mapping (#5810) * fix: Add hybrid online store to ONLINE_STORE_CLASS_FOR_TYPE mapping This fixes the import error when using HybridOnlineStore with the shorthand type configuration in feature_store.yaml. Changes: - Add missing __init__.py to hybrid_online_store package - Add "hybrid" entry to ONLINE_STORE_CLASS_FOR_TYPE in repo_config.py - Update HybridOnlineStoreConfig type Literal to use standard "hybrid" shorthand - Update documentation to use type: hybrid Signed-off-by: yassinnouh21 * fix: Add hybrid to Go operator ValidOnlineStoreDBStorePersistenceTypes The data source types test validates that Python ONLINE_STORE_CLASS_FOR_TYPE matches the Go operator's ValidOnlineStoreDBStorePersistenceTypes. This adds the hybrid type to both v1 and v1alpha1 API versions. Signed-off-by: yassinnouh21 --------- Signed-off-by: yassinnouh21 --- docs/reference/online-stores/hybrid.md | 2 +- infra/feast-operator/api/v1/featurestore_types.go | 3 ++- infra/feast-operator/api/v1alpha1/featurestore_types.go | 3 ++- .../config/crd/bases/feast.dev_featurestores.yaml | 4 ++++ infra/feast-operator/dist/install.yaml | 4 ++++ .../infra/online_stores/hybrid_online_store/__init__.py | 0 .../hybrid_online_store/hybrid_online_store.py | 6 ++---- sdk/python/feast/repo_config.py | 1 + 8 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py diff --git a/docs/reference/online-stores/hybrid.md b/docs/reference/online-stores/hybrid.md index 38527d9a66e..a03cc4ae853 100644 --- a/docs/reference/online-stores/hybrid.md +++ b/docs/reference/online-stores/hybrid.md @@ -20,7 +20,7 @@ project: my_feature_repo registry: data/registry.db provider: local online_store: - type: hybrid_online_store.HybridOnlineStore + type: hybrid routing_tag: team # or any tag name you want to use in FeatureView's for routing online_stores: - type: bigtable diff --git a/infra/feast-operator/api/v1/featurestore_types.go b/infra/feast-operator/api/v1/featurestore_types.go index 462447d23c6..cb79578a1ff 100644 --- a/infra/feast-operator/api/v1/featurestore_types.go +++ b/infra/feast-operator/api/v1/featurestore_types.go @@ -371,7 +371,7 @@ type OnlineStoreFilePersistence struct { // OnlineStoreDBStorePersistence configures the DB store persistence for the online store service type OnlineStoreDBStorePersistence struct { // Type of the persistence type you want to use. - // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus + // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus;hybrid Type string `json:"type"` // Data store parameters should be placed as-is from the "feature_store.yaml" under the secret key. "registry_type" & "type" fields should be removed. SecretRef corev1.LocalObjectReference `json:"secretRef"` @@ -396,6 +396,7 @@ var ValidOnlineStoreDBStorePersistenceTypes = []string{ "qdrant", "couchbase.online", "milvus", + "hybrid", } // LocalRegistryConfig configures the registry service diff --git a/infra/feast-operator/api/v1alpha1/featurestore_types.go b/infra/feast-operator/api/v1alpha1/featurestore_types.go index 45dff27f816..c246877ea7c 100644 --- a/infra/feast-operator/api/v1alpha1/featurestore_types.go +++ b/infra/feast-operator/api/v1alpha1/featurestore_types.go @@ -371,7 +371,7 @@ type OnlineStoreFilePersistence struct { // OnlineStoreDBStorePersistence configures the DB store persistence for the online store service type OnlineStoreDBStorePersistence struct { // Type of the persistence type you want to use. - // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus + // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus;hybrid Type string `json:"type"` // Data store parameters should be placed as-is from the "feature_store.yaml" under the secret key. "registry_type" & "type" fields should be removed. SecretRef corev1.LocalObjectReference `json:"secretRef"` @@ -396,6 +396,7 @@ var ValidOnlineStoreDBStorePersistenceTypes = []string{ "qdrant", "couchbase.online", "milvus", + "hybrid", } // LocalRegistryConfig configures the registry service diff --git a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml index d47acf74135..04456c5a929 100644 --- a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml +++ b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml @@ -1322,6 +1322,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -5358,6 +5359,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -9521,6 +9523,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -13557,6 +13560,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef diff --git a/infra/feast-operator/dist/install.yaml b/infra/feast-operator/dist/install.yaml index 57e32090b19..0bfc0da14d8 100644 --- a/infra/feast-operator/dist/install.yaml +++ b/infra/feast-operator/dist/install.yaml @@ -1330,6 +1330,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -5366,6 +5367,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -9529,6 +9531,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -13565,6 +13568,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef diff --git a/sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py b/sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py b/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py index e929e039411..8faefdbd344 100644 --- a/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py +++ b/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py @@ -21,7 +21,7 @@ Example configuration (feature_store.yaml): online_store: - type: hybrid_online_store.HybridOnlineStore + type: hybrid routing_tag: team # or any tag name you want to use for routing online_stores: - type: feast.infra.online_stores.bigtable.BigtableOnlineStore @@ -64,9 +64,7 @@ class HybridOnlineStoreConfig(FeastConfigBaseModel): online_stores: A list of OnlineStoresWithConfig, each specifying the type and config for an online store backend. """ - type: Literal["HybridOnlineStore", "hybrid_online_store.HybridOnlineStore"] = ( - "hybrid_online_store.HybridOnlineStore" - ) + type: Literal["hybrid"] = "hybrid" class OnlineStoresWithConfig(FeastConfigBaseModel): """ diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index 2cd148edb66..318ca324cd6 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -84,6 +84,7 @@ "qdrant": "feast.infra.online_stores.qdrant_online_store.qdrant.QdrantOnlineStore", "couchbase.online": "feast.infra.online_stores.couchbase_online_store.couchbase.CouchbaseOnlineStore", "milvus": "feast.infra.online_stores.milvus_online_store.milvus.MilvusOnlineStore", + "hybrid": "feast.infra.online_stores.hybrid_online_store.hybrid_online_store.HybridOnlineStore", **LEGACY_ONLINE_STORE_CLASS_FOR_TYPE, } From 9e3f213c7130f75fb732045f9b8c20e863fb753b Mon Sep 17 00:00:00 2001 From: Jatin Kumar Date: Tue, 6 Jan 2026 01:45:24 -0300 Subject: [PATCH 14/26] fix(redis): Preserve millisecond timestamp precision for Redis online store (#5807) * Update redis.py Add millisecond-precision timestamp support to Redis online store Signed-off-by: Jatin Kumar * Update redis.py sub-second precision when returning timestamps to client Signed-off-by: Jatin Kumar * Update redis.py fix(redis): preserve millisecond timestamp precision Signed-off-by: Jatin Kumar * Update redis.py fix: Remove whitespace on blank lines (W293) Signed-off-by: Jatin Kumar --------- Signed-off-by: Jatin Kumar --- sdk/python/feast/infra/online_stores/redis.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/sdk/python/feast/infra/online_stores/redis.py b/sdk/python/feast/infra/online_stores/redis.py index 59892fcbe0f..9a4e908810d 100644 --- a/sdk/python/feast/infra/online_stores/redis.py +++ b/sdk/python/feast/infra/online_stores/redis.py @@ -304,22 +304,25 @@ def online_write_batch( for redis_key_bin, prev_event_time, (_, values, timestamp, _) in zip( keys, prev_event_timestamps, data ): - event_time_seconds = int(utils.make_tzaware(timestamp).timestamp()) - - # ignore if event_timestamp is before the event features that are currently in the feature store + # Convert incoming timestamp to millisecond-aware datetime + aware_ts = utils.make_tzaware(timestamp) + # Build protobuf timestamp with nanos + ts = Timestamp() + ts.FromDatetime(aware_ts) + # New timestamp in nanoseconds + new_total_nanos = ts.seconds * 1_000_000_000 + ts.nanos + # Compare against existing timestamp (nanosecond precision) if prev_event_time: prev_ts = Timestamp() prev_ts.ParseFromString(prev_event_time) - if prev_ts.seconds and event_time_seconds <= prev_ts.seconds: - # TODO: somehow signal that it's not overwriting the current record? + prev_total_nanos = prev_ts.seconds * 1_000_000_000 + prev_ts.nanos + # Skip only if older OR exact same instant + if prev_total_nanos and new_total_nanos <= prev_total_nanos: if progress: progress(1) continue - - ts = Timestamp() - ts.seconds = event_time_seconds - entity_hset = dict() - entity_hset[ts_key] = ts.SerializeToString() + # Store full timestamp (seconds + nanos) + entity_hset = {ts_key: ts.SerializeToString()} for feature_name, val in values.items(): f_key = _mmh3(f"{feature_view}:{feature_name}") @@ -456,5 +459,7 @@ def _get_features_for_entity( if not res: return None, None else: - timestamp = datetime.fromtimestamp(res_ts.seconds, tz=timezone.utc) + # reconstruct full timestamp including nanos + total_seconds = res_ts.seconds + res_ts.nanos / 1_000_000_000.0 + timestamp = datetime.fromtimestamp(total_seconds, tz=timezone.utc) return timestamp, res From 1dc2be5177ee333220cfcd9e9a9f20bdfa2b3eca Mon Sep 17 00:00:00 2001 From: Myeongwon Kim <65876994+samuelkim7@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:33:14 +0100 Subject: [PATCH 15/26] feat: Add GCS registry store in Go feature server (#5818) Signed-off-by: samuelkim7 --- go.mod | 53 +++++++-- go.sum | 84 +++++++++++++++ go/internal/feast/registry/gcs.go | 114 ++++++++++++++++++++ go/internal/feast/registry/registry.go | 6 +- go/internal/feast/registry/registry_test.go | 102 +++++++++++++----- 5 files changed, 318 insertions(+), 41 deletions(-) create mode 100644 go/internal/feast/registry/gcs.go diff --git a/go.mod b/go.mod index a097aa67719..7f918de268e 100644 --- a/go.mod +++ b/go.mod @@ -25,13 +25,24 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 go.opentelemetry.io/otel/sdk v1.38.0 go.opentelemetry.io/otel/trace v1.38.0 - golang.org/x/sync v0.17.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + golang.org/x/sync v0.18.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba + google.golang.org/grpc v1.76.0 + google.golang.org/protobuf v1.36.10 ) require ( + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.17.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/storage v1.58.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/andybalholm/brotli v1.1.0 // indirect github.com/apache/thrift v0.21.0 // indirect @@ -53,13 +64,21 @@ require ( github.com/aws/smithy-go v1.22.2 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.2 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect github.com/klauspost/compress v1.17.9 // indirect @@ -69,20 +88,32 @@ require ( github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/zeebo/errs v1.4.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.35.0 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.33.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.37.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/api v0.256.0 // indirect + google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f2530758915..7d306beabb6 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,25 @@ +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= +cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= +cloud.google.com/go/storage v1.58.0 h1:PflFXlmFJjG/nBeR9B7pKddLQWaFaRWx4uUi/LyNxxo= +cloud.google.com/go/storage v1.58.0/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= @@ -54,13 +76,24 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -77,8 +110,14 @@ github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81A github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ= +github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= @@ -107,6 +146,8 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= @@ -115,21 +156,34 @@ github.com/roberson-io/mmh3 v0.0.0-20190729202758-fdfce3ba6225 h1:ZMsPCp7oYgjoIF github.com/roberson-io/mmh3 v0.0.0-20190729202758-fdfce3ba6225/go.mod h1:XEESr+X1SY8ZSuc3jqsTlb3clCkqQJ4DcF3Qxv1N3PM= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= @@ -148,36 +202,66 @@ go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOV go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= +golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI= +google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964= +google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 h1:LvZVVaPE0JSqL+ZWb6ErZfnEOKIqqFWUJE2D0fObSmc= +google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9/go.mod h1:QFOrLhdAe2PsTp3vQY4quuLKTi9j3XG3r6JPPaw7MSc= google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4= +google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/go/internal/feast/registry/gcs.go b/go/internal/feast/registry/gcs.go new file mode 100644 index 00000000000..00968a55ae3 --- /dev/null +++ b/go/internal/feast/registry/gcs.go @@ -0,0 +1,114 @@ +package registry + +import ( + "context" + "errors" + "io" + "net/url" + "strings" + "time" + + "cloud.google.com/go/storage" + "google.golang.org/protobuf/proto" + + "github.com/feast-dev/feast/go/protos/feast/core" +) + +// GCSObjectReader defines the interface for reading GCS objects to allow mocking in tests. +type GCSObjectReader interface { + GetObject(ctx context.Context, bucket string, object string) (io.ReadCloser, error) + DeleteObject(ctx context.Context, bucket string, object string) error +} + +// GCSClient implements GCSObjectReader using the real GCS SDK. +type GCSClient struct { + client *storage.Client +} + +func (g *GCSClient) GetObject(ctx context.Context, bucket string, object string) (io.ReadCloser, error) { + return g.client.Bucket(bucket).Object(object).NewReader(ctx) +} + +func (g *GCSClient) DeleteObject(ctx context.Context, bucket string, object string) error { + return g.client.Bucket(bucket).Object(object).Delete(ctx) +} + +// GCSRegistryStore is a GCS bucket-based implementation of the RegistryStore interface. +type GCSRegistryStore struct { + registryPath string + client GCSObjectReader +} + +// NewGCSRegistryStore creates a GCSRegistryStore with the given configuration. +func NewGCSRegistryStore(config *RegistryConfig, repoPath string) *GCSRegistryStore { + var rs GCSRegistryStore + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + client, err := storage.NewClient(ctx) + if err != nil { + rs = GCSRegistryStore{ + registryPath: config.Path, + } + } else { + rs = GCSRegistryStore{ + registryPath: config.Path, + client: &GCSClient{client: client}, + } + } + return &rs +} + +// GetRegistryProto reads and parses the registry proto from the GCS bucket object. +func (g *GCSRegistryStore) GetRegistryProto() (*core.Registry, error) { + bucket, object, err := g.parseGCSPath() + if err != nil { + return nil, err + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + reader, err := g.client.GetObject(ctx, bucket, object) + if err != nil { + return nil, err + } + defer reader.Close() + + data, err := io.ReadAll(reader) + if err != nil { + return nil, err + } + + registry := &core.Registry{} + if err := proto.Unmarshal(data, registry); err != nil { + return nil, err + } + return registry, nil +} + +func (g *GCSRegistryStore) UpdateRegistryProto(rp *core.Registry) error { + return errors.New("not implemented in GCSRegistryStore") +} + +func (g *GCSRegistryStore) Teardown() error { + bucket, object, err := g.parseGCSPath() + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + return g.client.DeleteObject(ctx, bucket, object) +} + +func (g *GCSRegistryStore) parseGCSPath() (string, string, error) { + uri, err := url.Parse(g.registryPath) + if err != nil { + return "", "", errors.New("invalid GCS registry path format") + } + bucket := uri.Host + object := strings.TrimPrefix(uri.Path, "/") + return bucket, object, nil +} diff --git a/go/internal/feast/registry/registry.go b/go/internal/feast/registry/registry.go index 160dda94fd6..9cd0febe5d3 100644 --- a/go/internal/feast/registry/registry.go +++ b/go/internal/feast/registry/registry.go @@ -357,7 +357,7 @@ func getRegistryStoreFromScheme(registryPath string, registryConfig *RegistryCon if registryStoreType, ok := REGISTRY_STORE_CLASS_FOR_SCHEME[uri.Scheme]; ok { return getRegistryStoreFromType(registryStoreType, registryConfig, repoPath, project) } - return nil, fmt.Errorf("registry path %s has unsupported scheme %s. Supported schemes are file, s3 and gs", registryPath, uri.Scheme) + return nil, fmt.Errorf("registry path %s has unsupported scheme %s. Supported schemes are file, s3 and gcs", registryPath, uri.Scheme) } func getRegistryStoreFromType(registryStoreType string, registryConfig *RegistryConfig, repoPath string, project string) (RegistryStore, error) { @@ -366,6 +366,8 @@ func getRegistryStoreFromType(registryStoreType string, registryConfig *Registry return NewFileRegistryStore(registryConfig, repoPath), nil case "S3RegistryStore": return NewS3RegistryStore(registryConfig, repoPath), nil + case "GCSRegistryStore": + return NewGCSRegistryStore(registryConfig, repoPath), nil } - return nil, errors.New("only FileRegistryStore as a RegistryStore is supported at this moment") + return nil, errors.New("only FileRegistryStore, S3RegistryStore, and GCSRegistryStore are supported at this moment") } diff --git a/go/internal/feast/registry/registry_test.go b/go/internal/feast/registry/registry_test.go index 3e544d486e5..6f75dbbbeb2 100644 --- a/go/internal/feast/registry/registry_test.go +++ b/go/internal/feast/registry/registry_test.go @@ -12,7 +12,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3" ) -func TestGetOnlineFeaturesS3Registry(t *testing.T) { +func TestCloudRegistryStores(t *testing.T) { mockS3Client := &MockS3Client{ GetObjectFn: func(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.Options)) (*s3.GetObjectOutput, error) { return &s3.GetObjectOutput{ @@ -24,56 +24,82 @@ func TestGetOnlineFeaturesS3Registry(t *testing.T) { }, } + mockGCSClient := &MockGCSClient{ + GetObjectFn: func(ctx context.Context, bucket string, object string) (io.ReadCloser, error) { + return io.NopCloser(strings.NewReader("mock data")), nil + }, + DeleteObjectFn: func(ctx context.Context, bucket string, object string) error { + return nil + }, + } + tests := []struct { name string config *RepoConfig }{ { - name: "redis with simple features", + name: "s3 registry store", config: &RepoConfig{ Project: "feature_repo", - Registry: map[string]interface{}{ + Registry: map[string]any{ "path": "s3://test-bucket/path/to/registry.db", }, Provider: "aws", }, }, + { + name: "gcs registry store", + config: &RepoConfig{ + Project: "feature_repo", + Registry: map[string]any{ + "path": "gs://test-bucket/path/to/registry.db", + }, + Provider: "gcp", + }, + }, } + for _, test := range tests { - registryConfig, err := test.config.GetRegistryConfig() - if err != nil { - t.Errorf("Error getting registry config. msg: %s", err.Error()) - } - r := &Registry{ - project: test.config.Project, - cachedRegistryProtoTtl: time.Duration(registryConfig.CacheTtlSeconds) * time.Second, - } - _ = registryConfig.RegistryStoreType - registryPath := registryConfig.Path - uri, err := url.Parse(registryPath) - if err != nil { - t.Errorf("Error parsing registry path. msg: %s", err.Error()) - } - if registryStoreType, ok := REGISTRY_STORE_CLASS_FOR_SCHEME[uri.Scheme]; ok { - switch registryStoreType { - case "S3RegistryStore": - registryStore := &S3RegistryStore{ - filePath: registryConfig.Path, - s3Client: mockS3Client, + t.Run(test.name, func(t *testing.T) { + registryConfig, err := test.config.GetRegistryConfig() + if err != nil { + t.Errorf("Error getting registry config. msg: %s", err.Error()) + } + r := &Registry{ + project: test.config.Project, + cachedRegistryProtoTtl: time.Duration(registryConfig.CacheTtlSeconds) * time.Second, + } + registryPath := registryConfig.Path + uri, err := url.Parse(registryPath) + if err != nil { + t.Errorf("Error parsing registry path. msg: %s", err.Error()) + } + if registryStoreType, ok := REGISTRY_STORE_CLASS_FOR_SCHEME[uri.Scheme]; ok { + switch registryStoreType { + case "S3RegistryStore": + r.registryStore = &S3RegistryStore{ + filePath: registryConfig.Path, + s3Client: mockS3Client, + } + case "GCSRegistryStore": + r.registryStore = &GCSRegistryStore{ + registryPath: registryConfig.Path, + client: mockGCSClient, + } + default: + t.Errorf("Unsupported registry store type: %s", registryStoreType) + return } - r.registryStore = registryStore err := r.InitializeRegistry() if err != nil { t.Errorf("Error initializing registry. msg: %s. registry path=%q", err.Error(), registryPath) } - default: - t.Errorf("Only S3RegistryStore is supported on this testing. got=%s", registryStoreType) } - } + }) } } -// MockS3Client is mock client for testing s3 registry store +// MockS3Client is mock client for testing S3 registry store type MockS3Client struct { GetObjectFn func(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.Options)) (*s3.GetObjectOutput, error) DeleteObjectFn func(ctx context.Context, params *s3.DeleteObjectInput, optFns ...func(*s3.Options)) (*s3.DeleteObjectOutput, error) @@ -92,3 +118,23 @@ func (m *MockS3Client) DeleteObject(ctx context.Context, params *s3.DeleteObject } return nil, errors.New("not implemented") } + +// MockGCSClient is mock client for testing GCS registry store +type MockGCSClient struct { + GetObjectFn func(ctx context.Context, bucket string, object string) (io.ReadCloser, error) + DeleteObjectFn func(ctx context.Context, bucket string, object string) error +} + +func (m *MockGCSClient) GetObject(ctx context.Context, bucket string, object string) (io.ReadCloser, error) { + if m.GetObjectFn != nil { + return m.GetObjectFn(ctx, bucket, object) + } + return nil, errors.New("not implemented") +} + +func (m *MockGCSClient) DeleteObject(ctx context.Context, bucket string, object string) error { + if m.DeleteObjectFn != nil { + return m.DeleteObjectFn(ctx, bucket, object) + } + return errors.New("not implemented") +} From bbba34cfa6c4f5824d336a81d53024bb6a28ca52 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Tue, 6 Jan 2026 12:41:59 -0500 Subject: [PATCH 16/26] chore: Refactor some unit tests into integration tests (#5820) * chore: Refactor some unit tests into integration tests Signed-off-by: Francisco Javier Arceo * chore: Refactor some unit tests into integration tests Signed-off-by: Francisco Javier Arceo * rename TestConfig Signed-off-by: Francisco Javier Arceo * rename TestConfig Signed-off-by: Francisco Javier Arceo * add integration flag Signed-off-by: Francisco Javier Arceo * update paths Signed-off-by: Francisco Javier Arceo * update paths Signed-off-by: Francisco Javier Arceo --------- Signed-off-by: Francisco Javier Arceo --- .github/workflows/registry-rest-api-tests.yml | 4 +- .../registration/rest_api}/conftest.py | 34 +++++-- .../resource/feast-registry-nginx.yaml | 0 .../resource/feast_config_credit_scoring.yaml | 0 .../resource/feast_config_driver_ranking.yaml | 0 .../resource/feast_config_rhoai.yaml | 0 .../rest_api}/resource/postgres.yaml | 0 .../rest_api}/resource/redis.yaml | 0 .../registration/rest_api}/support.py | 0 .../rest_api/test_registry_rest_api.py} | 94 ++++++++++--------- 10 files changed, 81 insertions(+), 51 deletions(-) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/conftest.py (78%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/feast-registry-nginx.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/feast_config_credit_scoring.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/feast_config_driver_ranking.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/feast_config_rhoai.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/postgres.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/resource/redis.yaml (100%) rename sdk/python/tests/{registry_rest_api_tests => integration/registration/rest_api}/support.py (100%) rename sdk/python/tests/{registry_rest_api_tests/test_feast_registry.py => integration/registration/rest_api/test_registry_rest_api.py} (84%) diff --git a/.github/workflows/registry-rest-api-tests.yml b/.github/workflows/registry-rest-api-tests.yml index 5eddd68a539..cd679c7044b 100644 --- a/.github/workflows/registry-rest-api-tests.yml +++ b/.github/workflows/registry-rest-api-tests.yml @@ -145,8 +145,8 @@ jobs: - name: Setup and Run Registry Rest API tests run: | echo "Running Registry REST API tests..." - cd sdk/python/tests/registry_rest_api_tests/ - pytest test_feast_registry.py -s + cd sdk/python + pytest tests/integration/registration/rest_api/test_registry_rest_api.py --integration -s - name: Clean up docker images if: always() diff --git a/sdk/python/tests/registry_rest_api_tests/conftest.py b/sdk/python/tests/integration/registration/rest_api/conftest.py similarity index 78% rename from sdk/python/tests/registry_rest_api_tests/conftest.py rename to sdk/python/tests/integration/registration/rest_api/conftest.py index 2a128785fd8..36c358a9aa6 100644 --- a/sdk/python/tests/registry_rest_api_tests/conftest.py +++ b/sdk/python/tests/integration/registration/rest_api/conftest.py @@ -1,9 +1,11 @@ import os +from pathlib import Path import pytest import requests from kubernetes import client, config -from support import ( + +from tests.integration.registration.rest_api.support import ( applyFeastProject, create_feast_project, create_namespace, @@ -41,6 +43,10 @@ def feast_rest_client(): config.load_kube_config() api_instance = client.CoreV1Api() + # Get the directory containing this conftest.py file + test_dir = Path(__file__).parent + resource_dir = test_dir / "resource" + # Constants and environment values namespace = "test-ns-feast-rest" credit_scoring = "credit-scoring" @@ -54,23 +60,37 @@ def feast_rest_client(): try: if not run_on_openshift: # Deploy dependencies - deploy_and_validate_pod(namespace, "resource/redis.yaml", "app=redis") - deploy_and_validate_pod(namespace, "resource/postgres.yaml", "app=postgres") + deploy_and_validate_pod( + namespace, str(resource_dir / "redis.yaml"), "app=redis" + ) + deploy_and_validate_pod( + namespace, str(resource_dir / "postgres.yaml"), "app=postgres" + ) # Create and validate FeatureStore CRs create_feast_project( - "resource/feast_config_credit_scoring.yaml", namespace, credit_scoring + str(resource_dir / "feast_config_credit_scoring.yaml"), + namespace, + credit_scoring, ) validate_feature_store_cr_status(namespace, credit_scoring) create_feast_project( - "resource/feast_config_driver_ranking.yaml", namespace, driver_ranking + str(resource_dir / "feast_config_driver_ranking.yaml"), + namespace, + driver_ranking, ) validate_feature_store_cr_status(namespace, driver_ranking) # Deploy ingress and get route URL run_kubectl_command( - ["apply", "-f", "resource/feast-registry-nginx.yaml", "-n", namespace] + [ + "apply", + "-f", + str(resource_dir / "feast-registry-nginx.yaml"), + "-n", + namespace, + ] ) ingress_host = run_kubectl_command( [ @@ -114,7 +134,7 @@ def feast_rest_client(): aws_secret_key, aws_bucket, registry_path, - "resource/feast_config_rhoai.yaml", + str(resource_dir / "feast_config_rhoai.yaml"), namespace, ) validate_feature_store_cr_status(namespace, "test-s3") diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast-registry-nginx.yaml b/sdk/python/tests/integration/registration/rest_api/resource/feast-registry-nginx.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/feast-registry-nginx.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/feast-registry-nginx.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml b/sdk/python/tests/integration/registration/rest_api/resource/feast_config_credit_scoring.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/feast_config_credit_scoring.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml b/sdk/python/tests/integration/registration/rest_api/resource/feast_config_driver_ranking.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/feast_config_driver_ranking.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml b/sdk/python/tests/integration/registration/rest_api/resource/feast_config_rhoai.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/feast_config_rhoai.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/resource/postgres.yaml b/sdk/python/tests/integration/registration/rest_api/resource/postgres.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/postgres.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/postgres.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/resource/redis.yaml b/sdk/python/tests/integration/registration/rest_api/resource/redis.yaml similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/resource/redis.yaml rename to sdk/python/tests/integration/registration/rest_api/resource/redis.yaml diff --git a/sdk/python/tests/registry_rest_api_tests/support.py b/sdk/python/tests/integration/registration/rest_api/support.py similarity index 100% rename from sdk/python/tests/registry_rest_api_tests/support.py rename to sdk/python/tests/integration/registration/rest_api/support.py diff --git a/sdk/python/tests/registry_rest_api_tests/test_feast_registry.py b/sdk/python/tests/integration/registration/rest_api/test_registry_rest_api.py similarity index 84% rename from sdk/python/tests/registry_rest_api_tests/test_feast_registry.py rename to sdk/python/tests/integration/registration/rest_api/test_registry_rest_api.py index 04e86618cf7..5d37d700a64 100644 --- a/sdk/python/tests/registry_rest_api_tests/test_feast_registry.py +++ b/sdk/python/tests/integration/registration/rest_api/test_registry_rest_api.py @@ -13,7 +13,7 @@ # Test Configuration Constants @dataclass(frozen=True) -class TestConfig: +class RegistryTestConfig: """Configuration constants for registry REST API tests.""" CREDIT_SCORING_PROJECT = "credit_scoring_local" @@ -103,7 +103,7 @@ def validate_entity_structure(entity: Dict[str, Any]) -> None: assert "lastUpdatedTimestamp" in meta assert isinstance(entity["project"], str) - assert entity["project"] in TestConfig.PROJECT_NAMES + assert entity["project"] in RegistryTestConfig.PROJECT_NAMES @staticmethod def validate_feature_structure(feature: Dict[str, Any]) -> None: @@ -132,6 +132,7 @@ def validate_batch_source(batch_source: Dict[str, Any]) -> None: assert batch_source.get("type") == "BATCH_FILE" +@pytest.mark.integration @pytest.mark.skipif( not os.path.exists(os.path.expanduser("~/.kube/config")), reason="Kube config not available in this environment", @@ -143,7 +144,7 @@ class TestRegistryServerRest: def test_list_entities(self, feast_rest_client): """Test listing entities for a specific project.""" response = feast_rest_client.get( - f"/entities/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/entities/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -151,21 +152,21 @@ def test_list_entities(self, feast_rest_client): assert "entities" in data entities = data["entities"] assert isinstance(entities, list) - assert len(entities) == TestConfig.CREDIT_SCORING_ENTITIES_COUNT + assert len(entities) == RegistryTestConfig.CREDIT_SCORING_ENTITIES_COUNT # Validate entity names actual_entity_names = {entity["spec"]["name"] for entity in entities} - assert actual_entity_names == TestConfig.ENTITY_NAMES + assert actual_entity_names == RegistryTestConfig.ENTITY_NAMES # Validate pagination APITestHelpers.validate_pagination( - data, TestConfig.CREDIT_SCORING_ENTITIES_COUNT + data, RegistryTestConfig.CREDIT_SCORING_ENTITIES_COUNT ) def test_get_entity(self, feast_rest_client): """Test getting a specific entity with detailed validation.""" response = feast_rest_client.get( - f"/entities/zipcode/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/entities/zipcode/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -178,7 +179,7 @@ def test_get_entity(self, feast_rest_client): spec["description"] == "ZIP code identifier for geographic location-based features" ) - assert spec["tags"] == TestConfig.ZIPCODE_SPEC_TAGS + assert spec["tags"] == RegistryTestConfig.ZIPCODE_SPEC_TAGS # Validate meta meta = data["meta"] @@ -215,22 +216,22 @@ def test_entities_all(self, feast_rest_client): def test_list_data_sources(self, feast_rest_client): """Test listing data sources for a specific project.""" response = feast_rest_client.get( - f"/data_sources/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/data_sources/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) assert "dataSources" in data data_sources = data["dataSources"] - assert len(data_sources) == TestConfig.CREDIT_SCORING_DATA_SOURCES_COUNT + assert len(data_sources) == RegistryTestConfig.CREDIT_SCORING_DATA_SOURCES_COUNT APITestHelpers.validate_pagination( - data, TestConfig.CREDIT_SCORING_DATA_SOURCES_COUNT + data, RegistryTestConfig.CREDIT_SCORING_DATA_SOURCES_COUNT ) def test_get_data_sources(self, feast_rest_client): """Test getting a specific data source.""" response = feast_rest_client.get( - f"/data_sources/Zipcode source/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/data_sources/Zipcode source/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -254,7 +255,7 @@ def test_data_sources_all(self, feast_rest_client): # Validate project associations for relevant data source types for ds in data_sources: if ds["type"] in ("BATCH_FILE", "REQUEST_SOURCE"): - assert ds["project"] in TestConfig.PROJECT_NAMES + assert ds["project"] in RegistryTestConfig.PROJECT_NAMES pagination = data.get("pagination", {}) assert pagination.get("page") == 1 @@ -266,12 +267,15 @@ def test_data_sources_all(self, feast_rest_client): def test_list_feature_services(self, feast_rest_client): """Test listing feature services for a specific project.""" response = feast_rest_client.get( - f"/feature_services/?project={TestConfig.DRIVER_RANKING_PROJECT}" + f"/feature_services/?project={RegistryTestConfig.DRIVER_RANKING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) feature_services = data.get("featureServices", []) - assert len(feature_services) == TestConfig.DRIVER_RANKING_FEATURE_SERVICES_COUNT + assert ( + len(feature_services) + == RegistryTestConfig.DRIVER_RANKING_FEATURE_SERVICES_COUNT + ) # Validate batch sources in features for fs in feature_services: @@ -288,7 +292,7 @@ def test_feature_services_all(self, feast_rest_client): assert len(feature_services) >= 1 for fs in feature_services: - assert fs.get("project") in TestConfig.PROJECT_NAMES + assert fs.get("project") in RegistryTestConfig.PROJECT_NAMES # Validate features structure spec = fs.get("spec", {}) @@ -299,7 +303,7 @@ def test_feature_services_all(self, feast_rest_client): def test_get_feature_services(self, feast_rest_client): """Test getting a specific feature service.""" response = feast_rest_client.get( - f"/feature_services/driver_activity_v2/?project={TestConfig.DRIVER_RANKING_PROJECT}" + f"/feature_services/driver_activity_v2/?project={RegistryTestConfig.DRIVER_RANKING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -313,21 +317,22 @@ def test_get_feature_services(self, feast_rest_client): def test_list_feature_views(self, feast_rest_client): """Test listing feature views for a specific project.""" response = feast_rest_client.get( - f"/feature_views/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/feature_views/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) assert ( - len(data["featureViews"]) == TestConfig.CREDIT_SCORING_FEATURE_VIEWS_COUNT + len(data["featureViews"]) + == RegistryTestConfig.CREDIT_SCORING_FEATURE_VIEWS_COUNT ) APITestHelpers.validate_pagination( - data, TestConfig.CREDIT_SCORING_FEATURE_VIEWS_COUNT + data, RegistryTestConfig.CREDIT_SCORING_FEATURE_VIEWS_COUNT ) def test_get_feature_view(self, feast_rest_client): """Test getting a specific feature view.""" response = feast_rest_client.get( - f"/feature_views/credit_history/?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/feature_views/credit_history/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -351,26 +356,26 @@ def test_feature_views_all(self, feast_rest_client): def test_list_features(self, feast_rest_client): """Test listing features for a specific project.""" response = feast_rest_client.get( - f"/features/?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=true" + f"/features/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=true" ) data = APITestHelpers.validate_response_success(response) features = data.get("features") assert isinstance(features, list) - assert len(features) == TestConfig.CREDIT_SCORING_FEATURES_COUNT + assert len(features) == RegistryTestConfig.CREDIT_SCORING_FEATURES_COUNT # Validate each feature structure for feature in features: APITestHelpers.validate_feature_structure(feature) APITestHelpers.validate_pagination( - data, TestConfig.CREDIT_SCORING_FEATURES_COUNT + data, RegistryTestConfig.CREDIT_SCORING_FEATURES_COUNT ) def test_get_feature(self, feast_rest_client): """Test getting a specific feature.""" response = feast_rest_client.get( - f"/features/zipcode_features/city/?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" + f"/features/zipcode_features/city/?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" ) data = APITestHelpers.validate_response_success(response) @@ -396,14 +401,17 @@ def test_features_all(self, feast_rest_client): # Validate expected projects are present actual_projects = set(f["project"] for f in features) - assert TestConfig.PROJECT_NAMES.issubset(actual_projects) + assert RegistryTestConfig.PROJECT_NAMES.issubset(actual_projects) APITestHelpers.validate_pagination_all_endpoint(data, "features") # Project Tests @pytest.mark.parametrize( "project_name", - [TestConfig.CREDIT_SCORING_PROJECT, TestConfig.DRIVER_RANKING_PROJECT], + [ + RegistryTestConfig.CREDIT_SCORING_PROJECT, + RegistryTestConfig.DRIVER_RANKING_PROJECT, + ], ) def test_get_project_by_name(self, feast_rest_client, project_name): """Test getting a project by name.""" @@ -420,13 +428,13 @@ def test_get_projects_list(self, feast_rest_client): assert len(projects) == 2 actual_project_names = [project["spec"]["name"] for project in projects] - assert set(actual_project_names) == TestConfig.PROJECT_NAMES + assert set(actual_project_names) == RegistryTestConfig.PROJECT_NAMES # Lineage Tests def test_get_registry_lineage(self, feast_rest_client): """Test getting registry lineage for a specific project.""" response = feast_rest_client.get( - f"/lineage/registry?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/lineage/registry?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -448,11 +456,11 @@ def test_get_registry_lineage(self, feast_rest_client): def test_get_lineage_complete(self, feast_rest_client): """Test getting complete lineage for a specific project.""" response = feast_rest_client.get( - f"/lineage/complete?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/lineage/complete?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) - assert data.get("project") == TestConfig.CREDIT_SCORING_PROJECT + assert data.get("project") == RegistryTestConfig.CREDIT_SCORING_PROJECT assert "objects" in data objects = data["objects"] @@ -511,12 +519,12 @@ def test_get_registry_complete_all(self, feast_rest_client): assert len(data["projects"]) > 0 project_names = [project["project"] for project in data.get("projects", [])] - assert TestConfig.CREDIT_SCORING_PROJECT in project_names + assert RegistryTestConfig.CREDIT_SCORING_PROJECT in project_names def test_get_lineage_object_path(self, feast_rest_client): """Test getting lineage for a specific object.""" response = feast_rest_client.get( - f"/lineage/objects/entity/dob_ssn?project={TestConfig.CREDIT_SCORING_PROJECT}" + f"/lineage/objects/entity/dob_ssn?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}" ) data = APITestHelpers.validate_response_success(response) @@ -541,7 +549,7 @@ def test_get_lineage_object_path(self, feast_rest_client): def test_saved_datasets_endpoints(self, feast_rest_client, endpoint, key): """Test saved datasets endpoints with parameterization.""" if endpoint == "/saved_datasets": - url = f"{endpoint}?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" + url = f"{endpoint}?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" else: url = f"{endpoint}?allow_cache=true&page=1&limit=50&sort_order=asc&include_relationships=false" @@ -555,11 +563,13 @@ def test_saved_datasets_endpoints(self, feast_rest_client, endpoint, key): # Extract and validate names actual_names = [ds["spec"]["name"] for ds in saved_datasets] APITestHelpers.validate_names_match( - actual_names, TestConfig.SAVED_DATASET_NAMES + actual_names, RegistryTestConfig.SAVED_DATASET_NAMES ) # Validate pagination - APITestHelpers.validate_pagination(data, TestConfig.SAVED_DATASETS_COUNT) + APITestHelpers.validate_pagination( + data, RegistryTestConfig.SAVED_DATASETS_COUNT + ) if endpoint == "/saved_datasets/all": assert data["pagination"]["page"] == 1 assert data["pagination"]["limit"] == 50 @@ -568,7 +578,7 @@ def test_get_saved_datasets_by_name(self, feast_rest_client): """Test getting a specific saved dataset by name.""" dataset_name = "comprehensive_credit_dataset_v1" response = feast_rest_client.get( - f"/saved_datasets/{dataset_name}?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" + f"/saved_datasets/{dataset_name}?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" ) data = APITestHelpers.validate_response_success(response) @@ -580,14 +590,14 @@ def test_get_saved_datasets_by_name(self, feast_rest_client): def test_get_permission_by_name(self, feast_rest_client): """Test getting a specific permission by name.""" response = feast_rest_client.get( - f"/permissions/feast_admin_permission?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" + f"/permissions/feast_admin_permission?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" ) APITestHelpers.validate_response_success(response) def test_list_permissions(self, feast_rest_client): """Test listing permissions for a specific project.""" response = feast_rest_client.get( - f"/permissions?project={TestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" + f"/permissions?project={RegistryTestConfig.CREDIT_SCORING_PROJECT}&include_relationships=false" ) data = APITestHelpers.validate_response_success(response) @@ -595,9 +605,9 @@ def test_list_permissions(self, feast_rest_client): # Extract and validate names actual_names = [ds["spec"]["name"] for ds in data["permissions"]] - assert len(actual_names) == len(TestConfig.PERMISSION_NAMES) + assert len(actual_names) == len(RegistryTestConfig.PERMISSION_NAMES) - for name in TestConfig.PERMISSION_NAMES: + for name in RegistryTestConfig.PERMISSION_NAMES: assert name in actual_names - APITestHelpers.validate_pagination(data, TestConfig.PERMISSIONS_COUNT) + APITestHelpers.validate_pagination(data, RegistryTestConfig.PERMISSIONS_COUNT) From b8d75625ee0ff56cb80c3f06a879bcccbb6d64a8 Mon Sep 17 00:00:00 2001 From: Srihari Date: Mon, 5 Jan 2026 19:26:26 +0530 Subject: [PATCH 17/26] test: Remove e2e_rhoai package tests Signed-off-by: Srihari --- .../test/e2e_rhoai/e2e_suite_test.go | 32 -- .../test/e2e_rhoai/feast_postupgrade_test.go | 56 -- .../test/e2e_rhoai/feast_preupgrade_test.go | 74 --- .../feast_wb_connection_integration_test.go | 168 ------ .../test/e2e_rhoai/feast_wb_milvus_test.go | 65 --- .../feast_wb_ray_offline_store_test.go | 82 --- .../test/e2e_rhoai/resources/custom-nb.yaml | 92 ---- .../feast-wb-connection-credit-scoring.ipynb | 416 -------------- .../resources/feast-wb-milvus-test.ipynb | 481 ---------------- .../resources/feast-wb-ray-test.ipynb | 516 ------------------ .../e2e_rhoai/resources/feast_kube_auth.yaml | 74 --- .../resources/feature_repo/__init__.py | 0 .../resources/feature_repo/example_repo.py | 42 -- .../resources/feature_repo/feature_store.yaml | 16 - .../resources/kueue_resources_setup.yaml | 31 -- .../test/e2e_rhoai/resources/permissions.py | 19 - .../test/e2e_rhoai/resources/pvc.yaml | 10 - .../test/utils/notebook_util.go | 387 ------------- infra/feast-operator/test/utils/test_util.go | 172 ------ 19 files changed, 2733 deletions(-) delete mode 100644 infra/feast-operator/test/e2e_rhoai/e2e_suite_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/feast_postupgrade_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/feast_preupgrade_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml delete mode 100755 infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb delete mode 100755 infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/feature_repo/__init__.py delete mode 100755 infra/feast-operator/test/e2e_rhoai/resources/feature_repo/example_repo.py delete mode 100755 infra/feast-operator/test/e2e_rhoai/resources/feature_repo/feature_store.yaml delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/permissions.py delete mode 100644 infra/feast-operator/test/e2e_rhoai/resources/pvc.yaml delete mode 100644 infra/feast-operator/test/utils/notebook_util.go diff --git a/infra/feast-operator/test/e2e_rhoai/e2e_suite_test.go b/infra/feast-operator/test/e2e_rhoai/e2e_suite_test.go deleted file mode 100644 index 86750f36e4f..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/e2e_suite_test.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2erhoai - -import ( - "fmt" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -// Run e2e feast Notebook tests using the Ginkgo runner. -func TestNotebookRunE2E(t *testing.T) { - RegisterFailHandler(Fail) - _, _ = fmt.Fprintf(GinkgoWriter, "Feast Jupyter Notebook Test suite\n") - RunSpecs(t, "e2erhoai Feast Notebook test suite") -} diff --git a/infra/feast-operator/test/e2e_rhoai/feast_postupgrade_test.go b/infra/feast-operator/test/e2e_rhoai/feast_postupgrade_test.go deleted file mode 100644 index d8d091a44b8..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/feast_postupgrade_test.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2erhoai - -import ( - "fmt" - - . "github.com/feast-dev/feast/infra/feast-operator/test/utils" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Feast PostUpgrade scenario Testing", Ordered, func() { - const ( - namespace = "test-ns-feast-upgrade" - testDir = "/test/e2e_rhoai" - feastDeploymentName = FeastPrefix + "credit-scoring" - feastCRName = "credit-scoring" - ) - - AfterAll(func() { - By(fmt.Sprintf("Deleting test namespace: %s", namespace)) - Expect(DeleteNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s deleted successfully\n", namespace) - }) - runPostUpgradeTest := func() { - By("Verify Feature Store CR is in Ready state") - ValidateFeatureStoreCRStatus(namespace, feastCRName) - - By("Running `feast apply` and `feast materialize-incremental` to validate registry definitions") - VerifyApplyFeatureStoreDefinitions(namespace, feastCRName, feastDeploymentName) - - By("Validating Feast entity, feature, and feature view presence") - VerifyFeastMethods(namespace, feastDeploymentName, testDir) - } - - // This context verifies that a pre-created Feast FeatureStore CR continues to function as expected - // after an upgrade. It validates `feast apply`, registry sync, feature retrieval, and model execution. - Context("Feast post Upgrade Test", func() { - It("Should create and run a feastPostUpgrade test scenario feast apply and materialize functionality successfully", runPostUpgradeTest) - }) -}) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_preupgrade_test.go b/infra/feast-operator/test/e2e_rhoai/feast_preupgrade_test.go deleted file mode 100644 index 680d79812fe..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/feast_preupgrade_test.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2erhoai - -import ( - "fmt" - - . "github.com/feast-dev/feast/infra/feast-operator/test/utils" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Feast PreUpgrade scenario Testing", Ordered, func() { - const ( - namespace = "test-ns-feast-upgrade" - replaceNamespace = "test-ns-feast" - testDir = "/test/e2e_rhoai" - feastDeploymentName = FeastPrefix + "credit-scoring" - feastCRName = "credit-scoring" - ) - - filesToUpdateNamespace := []string{ - "test/testdata/feast_integration_test_crs/postgres.yaml", - "test/testdata/feast_integration_test_crs/redis.yaml", - "test/testdata/feast_integration_test_crs/feast.yaml", - } - - BeforeAll(func() { - By(fmt.Sprintf("Creating test namespace: %s", namespace)) - Expect(CreateNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s created successfully\n", namespace) - - By("Replacing placeholder namespace in CR YAMLs for test setup") - Expect(ReplaceNamespaceInYamlFilesInPlace(filesToUpdateNamespace, replaceNamespace, namespace)).To(Succeed()) - }) - - AfterAll(func() { - By("Restoring original namespace in CR YAMLs") - Expect(ReplaceNamespaceInYamlFilesInPlace(filesToUpdateNamespace, namespace, replaceNamespace)).To(Succeed()) - - if CurrentSpecReport().Failed() { - By(fmt.Sprintf("Deleting test namespace: %s", namespace)) - Expect(DeleteNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s deleted successfully\n", namespace) - } - }) - - runPreUpgradeTest := func() { - By("Applying Feast infra manifests and verifying setup") - ApplyFeastInfraManifestsAndVerify(namespace, testDir) - - By("Applying and validating the credit-scoring FeatureStore CR") - ApplyFeastYamlAndVerify(namespace, testDir, feastDeploymentName, feastCRName, "test/testdata/feast_integration_test_crs/feast.yaml") - } - - // This context ensures the Feast CR setup is functional prior to any upgrade - Context("Feast Pre Upgrade Test", func() { - It("Should create and run a feastPreUpgrade test scenario feast credit-scoring CR setup successfully", runPreUpgradeTest) - }) -}) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go deleted file mode 100644 index 43bfff17c2f..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_connection_integration_test.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package e2erhoai provides end-to-end (E2E) test coverage for Feast integration with -// Red Hat OpenShift AI (RHOAI) environments. -// This specific test validates the functionality -// of executing a Feast workbench integration connection with kubernetes auth and without auth successfully -package e2erhoai - -import ( - "fmt" - "time" - - utils "github.com/feast-dev/feast/infra/feast-operator/test/utils" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Feast Workbench Integration Connection Testing", Ordered, func() { - const ( - namespace = "test-ns-feast" - configMapName = "feast-wb-cm" - rolebindingName = "rb-feast-test" - notebookFile = "test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb" - pvcFile = "test/e2e_rhoai/resources/pvc.yaml" - permissionFile = "test/e2e_rhoai/resources/permissions.py" - notebookPVC = "jupyterhub-nb-kube-3aadmin-pvc" - testDir = "/test/e2e_rhoai" - notebookName = "feast-wb-connection-credit-scoring.ipynb" - feastDeploymentName = utils.FeastPrefix + "credit-scoring" - feastCRName = "credit-scoring" - ) - - // Verify feast ConfigMap - verifyFeastConfigMap := func(authEnabled bool) { - feastConfigMapName := "jupyter-nb-kube-3aadmin-feast-config" - configMapKey := "credit_scoring_local" - By(fmt.Sprintf("Listing ConfigMaps and verifying %s exists with correct content", feastConfigMapName)) - - // Build expected content based on auth type - expectedContent := []string{ - "project: credit_scoring_local", - } - if authEnabled { - expectedContent = append(expectedContent, "type: kubernetes") - } else { - expectedContent = append(expectedContent, "type: no_auth") - } - - // First, list ConfigMaps and check if target ConfigMap exists - // Retry with polling since the ConfigMap may be created asynchronously - const maxRetries = 5 - const retryInterval = 5 * time.Second - var configMapExists bool - var err error - - for i := 0; i < maxRetries; i++ { - exists, listErr := utils.VerifyConfigMapExistsInList(namespace, feastConfigMapName) - if listErr != nil { - err = listErr - if i < maxRetries-1 { - fmt.Printf("Failed to list ConfigMaps, retrying in %v... (attempt %d/%d)\n", retryInterval, i+1, maxRetries) - time.Sleep(retryInterval) - continue - } - } else if exists { - configMapExists = true - fmt.Printf("ConfigMap %s found in ConfigMap list\n", feastConfigMapName) - break - } - - if i < maxRetries-1 { - fmt.Printf("ConfigMap %s not found in list yet, retrying in %v... (attempt %d/%d)\n", feastConfigMapName, retryInterval, i+1, maxRetries) - time.Sleep(retryInterval) - } - } - - if !configMapExists { - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to find ConfigMap %s in ConfigMap list after %d attempts: %v", feastConfigMapName, maxRetries, err)) - } - - // Once ConfigMap exists in list, verify content (project name and auth type) - err = utils.VerifyFeastConfigMapContent(namespace, feastConfigMapName, configMapKey, expectedContent) - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to verify Feast ConfigMap %s content: %v", feastConfigMapName, err)) - fmt.Printf("Feast ConfigMap %s verified successfully with project and auth type\n", feastConfigMapName) - } - - // Parameterized test function that handles both auth and non-auth scenarios - runFeastWorkbenchIntegration := func(authEnabled bool) { - // Apply permissions only if auth is enabled - if authEnabled { - By("Applying Feast permissions for kubernetes authenticated scenario") - utils.ApplyFeastPermissions(permissionFile, "/feast-data/credit_scoring_local/feature_repo/permissions.py", namespace, feastDeploymentName) - } - - // Create notebook with all setup steps - // Pass feastProject parameter to set the opendatahub.io/feast-config annotation - utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "credit_scoring_local") - - // Verify Feast ConfigMap was created with correct auth type - verifyFeastConfigMap(authEnabled) - - // Monitor notebook execution - utils.MonitorNotebookTest(namespace, notebookName) - } - - BeforeAll(func() { - By(fmt.Sprintf("Creating test namespace: %s", namespace)) - Expect(utils.CreateNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s created successfully\n", namespace) - - By("Applying Feast infra manifests and verifying setup") - utils.ApplyFeastInfraManifestsAndVerify(namespace, testDir) - }) - - AfterAll(func() { - By(fmt.Sprintf("Deleting test namespace: %s", namespace)) - Expect(utils.DeleteNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s deleted successfully\n", namespace) - }) - - Context("Feast Workbench Integration Tests - Without Auth", func() { - BeforeEach(func() { - By("Applying and validating the credit-scoring FeatureStore CR without auth") - utils.ApplyFeastYamlAndVerify(namespace, testDir, feastDeploymentName, feastCRName, "test/testdata/feast_integration_test_crs/feast.yaml") - - By("Verify Feature Store CR is in Ready state") - utils.ValidateFeatureStoreCRStatus(namespace, feastCRName) - - By("Running `feast apply` and `feast materialize-incremental` to validate registry definitions") - utils.VerifyApplyFeatureStoreDefinitions(namespace, feastCRName, feastDeploymentName) - }) - - It("Should create and run a FeastWorkbenchIntegrationWithoutAuth scenario successfully", func() { - runFeastWorkbenchIntegration(false) - }) - }) - - Context("Feast Workbench Integration Tests - With Auth", func() { - BeforeEach(func() { - By("Applying and validating the credit-scoring FeatureStore CR (with auth)") - utils.ApplyFeastYamlAndVerify(namespace, testDir, feastDeploymentName, feastCRName, "test/e2e_rhoai/resources/feast_kube_auth.yaml") - - By("Verify Feature Store CR is in Ready state") - utils.ValidateFeatureStoreCRStatus(namespace, feastCRName) - - By("Running `feast apply` and `feast materialize-incremental` to validate registry definitions") - utils.VerifyApplyFeatureStoreDefinitions(namespace, feastCRName, feastDeploymentName) - }) - - It("Should create and run a FeastWorkbenchIntegrationWithAuth scenario successfully", func() { - runFeastWorkbenchIntegration(true) - }) - }) -}) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go deleted file mode 100644 index b4e1d37b827..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_milvus_test.go +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package e2erhoai provides end-to-end (E2E) test coverage for Feast integration with -// Red Hat OpenShift AI (RHOAI) environments. This specific test validates the functionality -// of executing a Feast Jupyter notebook within a fully configured OpenShift namespace -package e2erhoai - -import ( - "fmt" - - utils "github.com/feast-dev/feast/infra/feast-operator/test/utils" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Feast Jupyter Notebook Testing", Ordered, func() { - const ( - namespace = "test-ns-feast-wb" - configMapName = "feast-wb-cm" - rolebindingName = "rb-feast-test" - notebookFile = "test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb" - pvcFile = "test/e2e_rhoai/resources/pvc.yaml" - notebookPVC = "jupyterhub-nb-kube-3aadmin-pvc" - testDir = "/test/e2e_rhoai" - notebookName = "feast-wb-milvus-test.ipynb" - feastMilvusTest = "TestFeastMilvusNotebook" - ) - - BeforeAll(func() { - By(fmt.Sprintf("Creating test namespace: %s", namespace)) - Expect(utils.CreateNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s created successfully\n", namespace) - }) - - AfterAll(func() { - By(fmt.Sprintf("Deleting test namespace: %s", namespace)) - Expect(utils.DeleteNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s deleted successfully\n", namespace) - }) - - Context("Feast Jupyter Notebook Test", func() { - It("Should create and run a "+feastMilvusTest+" successfully", func() { - // Create notebook with all setup steps - // Pass empty string for feastProject to keep annotation empty - utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "") - - // Monitor notebook execution - utils.MonitorNotebookTest(namespace, notebookName) - }) - }) -}) diff --git a/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go b/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go deleted file mode 100644 index eb467ad07ff..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/feast_wb_ray_offline_store_test.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2025 Feast Community. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package e2erhoai provides end-to-end (E2E) test coverage for Feast integration with -// Red Hat OpenShift AI (RHOAI) environments. This specific test validates the functionality -// of executing a Feast Jupyter notebook with Ray offline store within a fully configured OpenShift namespace -package e2erhoai - -import ( - "fmt" - "os/exec" - - utils "github.com/feast-dev/feast/infra/feast-operator/test/utils" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Feast Jupyter Notebook Testing with Ray Offline Store", Ordered, func() { - const ( - namespace = "test-ns-feast-wb-ray" - configMapName = "feast-wb-ray-cm" - rolebindingName = "rb-feast-ray-test" - notebookFile = "test/e2e_rhoai/resources/feast-wb-ray-test.ipynb" - pvcFile = "test/e2e_rhoai/resources/pvc.yaml" - kueueResourcesFile = "test/e2e_rhoai/resources/kueue_resources_setup.yaml" - notebookPVC = "jupyterhub-nb-kube-3aadmin-pvc" - testDir = "/test/e2e_rhoai" - notebookName = "feast-wb-ray-test.ipynb" - feastRayTest = "TestFeastRayOfflineStoreNotebook" - ) - - BeforeAll(func() { - By(fmt.Sprintf("Creating test namespace: %s", namespace)) - Expect(utils.CreateNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s created successfully\n", namespace) - - By("Applying Kueue resources setup") - // Apply with namespace flag - cluster-scoped resources (ResourceFlavor, ClusterQueue) will be applied at cluster level, - // and namespace-scoped resources (LocalQueue) will be applied in the specified namespace - cmd := exec.Command("kubectl", "apply", "-f", kueueResourcesFile, "-n", namespace) - output, err := utils.Run(cmd, testDir) - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Failed to apply Kueue resources: %v\nOutput: %s", err, output)) - fmt.Printf("Kueue resources applied successfully\n") - }) - - AfterAll(func() { - By("Deleting Kueue resources") - // Delete with namespace flag - will delete namespace-scoped resources from the namespace - // and cluster-scoped resources from the cluster - cmd := exec.Command("kubectl", "delete", "-f", kueueResourcesFile, "-n", namespace, "--ignore-not-found=true") - _, _ = utils.Run(cmd, testDir) - fmt.Printf("Kueue resources cleanup completed\n") - - By(fmt.Sprintf("Deleting test namespace: %s", namespace)) - Expect(utils.DeleteNamespace(namespace, testDir)).To(Succeed()) - fmt.Printf("Namespace %s deleted successfully\n", namespace) - }) - - Context("Feast Jupyter Notebook Test with Ray Offline store", func() { - It("Should create and run a "+feastRayTest+" successfully", func() { - // Create notebook with all setup steps - // Pass empty string for feastProject to keep annotation empty - utils.CreateNotebookTest(namespace, configMapName, notebookFile, "test/e2e_rhoai/resources/feature_repo", pvcFile, rolebindingName, notebookPVC, notebookName, testDir, "") - - // Monitor notebook execution - utils.MonitorNotebookTest(namespace, notebookName) - }) - }) -}) diff --git a/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml b/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml deleted file mode 100644 index 6dd9304e4b9..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/custom-nb.yaml +++ /dev/null @@ -1,92 +0,0 @@ -# This template maybe used to spin up a custom notebook image -# i.e.: sed s/{{.IngressDomain}}/$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})/g tests/resources/custom-nb.template | oc apply -f - -# resources generated: -# pod/jupyter-nb-kube-3aadmin-0 -# service/jupyter-nb-kube-3aadmin -# route.route.openshift.io/jupyter-nb-kube-3aadmin (jupyter-nb-kube-3aadmin-opendatahub.apps.tedbig412.cp.fyre.ibm.com) -# service/jupyter-nb-kube-3aadmin-tls -apiVersion: kubeflow.org/v1 -kind: Notebook -metadata: - annotations: - notebooks.opendatahub.io/inject-auth: "true" - notebooks.opendatahub.io/last-size-selection: Small - opendatahub.io/link: https://jupyter-nb-kube-3aadmin-{{.Namespace}}.{{.IngressDomain}}/notebook/{{.Namespace}}/jupyter-nb-kube-3aadmin - opendatahub.io/username: {{.Username}} - opendatahub.io/feast-config: {{.FeastProject}} - generation: 1 - labels: - app: jupyter-nb-kube-3aadmin - opendatahub.io/dashboard: "true" - opendatahub.io/odh-managed: "true" - opendatahub.io/user: {{.Username}} - opendatahub.io/feast-integration: 'true' - name: jupyter-nb-kube-3aadmin - namespace: {{.Namespace}} -spec: - template: - spec: - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: nvidia.com/gpu.present - operator: NotIn - values: - - "true" - weight: 1 - containers: - - env: - - name: NOTEBOOK_ARGS - value: |- - --ServerApp.port=8888 - --ServerApp.token='' - --ServerApp.password='' - --ServerApp.base_url=/notebook/test-feast-wb/jupyter-nb-kube-3aadmin - --ServerApp.quit_button=False - --ServerApp.tornado_settings={"user":"{{.Username}}","hub_host":"https://odh-dashboard-{{.OpenDataHubNamespace}}.{{.IngressDomain}}","hub_prefix":"/notebookController/{{.Username}}"} - - name: JUPYTER_IMAGE - value: {{.NotebookImage}} - - name: JUPYTER_NOTEBOOK_PORT - value: "8888" - - name: PIP_INDEX_URL - value: {{.PipIndexUrl}} - - name: PIP_TRUSTED_HOST - value: {{.PipTrustedHost}} - - name: FEAST_VERSION - value: {{.FeastVerison}} - - name: OPENAI_API_KEY - value: {{.OpenAIAPIKey}} - - name: NAMESPACE - value: {{.Namespace}} - image: {{.NotebookImage}} - command: {{.Command}} - imagePullPolicy: Always - name: jupyter-nb-kube-3aadmin - ports: - - containerPort: 8888 - name: notebook-port - protocol: TCP - resources: - limits: - cpu: "2" - memory: 3Gi - requests: - cpu: "1" - memory: 3Gi - volumeMounts: - - mountPath: /opt/app-root/src - name: jupyterhub-nb-kube-3aadmin-pvc - - mountPath: /opt/app-root/notebooks - name: {{.NotebookConfigMapName}} - workingDir: /opt/app-root/src - enableServiceLinks: false - serviceAccountName: default - volumes: - - name: jupyterhub-nb-kube-3aadmin-pvc - persistentVolumeClaim: - claimName: {{.NotebookPVC}} - - name: {{.NotebookConfigMapName}} - configMap: - name: {{.NotebookConfigMapName}} diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb deleted file mode 100755 index 39e1f9c6e37..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-connection-credit-scoring.ipynb +++ /dev/null @@ -1,416 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import feast\n", - "\n", - "actual_version = feast.__version__\n", - "assert actual_version == os.environ.get(\"FEAST_VERSION\"), (\n", - " f\"❌ Feast version mismatch. Expected: {os.environ.get('FEAST_VERSION')}, Found: {actual_version}\"\n", - ")\n", - "print(f\"✅ Found Expected Feast version: {actual_version} in workbench\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# --- Configuration Variables ---\n", - "import os \n", - "\n", - "# Fetch token and server directly from oc CLI\n", - "import subprocess\n", - "\n", - "def oc(cmd):\n", - " return subprocess.check_output(cmd, shell=True).decode(\"utf-8\").strip()\n", - "\n", - "token = oc(\"oc whoami -t\")\n", - "server = oc(\"oc whoami --show-server\")\n", - "namespace = os.environ.get(\"NAMESPACE\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!oc login --token=$token --server=$server" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Add user permission to namespace\n", - "!oc adm policy add-role-to-user admin $(oc whoami) -n $namespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "namespace = os.environ.get(\"NAMESPACE\") # read namespace from env\n", - "if not namespace:\n", - " raise ValueError(\"NAMESPACE environment variable is not set\")\n", - "\n", - "yaml_content = os.popen(\n", - " f\"oc get configmap feast-credit-scoring-client -n {namespace} \"\n", - " \"-o jsonpath='{.data.feature_store\\\\.yaml}' | sed 's/\\\\\\\\n/\\\\n/g'\"\n", - ").read()\n", - "\n", - "# Save the configmap data into an environment variable (if needed)\n", - "os.environ[\"CONFIGMAP_DATA\"] = yaml_content" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "fs_credit_scoring_local = FeatureStore(fs_yaml_file='/opt/app-root/src/feast-config/credit_scoring_local')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "project_name = \"credit_scoring_local\"\n", - "project = fs_credit_scoring_local.get_project(project_name)\n", - "\n", - "# 1. Assert object returned\n", - "assert project is not None, f\"❌ get_project('{project_name}') returned None\"\n", - "\n", - "# 2. Extract project name (works for dict or Feast object)\n", - "if isinstance(project, dict):\n", - " returned_name = project.get(\"spec\", {}).get(\"name\")\n", - "else:\n", - " # Feast Project object\n", - " returned_name = getattr(project, \"name\", None)\n", - " if not returned_name and hasattr(project, \"spec\") and hasattr(project.spec, \"name\"):\n", - " returned_name = project.spec.name\n", - "\n", - "# 3. Assert that name exists\n", - "assert returned_name, f\"❌ Returned project does not contain a valid name: {project}\"\n", - "\n", - "print(\"• Project Name Returned:\", returned_name)\n", - "\n", - "# 4. Assert the name matches expected\n", - "assert returned_name == project_name, (\n", - " f\"❌ Expected project '{project_name}', but got '{returned_name}'\"\n", - ")\n", - "\n", - "print(f\"\\n✓ get_project('{project_name}') validation passed!\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "feast_list_functions = [\n", - " \"list_projects\",\n", - " \"list_entities\",\n", - " \"list_feature_views\",\n", - " \"list_all_feature_views\",\n", - " \"list_batch_feature_views\",\n", - " \"list_on_demand_feature_views\",\n", - "]\n", - "\n", - "# validates feast list methods returns data and method type\n", - "def validate_list_method(fs_obj, method_name):\n", - " assert hasattr(fs_obj, method_name), f\"Method not found: {method_name}\"\n", - "\n", - " method = getattr(fs_obj, method_name)\n", - " result = method()\n", - "\n", - " assert isinstance(result, list), (\n", - " f\"{method_name}() must return a list, got {type(result)}\"\n", - " )\n", - " assert len(result) > 0, (\n", - " f\"{method_name}() returned an empty list — expected data\"\n", - " )\n", - "\n", - " print(f\"✓ {method_name}() returned {len(result)} items\")\n", - "\n", - "for m in feast_list_functions:\n", - " validate_list_method(fs_credit_scoring_local, m)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "feast_list_functions = [\n", - " \"list_feature_services\",\n", - " # \"list_permissions\",\n", - " \"list_saved_datasets\",\n", - "]\n", - "\n", - "# validates feast methods exists and type is valid\n", - "def validate_list_func(fs_obj, method_name):\n", - " assert hasattr(fs_obj, method_name), f\"Method not found: {method_name}\"\n", - "\n", - " method = getattr(fs_obj, method_name)\n", - "\n", - " result = method()\n", - "\n", - " assert isinstance(result, list), (\n", - " f\"{method_name}() must return a list, got {type(result)}\"\n", - " )\n", - "\n", - "for m in feast_list_functions:\n", - " validate_list_func(fs_credit_scoring_local, m)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# validate_list_data_sources for with and without permissions \n", - "\n", - "import os\n", - "from feast.errors import FeastPermissionError\n", - "\n", - "def validate_list_data_sources(fs_obj):\n", - " \"\"\"\n", - " Validates list_data_sources() with special handling for Kubernetes auth mode.\n", - " If CONFIGMAP_DATA indicates auth=kubernetes, expect FeastPermissionError.\n", - " Otherwise validate output type normally.\n", - " \"\"\"\n", - " auth_mode = os.getenv(\"CONFIGMAP_DATA\")\n", - "\n", - " # Case 1: Kubernetes auth → expect permission error\n", - " if \"kubernetes\" in auth_mode.lower():\n", - " try:\n", - " fs_obj.list_data_sources()\n", - " raise AssertionError(\n", - " \"Expected FeastPermissionError due to Kubernetes auth, but the call succeeded.\"\n", - " )\n", - " except FeastPermissionError as e:\n", - " # Correct, this is expected\n", - " return\n", - " except Exception as e:\n", - " raise AssertionError(\n", - " f\"Expected FeastPermissionError, but got different exception: {type(e)} - {e}\"\n", - " )\n", - "\n", - " # Case 2: Non-Kubernetes auth → normal path\n", - " assert hasattr(fs_obj, \"list_data_sources\"), \"Method not found: list_data_sources\"\n", - " result = fs_obj.list_data_sources()\n", - " assert isinstance(result, list), (\n", - " f\"list_data_sources() must return a list, got {type(result)}\"\n", - " )\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "entity = fs_credit_scoring_local.get_entity(\"dob_ssn\")\n", - "\n", - "assert entity is not None, \"❌ Entity 'dob_ssn' not found!\"\n", - "assert entity.name == \"dob_ssn\", f\"❌ Entity name mismatch: {entity.name}\"\n", - "\n", - "print(\"✓ Entity validation successful!\\n\", entity.name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "fv = fs_credit_scoring_local.get_feature_view(\"credit_history\")\n", - "\n", - "assert fv is not None, \"❌ FeatureView 'credit_history' not found!\"\n", - "assert fv.name == \"credit_history\", f\"❌ Name mismatch: {fv.name}\"\n", - "\n", - "print(\"• FeatureView : validation successful!\", fv.name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from feast.errors import FeastPermissionError\n", - "\n", - "def validate_get_data_source(fs_obj, name: str):\n", - " auth_mode = os.getenv(\"CONFIGMAP_DATA\", \"\")\n", - "\n", - " print(\"📌 CONFIGMAP_DATA:\", auth_mode)\n", - "\n", - " # If Kubernetes auth is enabled → expect permission error\n", - " if \"auth\" in \"kubernetes\" in auth_mode.lower():\n", - " print(f\"🔒 Kubernetes auth detected, expecting permission error for get_data_source('{name}')\")\n", - "\n", - " try:\n", - " fs_obj.get_data_source(name)\n", - " raise AssertionError(\n", - " f\"❌ Expected FeastPermissionError when accessing data source '{name}', but call succeeded\"\n", - " )\n", - "\n", - " except FeastPermissionError as e:\n", - " print(f\"✅ Correctly blocked with FeastPermissionError: {e}\")\n", - " return\n", - "\n", - " except Exception as e:\n", - " raise AssertionError(\n", - " f\"❌ Expected FeastPermissionError but got {type(e)}: {e}\"\n", - " )\n", - "\n", - " # Otherwise → normal validation\n", - " print(f\"🔍 Fetching data source '{name}'...\")\n", - "\n", - " ds = fs_obj.get_data_source(name)\n", - "\n", - " print(\"\\n📌 Data Source Object:\")\n", - " print(ds)\n", - "\n", - " assert ds.name == name, (\n", - " f\"❌ Expected name '{name}', got '{ds.name}'\"\n", - " )\n", - "\n", - " print(f\"✅ Data source '{name}' exists and is correctly configured.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "feast_features = [\n", - " \"zipcode_features:city\",\n", - " \"zipcode_features:state\",\n", - "]\n", - "\n", - "entity_rows = [{\n", - " \"zipcode\": 1463,\n", - " \"dob_ssn\": \"19530219_5179\"\n", - "}]\n", - "\n", - "response = fs_credit_scoring_local.get_online_features(\n", - " features=feast_features,\n", - " entity_rows=entity_rows,\n", - ").to_dict()\n", - "\n", - "print(\"Actual response:\", response)\n", - "\n", - "expected = {\n", - " 'zipcode': [1463],\n", - " 'dob_ssn': ['19530219_5179'],\n", - " 'city': ['PEPPERELL'],\n", - " 'state': ['MA'],\n", - "}\n", - "\n", - "assert response == expected" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "# Input entity dataframe\n", - "entity_df = pd.DataFrame({\n", - " \"dob_ssn\": [\"19530219_5179\"],\n", - " \"zipcode\": [1463],\n", - " \"event_timestamp\": [pd.Timestamp(\"2020-04-26 18:01:04\")]\n", - "})\n", - "\n", - "feast_features = [\n", - " \"zipcode_features:city\",\n", - " \"zipcode_features:state\",\n", - " \"credit_history:credit_card_due\",\n", - " \"credit_history:mortgage_due\",\n", - "]\n", - "\n", - "# Retrieve historical features\n", - "historical_df = fs_credit_scoring_local.get_historical_features(\n", - " entity_df=entity_df,\n", - " features=feast_features,\n", - ").to_df()\n", - "\n", - "print(\"Historical DF:\\n\", historical_df)\n", - "\n", - "# Validate dataframe is not empty\n", - "assert not historical_df.empty, \" Historical features dataframe is empty!\"\n", - "\n", - "# 2. Validate required columns exist\n", - "expected_cols = {\n", - " \"dob_ssn\", \"zipcode\", \"event_timestamp\",\n", - " \"city\", \"state\",\n", - " \"credit_card_due\", \"mortgage_due\"\n", - "}\n", - "\n", - "missing_cols = expected_cols - set(historical_df.columns)\n", - "assert not missing_cols, f\" Missing columns in result: {missing_cols}\"\n", - "\n", - "# 3. Validate city/state are non-null (critical features)\n", - "assert pd.notna(historical_df.loc[0, \"city\"]), \" 'city' value is null!\"\n", - "assert pd.notna(historical_df.loc[0, \"state\"]), \" 'state' value is null!\"\n", - "\n", - "# 4. Validate entity matches input\n", - "assert historical_df.loc[0, \"zipcode\"] == 1463, \" zipcode mismatch!\"\n", - "assert historical_df.loc[0, \"dob_ssn\"] == \"19530219_5179\", \"❌ dob_ssn mismatch!\"\n", - "\n", - "print(\"✅ All validations passed successfully!\")\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb deleted file mode 100755 index e2838a4f33e..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-milvus-test.ipynb +++ /dev/null @@ -1,481 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import feast\n", - "\n", - "actual_version = feast.__version__\n", - "assert actual_version == os.environ.get(\"FEAST_VERSION\"), (\n", - " f\"❌ Feast version mismatch. Expected: {os.environ.get('FEAST_VERSION')}, Found: {actual_version}\"\n", - ")\n", - "print(f\"✅ Successfully installed Feast version: {actual_version}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%cd /opt/app-root/src/feature_repo\n", - "!ls -l" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!cat /opt/app-root/src/feature_repo/feature_store.yaml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!mkdir -p data\n", - "!wget -O data/city_wikipedia_summaries_with_embeddings.parquet https://raw.githubusercontent.com/opendatahub-io/feast/master/examples/rag/feature_repo/data/city_wikipedia_summaries_with_embeddings.parquet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd \n", - "\n", - "df = pd.read_parquet(\"./data/city_wikipedia_summaries_with_embeddings.parquet\")\n", - "df['vector'] = df['vector'].apply(lambda x: x.tolist())\n", - "embedding_length = len(df['vector'][0])\n", - "assert embedding_length == 384, f\"❌ Expected vector length 384, but got {embedding_length}\"\n", - "print(f'embedding length = {embedding_length}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import display\n", - "\n", - "display(df.head())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install -q pymilvus[milvus_lite] transformers torch" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "\n", - "# Run `feast apply` and capture output\n", - "result = subprocess.run([\"feast\", \"apply\"], capture_output=True, text=True)\n", - "\n", - "# Combine stdout and stderr in case important info is in either\n", - "output = result.stdout + result.stderr\n", - "\n", - "# Print full output for debugging (optional)\n", - "print(output)\n", - "\n", - "# Expected substrings to validate\n", - "expected_messages = [\n", - " \"Applying changes for project rag\",\n", - " \"Connecting to Milvus in local mode\",\n", - " \"Deploying infrastructure for city_embeddings\"\n", - "]\n", - "\n", - "# Validate all expected messages are in output\n", - "for msg in expected_messages:\n", - " assert msg in output, f\"❌ Expected message not found: '{msg}'\"\n", - "\n", - "print(\"✅ All expected messages were found in the output.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime\n", - "from feast import FeatureStore\n", - "\n", - "store = FeatureStore(repo_path=\".\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import sys\n", - "\n", - "# Capture stdout\n", - "captured_output = io.StringIO()\n", - "sys_stdout_backup = sys.stdout\n", - "sys.stdout = captured_output\n", - "\n", - "# Call the function\n", - "store.write_to_online_store(feature_view_name='city_embeddings', df=df)\n", - "\n", - "# Restore stdout\n", - "sys.stdout = sys_stdout_backup\n", - "\n", - "# Get the output\n", - "output_str = captured_output.getvalue()\n", - "\n", - "# Expected message\n", - "expected_msg = \"Connecting to Milvus in local mode using data/online_store.db\"\n", - "\n", - "# Validate\n", - "assert expected_msg in output_str, f\"❌ Expected message not found.\\nExpected: {expected_msg}\\nActual Output:\\n{output_str}\"\n", - "\n", - "print(\"✅ Output message validated successfully.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# List batch feature views\n", - "batch_fvs = store.list_batch_feature_views()\n", - "\n", - "# Print the number of batch feature views\n", - "print(\"Number of batch feature views:\", len(batch_fvs))\n", - "\n", - "# Assert that the result is an integer and non-negative\n", - "assert isinstance(len(batch_fvs), int), \"Result is not an integer\"\n", - "assert len(batch_fvs) >= 0, \"Feature view count is negative\"\n", - "\n", - "print(\"Feature views listed correctly ✅\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "\n", - "# Initialize store (if not already)\n", - "store = FeatureStore(repo_path=\".\") # Adjust path if necessary\n", - "\n", - "# Retrieve the feature view\n", - "fv = store.get_feature_view(\"city_embeddings\")\n", - "\n", - "# Assert name\n", - "assert fv.name == \"city_embeddings\", \"Feature view name mismatch\"\n", - "\n", - "# Assert entities\n", - "assert fv.entities == [\"item_id\"], f\"Expected entities ['item_id'], got {fv.entities}\"\n", - "\n", - "# Assert feature names and vector index settings\n", - "feature_names = [f.name for f in fv.features]\n", - "assert \"vector\" in feature_names, \"Missing 'vector' feature\"\n", - "assert \"state\" in feature_names, \"Missing 'state' feature\"\n", - "assert \"sentence_chunks\" in feature_names, \"Missing 'sentence_chunks' feature\"\n", - "assert \"wiki_summary\" in feature_names, \"Missing 'wiki_summary' feature\"\n", - "\n", - "# Assert 'vector' feature is a vector index with COSINE metric\n", - "vector_feature = next(f for f in fv.features if f.name == \"vector\")\n", - "assert vector_feature.vector_index, \"'vector' feature is not indexed\"\n", - "assert vector_feature.vector_search_metric == \"COSINE\", \"Expected COSINE search metric for 'vector'\"\n", - "\n", - "print(\"All assertions passed ✅\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from feast.entity import Entity\n", - "from feast.types import ValueType\n", - "entity = Entity(\n", - " name=\"item_id1\",\n", - " value_type=ValueType.INT64,\n", - " description=\"test id\",\n", - " tags={\"team\": \"feast\"},\n", - ")\n", - "store.apply(entity)\n", - "assert any(e.name == \"item_id1\" for e in store.list_entities())\n", - "print(\"Entity added ✅\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "entity_to_delete = store.get_entity(\"item_id1\")\n", - "\n", - "store.apply(\n", - " objects=[],\n", - " objects_to_delete=[entity_to_delete],\n", - " partial=False\n", - ")\n", - "\n", - "# Validation after deletion\n", - "assert not any(e.name == \"item_id1\" for e in store.list_entities())\n", - "print(\"Entity deleted ✅\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# List batch feature views\n", - "batch_fvs = store.list_batch_feature_views()\n", - "assert len(batch_fvs) == 1\n", - "\n", - "# Print count\n", - "print(f\"Found {len(batch_fvs)} batch feature view(s) ✅\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pymilvus_client = store._provider._online_store._connect(store.config)\n", - "COLLECTION_NAME = pymilvus_client.list_collections()[0]\n", - "\n", - "milvus_query_result = pymilvus_client.query(\n", - " collection_name=COLLECTION_NAME,\n", - " filter=\"item_id == '0'\",\n", - ")\n", - "pd.DataFrame(milvus_query_result[0]).head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn.functional as F\n", - "from feast import FeatureStore\n", - "from pymilvus import MilvusClient, DataType, FieldSchema\n", - "from transformers import AutoTokenizer, AutoModel\n", - "from example_repo import city_embeddings_feature_view, item\n", - "\n", - "TOKENIZER = \"sentence-transformers/all-MiniLM-L6-v2\"\n", - "MODEL = \"sentence-transformers/all-MiniLM-L6-v2\"\n", - "\n", - "def mean_pooling(model_output, attention_mask):\n", - " token_embeddings = model_output[\n", - " 0\n", - " ] # First element of model_output contains all token embeddings\n", - " input_mask_expanded = (\n", - " attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n", - " )\n", - " return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(\n", - " input_mask_expanded.sum(1), min=1e-9\n", - " )\n", - "\n", - "def run_model(sentences, tokenizer, model):\n", - " encoded_input = tokenizer(\n", - " sentences, padding=True, truncation=True, return_tensors=\"pt\"\n", - " )\n", - " # Compute token embeddings\n", - " with torch.no_grad():\n", - " model_output = model(**encoded_input)\n", - "\n", - " sentence_embeddings = mean_pooling(model_output, encoded_input[\"attention_mask\"])\n", - " sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)\n", - " return sentence_embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "question = \"Which city has the largest population in New York?\"\n", - "\n", - "tokenizer = AutoTokenizer.from_pretrained(TOKENIZER)\n", - "model = AutoModel.from_pretrained(MODEL)\n", - "query_embedding = run_model(question, tokenizer, model)\n", - "query = query_embedding.detach().cpu().numpy().tolist()[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import display\n", - "\n", - "# Retrieve top k documents\n", - "context_data = store.retrieve_online_documents_v2(\n", - " features=[\n", - " \"city_embeddings:vector\",\n", - " \"city_embeddings:item_id\",\n", - " \"city_embeddings:state\",\n", - " \"city_embeddings:sentence_chunks\",\n", - " \"city_embeddings:wiki_summary\",\n", - " ],\n", - " query=query,\n", - " top_k=3,\n", - " distance_metric='COSINE',\n", - ").to_df()\n", - "display(context_data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def format_documents(context_df):\n", - " output_context = \"\"\n", - " unique_documents = context_df.drop_duplicates().apply(\n", - " lambda x: \"City & State = {\" + x['state'] +\"}\\nSummary = {\" + x['wiki_summary'].strip()+\"}\",\n", - " axis=1,\n", - " )\n", - " for i, document_text in enumerate(unique_documents):\n", - " output_context+= f\"****START DOCUMENT {i}****\\n{document_text.strip()}\\n****END DOCUMENT {i}****\"\n", - " return output_context" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RAG_CONTEXT = format_documents(context_data[['state', 'wiki_summary']])\n", - "print(RAG_CONTEXT)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "FULL_PROMPT = f\"\"\"\n", - "You are an assistant for answering questions about states. You will be provided documentation from Wikipedia. Provide a conversational answer.\n", - "If you don't know the answer, just say \"I do not know.\" Don't make up an answer.\n", - "\n", - "Here are document(s) you should use when answer the users question:\n", - "{RAG_CONTEXT}\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install openai" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from openai import OpenAI\n", - "\n", - "client = OpenAI(\n", - " api_key=os.environ.get(\"OPENAI_API_KEY\"),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "response = client.chat.completions.create(\n", - " model=\"gpt-4o-mini\",\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": FULL_PROMPT},\n", - " {\"role\": \"user\", \"content\": question}\n", - " ],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# The expected output\n", - "expected_output = (\n", - " \"New York City\"\n", - ")\n", - "\n", - "# Actual output from response\n", - "actual_output = '\\n'.join([c.message.content.strip() for c in response.choices])\n", - "\n", - "# Validate\n", - "assert expected_output in actual_output, f\"❌ Output mismatch:\\nExpected: {expected_output}\\nActual: {actual_output}\"\n", - "\n", - "print(\"✅ Output matches expected response.\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb b/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb deleted file mode 100644 index 3b91bcccd8e..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast-wb-ray-test.ipynb +++ /dev/null @@ -1,516 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# --- Configuration Variables ---\n", - "import os \n", - "\n", - "# Namespace where your resources exist\n", - "namespace = os.environ.get(\"NAMESPACE\")\n", - "\n", - "fsconfigmap = \"cm-fs-data\"\n", - "\n", - "# Fetch token and server directly from oc CLI\n", - "import subprocess\n", - "\n", - "def oc(cmd):\n", - " return subprocess.check_output(cmd, shell=True).decode(\"utf-8\").strip()\n", - "\n", - "token = oc(\"oc whoami -t\")\n", - "server = oc(\"oc whoami --show-server\")\n", - "\n", - "os.environ[\"CLUSTER_TOKEN\"] = token\n", - "os.environ[\"CLUSTER_SERVER\"] = server\n", - "\n", - "\n", - "# RayCluster name\n", - "raycluster = \"feastraytest\"\n", - "os.environ[\"RAY_CLUSTER\"] = raycluster\n", - "\n", - "# Show configured values\n", - "print(\"Configuration Variables:\")\n", - "print(f\" Namespace: {namespace}\")\n", - "print(f\" Server: {server}\")\n", - "print(f\" Token: {'*' * 20}\") # hide actual token\n", - "print(f\" Ray Cluster: {raycluster}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! git clone https://github.com/Srihari1192/feast-rag-ray.git" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%cd feast-rag-ray/feature_repo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!oc login --token=$token --server=$server" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!oc create configmap $fsconfigmap --from-file=data/customer_daily_profile.parquet --from-file=data/driver_stats.parquet -n $namespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Import pieces from codeflare-sdk\n", - "from codeflare_sdk import Cluster, ClusterConfiguration, TokenAuthentication\n", - "\n", - "# Create authentication with token and server from oc\n", - "auth = TokenAuthentication(\n", - " token=token,\n", - " server=server,\n", - " skip_tls=True\n", - ")\n", - "auth.login()\n", - "print(\"✓ Authentication successful\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from kubernetes.client import (\n", - " V1Volume,\n", - " V1ConfigMapVolumeSource,\n", - " V1VolumeMount,\n", - ") \n", - "\n", - "data_volume = V1Volume(\n", - " name=\"data\",\n", - " config_map=V1ConfigMapVolumeSource(name=fsconfigmap)\n", - ")\n", - "\n", - "data_mount = V1VolumeMount(\n", - " name=\"data\",\n", - " mount_path=\"/opt/app-root/src/feast-rag-ray/feature_repo/data\",\n", - " read_only=True\n", - ")\n", - "\n", - "cluster = Cluster(ClusterConfiguration(\n", - " name=raycluster,\n", - " head_cpu_requests=1,\n", - " head_cpu_limits=1,\n", - " head_memory_requests=4,\n", - " head_memory_limits=4,\n", - " head_extended_resource_requests={'nvidia.com/gpu':0}, # For GPU enabled workloads set the head_extended_resource_requests and worker_extended_resource_requests\n", - " worker_extended_resource_requests={'nvidia.com/gpu':0},\n", - " num_workers=2,\n", - " worker_cpu_requests='250m',\n", - " worker_cpu_limits=1,\n", - " worker_memory_requests=4,\n", - " worker_memory_limits=4,\n", - " # image=\"\", # Optional Field \n", - " write_to_file=False, # When enabled Ray Cluster yaml files are written to /HOME/.codeflare/resources\n", - " local_queue=\"fs-user-queue\", # Specify the local queue manually\n", - " # ⭐ Best method: Use secretKeyRef to expose AWS credentials safely\n", - " volumes=[data_volume],\n", - " volume_mounts=[data_mount],\n", - " \n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cluster.apply()\n", - "# cluster.wait_ready()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "\n", - "MAX_WAIT = 180 # 3 minutes\n", - "INTERVAL = 5 # check every 5 seconds\n", - "elapsed = 0\n", - "\n", - "print(\"⏳ Waiting up to 3 minutes for RayCluster to be READY...\\n\")\n", - "\n", - "while elapsed < MAX_WAIT:\n", - " details = cluster.details()\n", - " status = details.status.value\n", - "\n", - " print(details)\n", - " print(\"Cluster Status:\", status)\n", - "\n", - " if status == \"ready\":\n", - " print(\"✅ RayCluster is READY!\")\n", - " break\n", - " \n", - " print(f\"⏳ RayCluster is NOT ready yet: {status} ... checking again in {INTERVAL}s\\n\")\n", - " time.sleep(INTERVAL)\n", - " elapsed += INTERVAL\n", - "\n", - "else:\n", - " print(\"❌ Timeout: RayCluster did NOT become READY within 3 minutes.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! feast apply" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "from pathlib import Path\n", - "from feast import FeatureStore\n", - "\n", - "# Add feature repo to PYTHONPATH\n", - "repo_path = Path(\".\")\n", - "sys.path.append(str(repo_path))\n", - "\n", - "# Initialize Feature Store\n", - "print(\"Initializing Feast with Ray configuration...\")\n", - "store = FeatureStore(repo_path=\".\")\n", - "\n", - "# Assertions: Verify store is initialized correctly\n", - "assert store is not None, \"FeatureStore should be initialized\"\n", - "assert store.config is not None, \"Store config should be available\"\n", - "assert store.config.offline_store is not None, \"Offline store should be configured\"\n", - "\n", - "print(f\"✓ Offline store: {store.config.offline_store.type}\")\n", - "if hasattr(store.config, \"batch_engine\") and store.config.batch_engine:\n", - " print(f\"✓ Compute engine: {store.config.batch_engine.type}\")\n", - " # Assertion: Verify batch engine is configured if present\n", - " assert store.config.batch_engine.type is not None, \"Batch engine type should be set\"\n", - "else:\n", - " print(\"⚠ No compute engine configured\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Create Entity DataFrame\n", - "\n", - "Create an entity DataFrame for historical feature retrieval with point-in-time timestamps.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime, timedelta\n", - "import pandas as pd\n", - "\n", - "# --- Create time window ---\n", - "end_date = datetime.now().replace(microsecond=0, second=0, minute=0)\n", - "start_date = end_date - timedelta(days=2)\n", - "\n", - "\n", - "entity_df = pd.DataFrame(\n", - " {\n", - " \"driver_id\": [1001, 1002, 1003],\n", - " \"customer_id\": [2001, 2002, 2003],\n", - " \"event_timestamp\": [\n", - " pd.Timestamp(end_date - timedelta(hours=24), tz=\"UTC\"),\n", - " pd.Timestamp(end_date - timedelta(hours=12), tz=\"UTC\"),\n", - " pd.Timestamp(end_date - timedelta(hours=6), tz=\"UTC\"),\n", - " ],\n", - " }\n", - ")\n", - "\n", - "# Assertions: Verify entity DataFrame is created correctly\n", - "assert len(entity_df) == 3, f\"Expected 3 rows, got {len(entity_df)}\"\n", - "assert \"driver_id\" in entity_df.columns, \"driver_id column should be present\"\n", - "assert \"customer_id\" in entity_df.columns, \"customer_id column should be present\"\n", - "assert \"event_timestamp\" in entity_df.columns, \"event_timestamp column should be present\"\n", - "assert all(entity_df[\"driver_id\"].isin([1001, 1002, 1003])), \"driver_id values should match expected\"\n", - "assert all(entity_df[\"customer_id\"].isin([2001, 2002, 2003])), \"customer_id values should match expected\"\n", - "assert entity_df[\"event_timestamp\"].notna().all(), \"All event_timestamp values should be non-null\"\n", - "\n", - "print(f\"✓ Created entity DataFrame with {len(entity_df)} rows\")\n", - "print(f\"✓ Time range: {start_date} to {end_date}\")\n", - "print(\"\\nEntity DataFrame:\")\n", - "print(entity_df)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Retrieve Historical Features\n", - "\n", - "Retrieve historical features using Ray compute engine for distributed point-in-time joins.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Cell 4: Retrieve Historical Features\n", - "print(\"Retrieving historical features with Ray compute engine...\")\n", - "print(\"(This demonstrates distributed point-in-time joins)\")\n", - "\n", - "try:\n", - " # Get historical features - this uses Ray compute engine for distributed processing\n", - " historical_features = store.get_historical_features(\n", - " entity_df=entity_df,\n", - " features=[\n", - " \"driver_hourly_stats:conv_rate\",\n", - " \"driver_hourly_stats:acc_rate\",\n", - " \"driver_hourly_stats:avg_daily_trips\",\n", - " \"customer_daily_profile:current_balance\",\n", - " \"customer_daily_profile:avg_passenger_count\",\n", - " \"customer_daily_profile:lifetime_trip_count\",\n", - " ],\n", - " )\n", - "\n", - " # Convert to DataFrame - Ray processes this efficiently\n", - " historical_df = historical_features.to_df()\n", - " \n", - " # Assertions: Verify historical features are retrieved correctly\n", - " assert historical_df is not None, \"Historical features DataFrame should not be None\"\n", - " assert len(historical_df) > 0, \"Should retrieve at least one row of historical features\"\n", - " assert \"driver_id\" in historical_df.columns, \"driver_id should be in the result\"\n", - " assert \"customer_id\" in historical_df.columns, \"customer_id should be in the result\"\n", - " \n", - " # Verify expected feature columns are present (some may be None if data doesn't exist)\n", - " expected_features = [\n", - " \"conv_rate\", \"acc_rate\", \"avg_daily_trips\",\n", - " \"current_balance\", \"avg_passenger_count\", \"lifetime_trip_count\"\n", - " ]\n", - " feature_columns = [col for col in historical_df.columns if col in expected_features]\n", - " assert len(feature_columns) > 0, f\"Should have at least one feature column, got: {historical_df.columns.tolist()}\"\n", - " \n", - " print(f\"✓ Retrieved {len(historical_df)} historical feature rows\")\n", - " print(f\"✓ Features: {list(historical_df.columns)}\")\n", - " \n", - " # Display the results\n", - " print(\"\\nHistorical Features DataFrame:\")\n", - " display(historical_df.head(10))\n", - "\n", - "except Exception as e:\n", - " print(f\"⚠ Historical features retrieval failed: {e}\")\n", - " print(\"This might be due to missing Ray dependencies or data\")\n", - " raise\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Test On-Demand Feature Transformations\n", - "\n", - "Demonstrate on-demand feature transformations that are computed at request time.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Cell 5: Test On-Demand Features\n", - "print(\"Testing on-demand feature transformations...\")\n", - "\n", - "try:\n", - " # Get features including on-demand transformations\n", - " features_with_odfv = store.get_historical_features(\n", - " entity_df=entity_df.head(1),\n", - " features=[\n", - " \"driver_hourly_stats:conv_rate\",\n", - " \"driver_hourly_stats:acc_rate\",\n", - " \"driver_hourly_stats:avg_daily_trips\",\n", - " \"driver_activity_v2:conv_rate_plus_acc_rate\",\n", - " \"driver_activity_v2:trips_per_day_normalized\",\n", - " ],\n", - " )\n", - "\n", - " odfv_df = features_with_odfv.to_df()\n", - " \n", - " # Assertions: Verify on-demand features are computed correctly\n", - " assert odfv_df is not None, \"On-demand features DataFrame should not be None\"\n", - " assert len(odfv_df) > 0, \"Should retrieve at least one row with on-demand features\"\n", - " assert \"driver_id\" in odfv_df.columns, \"driver_id should be in the result\"\n", - " \n", - " # Verify on-demand feature columns if they exist\n", - " if \"conv_rate_plus_acc_rate\" in odfv_df.columns:\n", - " # Assertion: Verify the on-demand feature is computed\n", - " assert odfv_df[\"conv_rate_plus_acc_rate\"].notna().any(), \"conv_rate_plus_acc_rate should have non-null values\"\n", - " print(\"✓ On-demand feature 'conv_rate_plus_acc_rate' is computed\")\n", - " \n", - " if \"trips_per_day_normalized\" in odfv_df.columns:\n", - " assert odfv_df[\"trips_per_day_normalized\"].notna().any(), \"trips_per_day_normalized should have non-null values\"\n", - " print(\"✓ On-demand feature 'trips_per_day_normalized' is computed\")\n", - " \n", - " print(f\"✓ Retrieved {len(odfv_df)} rows with on-demand transformations\")\n", - " \n", - " # Display results\n", - " print(\"\\nFeatures with On-Demand Transformations:\")\n", - " display(odfv_df)\n", - " \n", - " # Show specific transformed features\n", - " if \"conv_rate_plus_acc_rate\" in odfv_df.columns:\n", - " print(\"\\nSample with on-demand features:\")\n", - " display(\n", - " odfv_df[[\"driver_id\", \"conv_rate\", \"acc_rate\", \"conv_rate_plus_acc_rate\"]]\n", - " )\n", - "\n", - "except Exception as e:\n", - " print(f\"⚠ On-demand features failed: {e}\")\n", - " raise\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Materialize Features to Online Store\n", - "\n", - "Materialize features to the online store using Ray compute engine for efficient batch processing.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import timezone\n", - "print(\"Materializing features to online store...\")\n", - "store.materialize(\n", - "\tstart_date=datetime(2025, 1, 1, tzinfo=timezone.utc),\n", - "\tend_date=end_date,\n", - ")\n", - "\n", - "# Minimal output assertion: materialization succeeded if no exception\n", - "assert True, \"Materialization completed successfully\"\n", - "print(\"✓ Initial materialization successful\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Test Online Feature Serving\n", - "\n", - "Retrieve features from the online store for low-latency serving.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Cell 7: Test Online Feature Serving\n", - "print(\"Testing online feature serving...\")\n", - "\n", - "try:\n", - " entity_rows = [\n", - " {\"driver_id\": 1001, \"customer_id\": 2001},\n", - " {\"driver_id\": 1002, \"customer_id\": 2002},\n", - " ]\n", - " \n", - " # Assertion: Verify entity rows are valid\n", - " assert len(entity_rows) == 2, \"Should have 2 entity rows\"\n", - " assert all(\"driver_id\" in row for row in entity_rows), \"All entity rows should have driver_id\"\n", - " assert all(\"customer_id\" in row for row in entity_rows), \"All entity rows should have customer_id\"\n", - " \n", - " online_features = store.get_online_features(\n", - " features=[\n", - " \"driver_hourly_stats:conv_rate\",\n", - " \"driver_hourly_stats:acc_rate\",\n", - " \"customer_daily_profile:current_balance\",\n", - " ],\n", - " entity_rows=entity_rows,\n", - " )\n", - "\n", - " online_df = online_features.to_df()\n", - " \n", - " # Assertions: Verify online features are retrieved correctly\n", - " assert online_df is not None, \"Online features DataFrame should not be None\"\n", - " assert len(online_df) == len(entity_rows), f\"Should retrieve {len(entity_rows)} rows, got {len(online_df)}\"\n", - " assert \"driver_id\" in online_df.columns, \"driver_id should be in the result\"\n", - " assert \"customer_id\" in online_df.columns, \"customer_id should be in the result\"\n", - " \n", - " # Verify expected feature columns are present\n", - " expected_features = [\"conv_rate\", \"acc_rate\", \"current_balance\"]\n", - " feature_columns = [col for col in online_df.columns if col in expected_features]\n", - " assert len(feature_columns) > 0, f\"Should have at least one feature column, got: {online_df.columns.tolist()}\"\n", - " \n", - " # Verify entity IDs match\n", - " assert all(online_df[\"driver_id\"].isin([1001, 1002])), \"driver_id values should match entity rows\"\n", - " assert all(online_df[\"customer_id\"].isin([2001, 2002])), \"customer_id values should match entity rows\"\n", - " \n", - " print(f\"✓ Retrieved {len(online_df)} online feature rows\")\n", - " print(f\"✓ Features retrieved: {feature_columns}\")\n", - " \n", - " print(\"\\nOnline Features DataFrame:\")\n", - " display(online_df)\n", - "\n", - "except Exception as e:\n", - " print(f\"⚠ Online serving failed: {e}\")\n", - " raise\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cluster.down()" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml b/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml deleted file mode 100644 index fae126b528a..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: feast-data-stores - namespace: test-ns-feast -stringData: - redis: | - connection_string: redis.test-ns-feast.svc.cluster.local:6379 - sql: | - path: postgresql+psycopg://${POSTGRESQL_USER}:${POSTGRESQL_PASSWORD}@postgres.test-ns-feast.svc.cluster.local:5432/${POSTGRESQL_DATABASE} - cache_ttl_seconds: 60 - sqlalchemy_config_kwargs: - echo: false - pool_pre_ping: true ---- -apiVersion: feast.dev/v1 -kind: FeatureStore -metadata: - name: credit-scoring - namespace: test-ns-feast -spec: - authz: - kubernetes: - roles: [] - feastProject: credit_scoring_local - feastProjectDir: - git: - url: https://github.com/feast-dev/feast-credit-score-local-tutorial - ref: 598a270 - services: - offlineStore: - persistence: - file: - type: duckdb - server: - envFrom: - - secretRef: - name: postgres-secret - env: - - name: MPLCONFIGDIR - value: /tmp - resources: - requests: - cpu: 150m - memory: 128Mi - onlineStore: - persistence: - store: - type: redis - secretRef: - name: feast-data-stores - server: - envFrom: - - secretRef: - name: postgres-secret - env: - - name: MPLCONFIGDIR - value: /tmp - resources: - requests: - cpu: 150m - memory: 128Mi - registry: - local: - persistence: - store: - type: sql - secretRef: - name: feast-data-stores - server: - envFrom: - - secretRef: - name: postgres-secret - restAPI: true diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/__init__.py b/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/example_repo.py b/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/example_repo.py deleted file mode 100755 index 7a37d99d495..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/example_repo.py +++ /dev/null @@ -1,42 +0,0 @@ -from datetime import timedelta - -from feast import ( - FeatureView, - Field, - FileSource, -) -from feast.data_format import ParquetFormat -from feast.types import Float32, Array, String, ValueType -from feast import Entity - -item = Entity( - name="item_id", - description="Item ID", - value_type=ValueType.INT64, -) - -parquet_file_path = "./data/city_wikipedia_summaries_with_embeddings.parquet" - -source = FileSource( - file_format=ParquetFormat(), - path=parquet_file_path, - timestamp_field="event_timestamp", -) - -city_embeddings_feature_view = FeatureView( - name="city_embeddings", - entities=[item], - schema=[ - Field( - name="vector", - dtype=Array(Float32), - vector_index=True, - vector_search_metric="COSINE", - ), - Field(name="state", dtype=String), - Field(name="sentence_chunks", dtype=String), - Field(name="wiki_summary", dtype=String), - ], - source=source, - ttl=timedelta(hours=2), -) diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/feature_store.yaml b/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/feature_store.yaml deleted file mode 100755 index f8f9cc293dc..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/feature_repo/feature_store.yaml +++ /dev/null @@ -1,16 +0,0 @@ -project: rag -provider: local -registry: data/registry.db -online_store: - type: milvus - path: data/online_store.db - vector_enabled: true - embedding_dim: 384 - index_type: "FLAT" - metric_type: "COSINE" -offline_store: - type: file -entity_key_serialization_version: 3 -auth: - type: no_auth - diff --git a/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml b/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml deleted file mode 100644 index ebcac54f4a0..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/kueue_resources_setup.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: kueue.x-k8s.io/v1beta1 -kind: ResourceFlavor -metadata: - name: "fs-resource-flavor" ---- -apiVersion: kueue.x-k8s.io/v1beta1 -kind: ClusterQueue -metadata: - name: "fs-cluster-queue" -spec: - namespaceSelector: {} # match all. - resourceGroups: - - coveredResources: ["cpu", "memory","nvidia.com/gpu"] - flavors: - - name: "fs-resource-flavor" - resources: - - name: "cpu" - nominalQuota: 9 - - name: "memory" - nominalQuota: 36Gi - - name: "nvidia.com/gpu" - nominalQuota: 0 ---- -apiVersion: kueue.x-k8s.io/v1beta1 -kind: LocalQueue -metadata: - name: "fs-user-queue" - annotations: - "kueue.x-k8s.io/default-queue": "true" -spec: - clusterQueue: "fs-cluster-queue" diff --git a/infra/feast-operator/test/e2e_rhoai/resources/permissions.py b/infra/feast-operator/test/e2e_rhoai/resources/permissions.py deleted file mode 100644 index 7b48a7b4c56..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -from feast.feast_object import ALL_FEATURE_VIEW_TYPES -from feast.permissions.permission import Permission -from feast.permissions.action import READ, AuthzedAction -from feast.permissions.policy import NamespaceBasedPolicy -from feast.project import Project -from feast.entity import Entity -from feast.feature_service import FeatureService -from feast.saved_dataset import SavedDataset - -perm_namespace = ["test-ns-feast"] - -WITHOUT_DATA_SOURCE = [Project, Entity, FeatureService, SavedDataset] + ALL_FEATURE_VIEW_TYPES - -test_perm = Permission( - name="feast-auth", - types=WITHOUT_DATA_SOURCE, - policy=NamespaceBasedPolicy(namespaces=perm_namespace), - actions=[AuthzedAction.DESCRIBE] + READ -) diff --git a/infra/feast-operator/test/e2e_rhoai/resources/pvc.yaml b/infra/feast-operator/test/e2e_rhoai/resources/pvc.yaml deleted file mode 100644 index a9e8c1be299..00000000000 --- a/infra/feast-operator/test/e2e_rhoai/resources/pvc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jupyterhub-nb-kube-3aadmin-pvc -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi diff --git a/infra/feast-operator/test/utils/notebook_util.go b/infra/feast-operator/test/utils/notebook_util.go deleted file mode 100644 index 8652b481889..00000000000 --- a/infra/feast-operator/test/utils/notebook_util.go +++ /dev/null @@ -1,387 +0,0 @@ -package utils - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "strings" - "text/template" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -type NotebookTemplateParams struct { - Namespace string - IngressDomain string - OpenDataHubNamespace string - NotebookImage string - NotebookConfigMapName string - NotebookPVC string - Username string - OC_TOKEN string - OC_SERVER string - NotebookFile string - Command string - PipIndexUrl string - PipTrustedHost string - FeastVerison string - OpenAIAPIKey string - FeastProject string -} - -// CreateNotebook renders a notebook manifest from a template and applies it using kubectl. -func CreateNotebook(params NotebookTemplateParams) error { - content, err := os.ReadFile("test/e2e_rhoai/resources/custom-nb.yaml") - if err != nil { - return fmt.Errorf("failed to read template file: %w", err) - } - - tmpl, err := template.New("notebook").Parse(string(content)) - if err != nil { - return fmt.Errorf("failed to parse template: %w", err) - } - - var rendered bytes.Buffer - if err := tmpl.Execute(&rendered, params); err != nil { - return fmt.Errorf("failed to substitute template: %w", err) - } - - tmpFile, err := os.CreateTemp("", "notebook-*.yaml") - if err != nil { - return fmt.Errorf("failed to create temp file: %w", err) - } - - // Defer cleanup of temp file - defer func() { - if err := os.Remove(tmpFile.Name()); err != nil { - fmt.Printf("warning: failed to remove temp file %s: %v", tmpFile.Name(), err) - } - }() - - if _, err := tmpFile.Write(rendered.Bytes()); err != nil { - return fmt.Errorf("failed to write to temp file: %w", err) - } - - if err := tmpFile.Close(); err != nil { - return fmt.Errorf("failed to close temp file: %w", err) - } - - // fmt.Println("Notebook manifest applied successfully") - cmd := exec.Command("kubectl", "apply", "-f", tmpFile.Name(), "-n", params.Namespace) - output, err := Run(cmd, "/test/e2e_rhoai") - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf( - "Failed to create Notebook %s.\nError: %v\nOutput: %s\n", - tmpFile.Name(), err, output, - )) - fmt.Printf("Notebook %s created successfully\n", tmpFile.Name()) - return nil -} - -// MonitorNotebookPod waits for a notebook pod to reach Running state and verifies execution logs. -func MonitorNotebookPod(namespace, podPrefix string, notebookName string) error { - const successMarker = "Notebook executed successfully" - const failureMarker = "Notebook execution failed" - const pollInterval = 5 * time.Second - var pod *PodInfo - - fmt.Println("🔄 Waiting for notebook pod to reach Running & Ready state...") - - foundRunningReady := false - for i := 0; i < 36; i++ { - var err error - pod, err = getPodByPrefix(namespace, podPrefix) - if err != nil { - fmt.Printf("⏳ Pod not created yet: %v\n", err) - time.Sleep(pollInterval) - continue - } - if pod.Status == "Running" { - fmt.Printf("✅ Pod %s is Running and Ready.\n", pod.Name) - foundRunningReady = true - break - } - fmt.Printf("⏳ Pod %s not ready yet. Phase: %s\n", pod.Name, pod.Status) - time.Sleep(pollInterval) - } - - if !foundRunningReady { - return fmt.Errorf("❌ Pod %s did not reach Running & Ready state within 3 minutes", podPrefix) - } - - // Start monitoring notebook logs - fmt.Printf("⏳ Monitoring Notebook pod %s Logs for Jupyter Notebook %s execution status\n", pod.Name, notebookName) - - for i := 0; i < 60; i++ { - logs, err := getPodLogs(namespace, pod.Name) - if err != nil { - fmt.Printf("⏳ Failed to get logs for pod %s: %v\n", pod.Name, err) - time.Sleep(pollInterval) - continue - } - - if strings.Contains(logs, successMarker) { - Expect(logs).To(ContainSubstring(successMarker)) - fmt.Printf("✅ Jupyter Notebook pod %s executed successfully.\n", pod.Name) - return nil - } - - if strings.Contains(logs, failureMarker) { - fmt.Printf("❌ Notebook pod %s failed: failure marker found.\n", pod.Name) - return fmt.Errorf("Notebook failed in execution. Logs:\n%s", logs) - } - - time.Sleep(pollInterval) - } - - return fmt.Errorf("❌ Timed out waiting for notebook pod %s to complete", podPrefix) -} - -type PodInfo struct { - Name string - Status string -} - -// returns the first pod matching a name prefix in the given namespace. -func getPodByPrefix(namespace, prefix string) (*PodInfo, error) { - cmd := exec.Command( - "kubectl", "get", "pods", "-n", namespace, - "-o", "jsonpath={range .items[*]}{.metadata.name} {.status.phase}{\"\\n\"}{end}", - ) - output, err := Run(cmd, "/test/e2e_rhoai") - if err != nil { - return nil, fmt.Errorf("failed to get pods: %w", err) - } - - lines := strings.Split(strings.TrimSpace(string(output)), "\n") - for _, line := range lines { - parts := strings.Fields(line) - if len(parts) < 2 { - continue - } - name := parts[0] - status := parts[1] - - if strings.HasPrefix(name, prefix) { - return &PodInfo{ - Name: name, - Status: status, - }, nil - } - } - - return nil, fmt.Errorf("no pod found with prefix %q in namespace %q", prefix, namespace) -} - -// retrieves the logs of a specified pod in the given namespace. -func getPodLogs(namespace, podName string) (string, error) { - cmd := exec.Command("kubectl", "logs", "-n", namespace, podName) - var out bytes.Buffer - var stderr bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &stderr - - err := cmd.Run() - if err != nil { - return "", fmt.Errorf("error getting pod logs: %v - %s", err, stderr.String()) - } - - return out.String(), nil -} - -// returns the OpenShift cluster ingress domain. -func GetIngressDomain(testDir string) string { - cmd := exec.Command("oc", "get", "ingresses.config.openshift.io", "cluster", "-o", "jsonpath={.spec.domain}") - output, _ := Run(cmd, testDir) - return string(output) -} - -// returns the current OpenShift user authentication token. -func GetOCToken(testDir string) string { - cmd := exec.Command("oc", "whoami", "--show-token") - output, _ := Run(cmd, testDir) - return string(output) -} - -// returns the OpenShift API server URL for the current user. -func GetOCServer(testDir string) string { - cmd := exec.Command("oc", "whoami", "--show-server") - output, _ := Run(cmd, testDir) - return string(output) -} - -// returns the OpenShift cluster logged in Username -func GetOCUser(testDir string) string { - cmd := exec.Command("oc", "whoami") - output, _ := Run(cmd, testDir) - return strings.TrimSpace(string(output)) -} - -// SetNamespaceContext sets the kubectl namespace context to the specified namespace -func SetNamespaceContext(namespace, testDir string) error { - cmd := exec.Command("kubectl", "config", "set-context", "--current", "--namespace", namespace) - output, err := Run(cmd, testDir) - if err != nil { - return fmt.Errorf("failed to set namespace context to %s: %w\nOutput: %s", namespace, err, output) - } - return nil -} - -// CreateNotebookConfigMap creates a ConfigMap containing the notebook file and feature repo -func CreateNotebookConfigMap(namespace, configMapName, notebookFile, featureRepoPath, testDir string) error { - cmd := exec.Command("kubectl", "create", "configmap", configMapName, - "--from-file="+notebookFile, - "--from-file="+featureRepoPath) - output, err := Run(cmd, testDir) - if err != nil { - return fmt.Errorf("failed to create ConfigMap %s: %w\nOutput: %s", configMapName, err, output) - } - return nil -} - -// CreateNotebookPVC creates a PersistentVolumeClaim for the notebook -func CreateNotebookPVC(pvcFile, testDir string) error { - cmd := exec.Command("kubectl", "apply", "-f", pvcFile) - _, err := Run(cmd, testDir) - if err != nil { - return fmt.Errorf("failed to create PVC from %s: %w", pvcFile, err) - } - return nil -} - -// CreateNotebookRoleBinding creates a rolebinding for the user in the specified namespace -func CreateNotebookRoleBinding(namespace, rolebindingName, username, testDir string) error { - cmd := exec.Command("kubectl", "create", "rolebinding", rolebindingName, - "-n", namespace, - "--role=admin", - "--user="+username) - _, err := Run(cmd, testDir) - if err != nil { - return fmt.Errorf("failed to create rolebinding %s: %w", rolebindingName, err) - } - return nil -} - -// BuildNotebookCommand builds the command array for executing a notebook with papermill -func BuildNotebookCommand(notebookName, testDir string) []string { - return []string{ - "/bin/sh", - "-c", - fmt.Sprintf( - "pip install papermill && "+ - "mkdir -p /opt/app-root/src/feature_repo && "+ - "cp -rL /opt/app-root/notebooks/* /opt/app-root/src/feature_repo/ && "+ - "oc login --token=%s --server=%s --insecure-skip-tls-verify=true && "+ - "(papermill /opt/app-root/notebooks/%s /opt/app-root/src/output.ipynb --kernel python3 && "+ - "echo '✅ Notebook executed successfully' || "+ - "(echo '❌ Notebook execution failed' && "+ - "cp /opt/app-root/src/output.ipynb /opt/app-root/src/failed_output.ipynb && "+ - "echo '📄 Copied failed notebook to failed_output.ipynb')) && "+ - "jupyter nbconvert --to notebook --stdout /opt/app-root/src/output.ipynb || echo '⚠️ nbconvert failed' && "+ - "sleep 100; exit 0", - GetOCToken(testDir), - GetOCServer(testDir), - notebookName, - ), - } -} - -// GetNotebookParams builds and returns NotebookTemplateParams from environment variables and configuration -// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty -func GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir string, feastProject string) NotebookTemplateParams { - username := GetOCUser(testDir) - command := BuildNotebookCommand(notebookName, testDir) - - getEnv := func(key string) string { - val, _ := os.LookupEnv(key) - return val - } - - return NotebookTemplateParams{ - Namespace: namespace, - IngressDomain: GetIngressDomain(testDir), - OpenDataHubNamespace: getEnv("APPLICATIONS_NAMESPACE"), - NotebookImage: getEnv("NOTEBOOK_IMAGE"), - NotebookConfigMapName: configMapName, - NotebookPVC: notebookPVC, - Username: username, - OC_TOKEN: GetOCToken(testDir), - OC_SERVER: GetOCServer(testDir), - NotebookFile: notebookName, - Command: "[\"" + strings.Join(command, "\",\"") + "\"]", - PipIndexUrl: getEnv("PIP_INDEX_URL"), - PipTrustedHost: getEnv("PIP_TRUSTED_HOST"), - FeastVerison: getEnv("FEAST_VERSION"), - OpenAIAPIKey: getEnv("OPENAI_API_KEY"), - FeastProject: feastProject, - } -} - -// SetupNotebookEnvironment performs all the setup steps required for notebook testing -func SetupNotebookEnvironment(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, testDir string) error { - // Set namespace context - if err := SetNamespaceContext(namespace, testDir); err != nil { - return fmt.Errorf("failed to set namespace context: %w", err) - } - - // Create config map - if err := CreateNotebookConfigMap(namespace, configMapName, notebookFile, featureRepoPath, testDir); err != nil { - return fmt.Errorf("failed to create config map: %w", err) - } - - // Create PVC - if err := CreateNotebookPVC(pvcFile, testDir); err != nil { - return fmt.Errorf("failed to create PVC: %w", err) - } - - // Create rolebinding - username := GetOCUser(testDir) - if err := CreateNotebookRoleBinding(namespace, rolebindingName, username, testDir); err != nil { - return fmt.Errorf("failed to create rolebinding: %w", err) - } - - return nil -} - -// CreateNotebookTest performs all the setup steps and creates a notebook. -// This function handles namespace context, ConfigMap, PVC, rolebinding, and notebook creation. -// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty -func CreateNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string, feastProject string) { - // Execute common setup steps - By(fmt.Sprintf("Setting namespace context to : %s", namespace)) - Expect(SetNamespaceContext(namespace, testDir)).To(Succeed()) - fmt.Printf("Successfully set namespace context to: %s\n", namespace) - - By(fmt.Sprintf("Creating Config map: %s", configMapName)) - Expect(CreateNotebookConfigMap(namespace, configMapName, notebookFile, featureRepoPath, testDir)).To(Succeed()) - fmt.Printf("ConfigMap %s created successfully\n", configMapName) - - By(fmt.Sprintf("Creating Persistent volume claim: %s", notebookPVC)) - Expect(CreateNotebookPVC(pvcFile, testDir)).To(Succeed()) - fmt.Printf("Persistent Volume Claim %s created successfully\n", notebookPVC) - - By(fmt.Sprintf("Creating rolebinding %s for the user", rolebindingName)) - Expect(CreateNotebookRoleBinding(namespace, rolebindingName, GetOCUser(testDir), testDir)).To(Succeed()) - fmt.Printf("Created rolebinding %s successfully\n", rolebindingName) - - // Build notebook parameters and create notebook - nbParams := GetNotebookParams(namespace, configMapName, notebookPVC, notebookName, testDir, feastProject) - By("Creating Jupyter Notebook") - Expect(CreateNotebook(nbParams)).To(Succeed(), "Failed to create notebook") -} - -// MonitorNotebookTest monitors the notebook execution and verifies completion. -func MonitorNotebookTest(namespace, notebookName string) { - By("Monitoring notebook logs") - Expect(MonitorNotebookPod(namespace, "jupyter-nb-", notebookName)).To(Succeed(), "Notebook execution failed") -} - -// RunNotebookTest performs all the setup steps, creates a notebook, and monitors its execution. -// This function is kept for backward compatibility. For new tests, use CreateNotebookTest and MonitorNotebookTest separately. -// feastProject is optional - if provided, it will be set in the notebook annotation, otherwise it will be empty -func RunNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir string, feastProject string) { - CreateNotebookTest(namespace, configMapName, notebookFile, featureRepoPath, pvcFile, rolebindingName, notebookPVC, notebookName, testDir, feastProject) - MonitorNotebookTest(namespace, notebookName) -} diff --git a/infra/feast-operator/test/utils/test_util.go b/infra/feast-operator/test/utils/test_util.go index a883efc020d..7b5f0f8d6a0 100644 --- a/infra/feast-operator/test/utils/test_util.go +++ b/infra/feast-operator/test/utils/test_util.go @@ -152,104 +152,6 @@ func checkIfConfigMapExists(namespace, configMapName string) error { return nil } -// ListConfigMaps lists all ConfigMaps in the given namespace -func ListConfigMaps(namespace string) ([]string, error) { - cmd := exec.Command("kubectl", "get", "cm", "-n", namespace, "-o", "jsonpath={range .items[*]}{.metadata.name}{\"\\n\"}{end}") - var out bytes.Buffer - var stderr bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &stderr - - if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("failed to list config maps in namespace %s. Error: %v. Stderr: %s", - namespace, err, stderr.String()) - } - - configMaps := strings.Split(strings.TrimSpace(out.String()), "\n") - // Filter out empty strings - var result []string - for _, cm := range configMaps { - if cm != "" { - result = append(result, cm) - } - } - return result, nil -} - -// VerifyConfigMapExistsInList checks if a ConfigMap exists in the list of ConfigMaps -func VerifyConfigMapExistsInList(namespace, configMapName string) (bool, error) { - configMaps, err := ListConfigMaps(namespace) - if err != nil { - return false, err - } - - for _, cm := range configMaps { - if cm == configMapName { - return true, nil - } - } - - return false, nil -} - -// VerifyFeastConfigMapExists verifies that a ConfigMap exists and contains the specified key/file -func VerifyFeastConfigMapExists(namespace, configMapName, expectedKey string) error { - // First verify the ConfigMap exists - if err := checkIfConfigMapExists(namespace, configMapName); err != nil { - return fmt.Errorf("config map %s does not exist: %w", configMapName, err) - } - - // Get the ConfigMap data to verify the key exists - cmd := exec.Command("kubectl", "get", "cm", configMapName, "-n", namespace, "-o", "jsonpath={.data."+expectedKey+"}") - var out bytes.Buffer - var stderr bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &stderr - - if err := cmd.Run(); err != nil { - return fmt.Errorf("failed to get config map data for %s in namespace %s. Error: %v. Stderr: %s", - configMapName, namespace, err, stderr.String()) - } - - configContent := out.String() - if configContent == "" { - return fmt.Errorf("config map %s does not contain key %s", configMapName, expectedKey) - } - - return nil -} - -// VerifyFeastConfigMapContent verifies that a ConfigMap contains the expected feast configuration content -// This assumes the ConfigMap and key already exist (use VerifyFeastConfigMapExists first) -func VerifyFeastConfigMapContent(namespace, configMapName, expectedKey string, expectedContent []string) error { - // Get the ConfigMap data - cmd := exec.Command("kubectl", "get", "cm", configMapName, "-n", namespace, "-o", "jsonpath={.data."+expectedKey+"}") - var out bytes.Buffer - var stderr bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &stderr - - if err := cmd.Run(); err != nil { - return fmt.Errorf("failed to get config map data for %s in namespace %s. Error: %v. Stderr: %s", - configMapName, namespace, err, stderr.String()) - } - - configContent := out.String() - if configContent == "" { - return fmt.Errorf("config map %s does not contain key %s", configMapName, expectedKey) - } - - // Verify all expected content strings are present - for _, expected := range expectedContent { - if !strings.Contains(configContent, expected) { - return fmt.Errorf("config map %s content does not contain expected string: %s. Content:\n%s", - configMapName, expected, configContent) - } - } - - return nil -} - // validates if a kubernetes service exists using the kubectl CLI. func checkIfKubernetesServiceExists(namespace, serviceName string) error { cmd := exec.Command("kubectl", "get", "service", serviceName, "-n", namespace) @@ -794,77 +696,3 @@ func ApplyFeastYamlAndVerify(namespace string, testDir string, feastDeploymentNa By("Verifying client feature_store.yaml for expected store types") validateFeatureStoreYaml(namespace, feastDeploymentName) } - -// ReplaceNamespaceInYaml reads a YAML file, replaces all existingNamespace with the actual namespace -func ReplaceNamespaceInYamlFilesInPlace(filePaths []string, existingNamespace string, actualNamespace string) error { - for _, filePath := range filePaths { - data, err := os.ReadFile(filePath) - if err != nil { - return fmt.Errorf("failed to read YAML file %s: %w", filePath, err) - } - updated := strings.ReplaceAll(string(data), existingNamespace, actualNamespace) - - err = os.WriteFile(filePath, []byte(updated), 0644) - if err != nil { - return fmt.Errorf("failed to write updated YAML file %s: %w", filePath, err) - } - } - return nil -} - -func ApplyFeastPermissions(fileName string, registryFilePath string, namespace string, podNamePrefix string) { - By("Applying Feast permissions to the Feast registry pod") - - // 1. Get the pod by prefix - By(fmt.Sprintf("Finding pod with prefix %q in namespace %q", podNamePrefix, namespace)) - pod, err := getPodByPrefix(namespace, podNamePrefix) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - ExpectWithOffset(1, pod).NotTo(BeNil()) - - podName := pod.Name - fmt.Printf("Found pod: %s\n", podName) - - cmd := exec.Command( - "oc", "cp", - fileName, // local source file - fmt.Sprintf("%s/%s:%s", namespace, podName, registryFilePath), // remote destination - "-c", "registry", - ) - - _, err = Run(cmd, "/test/e2e_rhoai") - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - fmt.Printf("Successfully copied file to pod: %s\n", podName) - - // Run `feast apply` inside the pod to apply updated permissions - By("Running feast apply inside the Feast registry pod") - cmd = exec.Command( - "oc", "exec", podName, - "-n", namespace, - "-c", "registry", - "--", - "bash", "-c", - "cd /feast-data/credit_scoring_local/feature_repo && feast apply", - ) - _, err = Run(cmd, "/test/e2e_rhoai") - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - fmt.Println("Feast permissions apply executed successfully") - - By("Validating that Feast permission has been applied") - - cmd = exec.Command( - "oc", "exec", podName, - "-n", namespace, - "-c", "registry", - "--", - "feast", "permissions", "list", - ) - - output, err := Run(cmd, "/test/e2e_rhoai") - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - // Change "feast-auth" if your permission name is different - ExpectWithOffset(1, output).To(ContainSubstring("feast-auth"), "Expected permission 'feast-auth' to exist") - - fmt.Println("Verified: Feast permission 'feast-auth' exists") -} From 11122cef17be1180a9c390234d06efdf8b51c938 Mon Sep 17 00:00:00 2001 From: Yassin Nouh <70436855+YassinNouh21@users.noreply.github.com> Date: Sat, 10 Jan 2026 03:21:15 +0200 Subject: [PATCH 18/26] fix: Add get_table_query_string_with_alias() for PostgreSQL subquery aliasing (#5811) --- .../postgres_offline_store/postgres_source.py | 34 +++++ .../postgres_offline_store/test_postgres.py | 135 ++++++++++++++++++ 2 files changed, 169 insertions(+) diff --git a/sdk/python/feast/infra/offline_stores/contrib/postgres_offline_store/postgres_source.py b/sdk/python/feast/infra/offline_stores/contrib/postgres_offline_store/postgres_source.py index 0d3045e4aa7..272b8ad0474 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/postgres_offline_store/postgres_source.py +++ b/sdk/python/feast/infra/offline_stores/contrib/postgres_offline_store/postgres_source.py @@ -145,11 +145,45 @@ def get_table_column_names_and_types( ) def get_table_query_string(self) -> str: + """Returns a string that can be used to reference this table in SQL. + + For query-based sources, returns the query wrapped in parentheses. + + Note: + When using the returned string directly in a FROM clause with PostgreSQL, + you may need to add an alias if this is a query-based source. PostgreSQL + requires all subqueries in FROM clauses to have aliases. Consider using + get_table_query_string_with_alias() for automatic aliasing. + """ if self._postgres_options._table: return f"{self._postgres_options._table}" else: return f"({self._postgres_options._query})" + def get_table_query_string_with_alias(self, alias: str = "subquery") -> str: + """Returns a string for use in FROM clause with alias for PostgreSQL compatibility. + + PostgreSQL requires all subqueries in FROM clauses to have aliases. This method + automatically adds an alias when the source is query-based. + + Args: + alias: The alias to use for query-based sources. Defaults to "subquery". + + Returns: + For table-based sources: the table name (no alias needed). + For query-based sources: "(query) AS alias". + + Example:: + + source = PostgreSQLSource(query="SELECT * FROM my_table", ...) + entity_sql = f"SELECT id, ts FROM {source.get_table_query_string_with_alias()}" + # Results in: "SELECT id, ts FROM (SELECT * FROM my_table) AS subquery" + """ + if self._postgres_options._table: + return f"{self._postgres_options._table}" + else: + return f"({self._postgres_options._query}) AS {alias}" + class PostgreSQLOptions: def __init__( diff --git a/sdk/python/tests/unit/infra/offline_stores/contrib/postgres_offline_store/test_postgres.py b/sdk/python/tests/unit/infra/offline_stores/contrib/postgres_offline_store/test_postgres.py index ce98315eef4..fad837e4c16 100644 --- a/sdk/python/tests/unit/infra/offline_stores/contrib/postgres_offline_store/test_postgres.py +++ b/sdk/python/tests/unit/infra/offline_stores/contrib/postgres_offline_store/test_postgres.py @@ -950,3 +950,138 @@ def test_cli_date_combinations(self): # Should not fail on parameter validation stderr_output = result.stderr.decode() assert "must be provided" not in stderr_output + + +class TestPostgreSQLSourceQueryStringAlias: + """Test suite for get_table_query_string_with_alias() method. + + This addresses GitHub issue #5605: PostgreSQL requires all subqueries + in FROM clauses to have aliases. + """ + + def test_table_source_get_table_query_string(self): + """Test get_table_query_string() with table-based source""" + source = PostgreSQLSource( + name="test_source", + table="my_schema.my_table", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string() + assert result == "my_schema.my_table" + + def test_query_source_get_table_query_string(self): + """Test get_table_query_string() with query-based source""" + source = PostgreSQLSource( + name="test_source", + query="SELECT * FROM my_table WHERE active = true", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string() + assert result == "(SELECT * FROM my_table WHERE active = true)" + + def test_table_source_with_alias(self): + """Test get_table_query_string_with_alias() with table-based source returns table without alias""" + source = PostgreSQLSource( + name="test_source", + table="my_schema.my_table", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string_with_alias() + # Table sources don't need aliases + assert result == "my_schema.my_table" + + def test_query_source_with_default_alias(self): + """Test get_table_query_string_with_alias() with query-based source uses default alias""" + source = PostgreSQLSource( + name="test_source", + query="SELECT * FROM my_table WHERE active = true", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string_with_alias() + assert result == "(SELECT * FROM my_table WHERE active = true) AS subquery" + + def test_query_source_with_custom_alias(self): + """Test get_table_query_string_with_alias() with custom alias""" + source = PostgreSQLSource( + name="test_source", + query="SELECT id, name FROM users", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string_with_alias(alias="user_data") + assert result == "(SELECT id, name FROM users) AS user_data" + + def test_table_source_with_custom_alias_ignored(self): + """Test get_table_query_string_with_alias() ignores alias for table-based sources""" + source = PostgreSQLSource( + name="test_source", + table="events", + timestamp_field="event_timestamp", + ) + result = source.get_table_query_string_with_alias(alias="ignored_alias") + # Alias should be ignored for table sources + assert result == "events" + + def test_sql_query_with_alias_is_valid(self): + """Test that SQL using get_table_query_string_with_alias() is syntactically valid""" + source = PostgreSQLSource( + name="test_source", + query="SELECT id, ts FROM raw_data", + timestamp_field="ts", + ) + + # Construct a SQL query using the new method + entity_sql = f"SELECT id, ts FROM {source.get_table_query_string_with_alias()}" + + # Verify SQL is valid using sqlglot + parsed = sqlglot.parse(entity_sql, dialect="postgres") + assert len(parsed) == 1 + assert parsed[0] is not None + + def test_sql_query_without_alias_fails_in_postgres(self): + """Test that SQL using get_table_query_string() for query source produces invalid PostgreSQL + + This demonstrates the issue that get_table_query_string_with_alias() fixes: + PostgreSQL requires all subqueries in FROM clauses to have aliases. + """ + source = PostgreSQLSource( + name="test_source", + query="SELECT id, ts FROM raw_data", + timestamp_field="ts", + ) + + # Using the old method (without alias) for query-based source + entity_sql_without_alias = ( + f"SELECT id, ts FROM {source.get_table_query_string()}" + ) + + # This produces: SELECT id, ts FROM (SELECT id, ts FROM raw_data) + # which is invalid in PostgreSQL (subquery needs alias) + # sqlglot is lenient and may parse it, but PostgreSQL would reject it + assert "AS" not in entity_sql_without_alias, ( + "get_table_query_string() should not add alias" + ) + + # Using the new method (with alias) produces valid SQL + entity_sql_with_alias = ( + f"SELECT id, ts FROM {source.get_table_query_string_with_alias()}" + ) + assert "AS subquery" in entity_sql_with_alias + + def test_complex_query_with_alias(self): + """Test get_table_query_string_with_alias() with complex nested query""" + complex_query = """ + SELECT u.id, u.name, o.total + FROM users u + JOIN orders o ON u.id = o.user_id + WHERE o.created_at > '2023-01-01' + """ + source = PostgreSQLSource( + name="test_source", + query=complex_query, + timestamp_field="created_at", + ) + + result = source.get_table_query_string_with_alias(alias="user_orders") + assert result.startswith("(") + assert result.endswith(") AS user_orders") + assert "SELECT u.id" in result From 6e401d9471ca7747da38fea5c0027d5718c9096f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:31:52 +0000 Subject: [PATCH 19/26] chore(deps): Bump urllib3 from 2.6.2 to 2.6.3 in /sdk/python/requirements (#5822) chore(deps): Bump urllib3 in /sdk/python/requirements Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.2 to 2.6.3. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.2...2.6.3) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.6.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sdk/python/requirements/py3.10-ci-requirements.txt | 6 +++--- sdk/python/requirements/py3.10-minimal-requirements.txt | 6 +++--- .../requirements/py3.10-minimal-sdist-requirements.txt | 6 +++--- sdk/python/requirements/py3.10-requirements.txt | 6 +++--- sdk/python/requirements/py3.11-ci-requirements.txt | 6 +++--- sdk/python/requirements/py3.11-minimal-requirements.txt | 6 +++--- .../requirements/py3.11-minimal-sdist-requirements.txt | 6 +++--- sdk/python/requirements/py3.11-requirements.txt | 6 +++--- sdk/python/requirements/py3.12-ci-requirements.txt | 6 +++--- sdk/python/requirements/py3.12-minimal-requirements.txt | 6 +++--- .../requirements/py3.12-minimal-sdist-requirements.txt | 6 +++--- sdk/python/requirements/py3.12-requirements.txt | 6 +++--- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 2c448173938..554c9eba60f 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -5988,9 +5988,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.10-minimal-requirements.txt b/sdk/python/requirements/py3.10-minimal-requirements.txt index 66d34c10570..49c47aba783 100644 --- a/sdk/python/requirements/py3.10-minimal-requirements.txt +++ b/sdk/python/requirements/py3.10-minimal-requirements.txt @@ -2812,9 +2812,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt index 1c92409c888..159a6a266ae 100644 --- a/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.10-minimal-sdist-requirements.txt @@ -3092,9 +3092,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt index 6f38b0c16c6..bf89b08b92a 100644 --- a/sdk/python/requirements/py3.10-requirements.txt +++ b/sdk/python/requirements/py3.10-requirements.txt @@ -1326,9 +1326,9 @@ tzdata==2025.3 \ --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index 091236521ff..b3bbdb5ad4d 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -6229,9 +6229,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.11-minimal-requirements.txt b/sdk/python/requirements/py3.11-minimal-requirements.txt index 93613cb6e50..04ac9943f7b 100644 --- a/sdk/python/requirements/py3.11-minimal-requirements.txt +++ b/sdk/python/requirements/py3.11-minimal-requirements.txt @@ -2816,9 +2816,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt index 3fb8dbf6562..56fa579fe39 100644 --- a/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.11-minimal-sdist-requirements.txt @@ -3092,9 +3092,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.11-requirements.txt b/sdk/python/requirements/py3.11-requirements.txt index 8253a7a0800..fcae25c341f 100644 --- a/sdk/python/requirements/py3.11-requirements.txt +++ b/sdk/python/requirements/py3.11-requirements.txt @@ -1293,9 +1293,9 @@ tzdata==2025.3 \ --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ diff --git a/sdk/python/requirements/py3.12-ci-requirements.txt b/sdk/python/requirements/py3.12-ci-requirements.txt index 50efe8231a9..48c1fc21371 100644 --- a/sdk/python/requirements/py3.12-ci-requirements.txt +++ b/sdk/python/requirements/py3.12-ci-requirements.txt @@ -6217,9 +6217,9 @@ uri-template==1.3.0 \ --hash=sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7 \ --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # via jsonschema -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # feast (setup.py) # botocore diff --git a/sdk/python/requirements/py3.12-minimal-requirements.txt b/sdk/python/requirements/py3.12-minimal-requirements.txt index d2064d4ed78..707d8cdddad 100644 --- a/sdk/python/requirements/py3.12-minimal-requirements.txt +++ b/sdk/python/requirements/py3.12-minimal-requirements.txt @@ -2808,9 +2808,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt b/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt index ac6f755be87..b787047fe86 100644 --- a/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt +++ b/sdk/python/requirements/py3.12-minimal-sdist-requirements.txt @@ -3084,9 +3084,9 @@ ujson==5.11.0 \ --hash=sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc \ --hash=sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39 # via pymilvus -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via # botocore # kubernetes diff --git a/sdk/python/requirements/py3.12-requirements.txt b/sdk/python/requirements/py3.12-requirements.txt index 697d4f25b0c..cefe5dbf8c7 100644 --- a/sdk/python/requirements/py3.12-requirements.txt +++ b/sdk/python/requirements/py3.12-requirements.txt @@ -1289,9 +1289,9 @@ tzdata==2025.3 \ --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas -urllib3==2.6.2 \ - --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ - --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via requests uvicorn[standard]==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ From ef3dc050e1072f3d50299e33a85fcf612ab8ce3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:32:04 +0000 Subject: [PATCH 20/26] chore(deps): Bump golang.org/x/crypto from 0.43.0 to 0.45.0 (#5819) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.43.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.43.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 15 ++++++------- go.sum | 66 ++++++++++++++++++++++++++-------------------------------- 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/go.mod b/go.mod index 7f918de268e..5b2592536df 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.24.0 toolchain go1.24.4 require ( + cloud.google.com/go/storage v1.58.0 github.com/apache/arrow/go/v17 v17.0.0 github.com/aws/aws-sdk-go-v2 v1.36.4 github.com/aws/aws-sdk-go-v2/config v1.29.14 @@ -39,7 +40,6 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect - cloud.google.com/go/storage v1.58.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect @@ -101,15 +101,16 @@ require ( go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect - golang.org/x/crypto v0.43.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/net v0.46.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.47.0 // indirect golang.org/x/oauth2 v0.33.0 // indirect - golang.org/x/sys v0.37.0 // indirect - golang.org/x/text v0.30.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.37.0 // indirect + golang.org/x/tools v0.38.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.256.0 // indirect google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 // indirect diff --git a/go.sum b/go.sum index 7d306beabb6..aff636cad1b 100644 --- a/go.sum +++ b/go.sum @@ -10,14 +10,22 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= +cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/storage v1.58.0 h1:PflFXlmFJjG/nBeR9B7pKddLQWaFaRWx4uUi/LyNxxo= cloud.google.com/go/storage v1.58.0/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0 h1:xfK3bbi6F2RDtaZFtUdKO3osOBIhNb+xTs8lFW6yx9o= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= @@ -84,8 +92,11 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= @@ -110,6 +121,8 @@ github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81A github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -154,9 +167,8 @@ github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0 github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= github.com/roberson-io/mmh3 v0.0.0-20190729202758-fdfce3ba6225 h1:ZMsPCp7oYgjoIFt1c+sM2qojxZXotSYcMF8Ur9/LJlM= github.com/roberson-io/mmh3 v0.0.0-20190729202758-fdfce3ba6225/go.mod h1:XEESr+X1SY8ZSuc3jqsTlb3clCkqQJ4DcF3Qxv1N3PM= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -174,8 +186,6 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= @@ -190,6 +200,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZF go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= @@ -202,42 +214,32 @@ go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOV go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= @@ -246,20 +248,12 @@ google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI= google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964= google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 h1:LvZVVaPE0JSqL+ZWb6ErZfnEOKIqqFWUJE2D0fObSmc= google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9/go.mod h1:QFOrLhdAe2PsTp3vQY4quuLKTi9j3XG3r6JPPaw7MSc= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4= google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8= google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 3c10b6eb693ba3e930020346f3edf6a70d30f5a1 Mon Sep 17 00:00:00 2001 From: Calvin Devereaux <43762553+WhiteLotusLA@users.noreply.github.com> Date: Mon, 12 Jan 2026 22:51:32 -0800 Subject: [PATCH 21/26] fix: Update model_validator to use instance method signature (Pydantic v2.12 deprecation) (#5825) fix: update model_validator to use instance method signature Pydantic v2.12 deprecated using @model_validator(mode='after') with a classmethod-style signature (cls, values). This change updates the _validate_credentials method to use the correct instance method signature (self), which: - Eliminates the deprecation warning - Uses direct attribute access (self.username) instead of dict access - Returns self instead of values This is a non-breaking change that maintains the same validation logic while conforming to Pydantic v2.12+ best practices. Fixes deprecation warning: 'Using @model_validator with mode="after" on a classmethod is deprecated' Signed-off-by: WhiteLotusLA --- sdk/python/feast/permissions/auth_model.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/sdk/python/feast/permissions/auth_model.py b/sdk/python/feast/permissions/auth_model.py index 179a8bc0c0e..3690d62b728 100644 --- a/sdk/python/feast/permissions/auth_model.py +++ b/sdk/python/feast/permissions/auth_model.py @@ -33,25 +33,23 @@ class OidcClientAuthConfig(OidcAuthConfig): token: Optional[str] = None # pre-issued `token` @model_validator(mode="after") - def _validate_credentials(cls, values): + def _validate_credentials(self): """Enforce exactly one valid credential set.""" - d = values.__dict__ if hasattr(values, "__dict__") else values - - has_user_pass = bool(d.get("username")) and bool(d.get("password")) - has_secret = bool(d.get("client_secret")) - has_token = bool(d.get("token")) + has_user_pass = bool(self.username) and bool(self.password) + has_secret = bool(self.client_secret) + has_token = bool(self.token) # 1 static token if has_token and not (has_user_pass or has_secret): - return values + return self # 2 client_credentials if has_secret and not has_user_pass and not has_token: - return values + return self # 3 ROPG if has_user_pass and has_secret and not has_token: - return values + return self raise ValueError( "Invalid OIDC client auth combination: " From de37f6677ad3b6ca7862734e50593eaad7aaef57 Mon Sep 17 00:00:00 2001 From: Aniket Paluskar <64416568+aniketpalu@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:36:57 +0530 Subject: [PATCH 22/26] fix: Search API to return all matching tags in matched_tags field (#5843) * fix: Search API to return all matching tags in matched_tags field Signed-off-by: Aniket Paluskar * Added unit tests to check if multiple tags are returned if they are matching the query Signed-off-by: Aniket Paluskar --------- Signed-off-by: Aniket Paluskar --- .../feature-servers/registry-server.md | 13 ++- .../feast/api/registry/rest/rest_utils.py | 66 +++++++------ sdk/python/tests/unit/api/test_search_api.py | 98 +++++++++++++------ 3 files changed, 112 insertions(+), 65 deletions(-) diff --git a/docs/reference/feature-servers/registry-server.md b/docs/reference/feature-servers/registry-server.md index dbcf661fc86..496eaa8badc 100644 --- a/docs/reference/feature-servers/registry-server.md +++ b/docs/reference/feature-servers/registry-server.md @@ -1207,28 +1207,33 @@ Please refer the [page](./../../../docs/getting-started/concepts/permission.md) "name": "user_id", "description": "Primary identifier for users", "project": "project1", - "match_score": 100 + "match_score": 100, + "matched_tags": {} }, { "type": "featureView", "name": "user_features", "description": "User demographic and behavioral features", "project": "project1", - "match_score": 100 + "match_score": 100, + "matched_tags": {"team": "user_analytics"} }, { "type": "feature", "name": "user_age", "description": "Age of the user in years", "project": "project1", - "match_score": 80 + "featureView": "user_features", + "match_score": 80, + "matched_tags": {} }, { "type": "dataSource", "name": "user_analytics", "description": "Analytics data for user behavior tracking", "project": "project2", - "match_score": 80 + "match_score": 80, + "matched_tags": {"source": "user_data"} } ], "pagination": { diff --git a/sdk/python/feast/api/registry/rest/rest_utils.py b/sdk/python/feast/api/registry/rest/rest_utils.py index dac6b7ccf7b..4c517b0abdf 100644 --- a/sdk/python/feast/api/registry/rest/rest_utils.py +++ b/sdk/python/feast/api/registry/rest/rest_utils.py @@ -18,7 +18,6 @@ MATCH_SCORE_NAME = 100 MATCH_SCORE_DESCRIPTION = 80 MATCH_SCORE_TAGS = 60 -MATCH_SCORE_PARTIAL = 40 def grpc_call(handler_fn, request): @@ -537,12 +536,42 @@ def filter_search_results_and_match_score( ) -> List[Dict]: """Filter search results based on query string""" if not query: + # Add all tags as matched_tags when no query (all tags match) + for result in results: + result["matched_tags"] = result.get("tags", {}) return results query_lower = query.lower() filtered_results = [] for result in results: + matched_tags = {} + best_fuzzy_tag_score = 0.0 + + # Collect all matching tags (exact and fuzzy) upfront + tags = result.get("tags", {}) + has_exact_tag_match = False + + for key, value in tags.items(): + key_lower = str(key).lower() + value_str = str(value).lower() + tag_combined = f"{key_lower}={value_str}" + + # Exact match in key or value + if query_lower in tag_combined: + has_exact_tag_match = True + matched_tags[key] = value + else: + # Fuzzy match for tags (on combined "key:value" string) + tag_fuzzy_score = fuzzy_match(query_lower, tag_combined) + + if tag_fuzzy_score >= MATCH_SCORE_DEFAULT_THRESHOLD: + matched_tags[key] = value + if tag_fuzzy_score > best_fuzzy_tag_score: + best_fuzzy_tag_score = tag_fuzzy_score + + result["matched_tags"] = matched_tags + # Search in name if query_lower in result.get("name", "").lower(): result["match_score"] = MATCH_SCORE_NAME @@ -555,42 +584,15 @@ def filter_search_results_and_match_score( filtered_results.append(result) continue - # Search in tags - tags = result.get("tags", {}) - tag_match = False - matched_tag = None - best_fuzzy_score = 0.0 - best_fuzzy_tag = None - - for key, value in tags.items(): - key_lower = key.lower() - value_str = str(value).lower() - - # Exact match in key or value - if query_lower in key_lower or query_lower in value_str: - tag_match = True - # Store the matched tag as a dictionary - matched_tag = {key: value} - break - - # Fuzzy match for tags (on combined "key:value" string) - tag_combined = f"{key_lower}={value_str}" - tag_fuzzy_score = fuzzy_match(query_lower, tag_combined) - - if tag_fuzzy_score > best_fuzzy_score: - best_fuzzy_score = tag_fuzzy_score - best_fuzzy_tag = {key: value} - - if tag_match: + # Exact tag match + if has_exact_tag_match: result["match_score"] = MATCH_SCORE_TAGS - result["matched_tag"] = matched_tag filtered_results.append(result) continue # Fuzzy tag match - if best_fuzzy_score >= MATCH_SCORE_DEFAULT_THRESHOLD: - result["match_score"] = best_fuzzy_score * 100 - result["matched_tag"] = best_fuzzy_tag + if best_fuzzy_tag_score >= MATCH_SCORE_DEFAULT_THRESHOLD: + result["match_score"] = best_fuzzy_tag_score * 100 filtered_results.append(result) continue diff --git a/sdk/python/tests/unit/api/test_search_api.py b/sdk/python/tests/unit/api/test_search_api.py index 9116db1c59b..f0d7c3942e8 100644 --- a/sdk/python/tests/unit/api/test_search_api.py +++ b/sdk/python/tests/unit/api/test_search_api.py @@ -734,8 +734,8 @@ def test_search_by_tags(self, shared_search_responses): f"Expected to find some of {expected_resources} but found none in {found_resources}" ) - def test_search_matched_tag_exact_match(self, search_test_app): - """Test that matched_tag field is present when a tag matches exactly""" + def test_search_matched_tags_exact_match(self, search_test_app): + """Test that matched_tags field is present when a tag matches exactly""" # Search for "data" which should match tag key "team" with value "data" response = search_test_app.get("/search?query=data") assert response.status_code == 200 @@ -745,34 +745,75 @@ def test_search_matched_tag_exact_match(self, search_test_app): # Find results that matched via tags (match_score = 60) tag_matched_results = [ - r for r in results if r.get("match_score") == 60 and "matched_tag" in r + r for r in results if r.get("match_score") == 60 and "matched_tags" in r ] assert len(tag_matched_results) > 0, ( - "Expected to find at least one result with matched_tag from tag matching" + "Expected to find at least one result with matched_tags from tag matching" ) - # Verify matched_tag is present and has a valid dictionary value + # Verify matched_tags is present and has a valid dictionary value for result in tag_matched_results: - matched_tag = result.get("matched_tag") - assert matched_tag is not None, ( - f"matched_tag should not be None for result {result['name']}" + matched_tags = result.get("matched_tags") + assert matched_tags is not None, ( + f"matched_tags should not be None for result {result['name']}" ) - assert isinstance(matched_tag, dict), ( - f"matched_tag should be a dictionary, got {type(matched_tag)}" + assert isinstance(matched_tags, dict), ( + f"matched_tags should be a dictionary, got {type(matched_tags)}" ) - # matched_tag should be a dictionary with key:value format - assert len(matched_tag) > 0, "matched_tag should not be empty" - assert len(matched_tag) == 1, ( - f"matched_tag should contain exactly one key-value pair, got {len(matched_tag)}" + # matched_tags should be a non-empty dict for tag-matched results + assert len(matched_tags) > 0, ( + "matched_tags should not be empty for tag matches" ) logger.debug( - f"Found {len(tag_matched_results)} results with matched_tag: {[r['name'] + ' -> ' + str(r.get('matched_tag', 'N/A')) for r in tag_matched_results]}" + f"Found {len(tag_matched_results)} results with matched_tags: {[r['name'] + ' -> ' + str(r.get('matched_tags', 'N/A')) for r in tag_matched_results]}" ) - def test_search_matched_tag_fuzzy_match(self, search_test_app): - """Test that matched_tag field is present when a tag matches via fuzzy matching""" + def test_search_matched_tags_multiple_tags(self, search_test_app): + """Test that multiple matching tags are returned in matched_tags""" + # Search for "a" which should match: + # - Names containing "a" (e.g., user_training_dataset, data sources) + # - Tags where key/value contains "a": "team" (key), "data" (value), "training" (value) + response = search_test_app.get("/search?query=a") + logger.info(response.json()) + assert response.status_code == 200 + + data = response.json() + results = data["results"] + + # Find user_training_dataset which has tags: {"environment": "test", "purpose": "training", "team": "data"} + # "team" contains "a", "data" contains "a", "training" contains "a" + # So matched_tags should have at least 2 entries: "purpose" and "team" + dataset_results = [ + r for r in results if r.get("name") == "user_training_dataset" + ] + + assert len(dataset_results) > 0, ( + "Expected to find user_training_dataset in results" + ) + + dataset_result = dataset_results[0] + matched_tags = dataset_result.get("matched_tags", {}) + + assert isinstance(matched_tags, dict), ( + f"matched_tags should be a dictionary, got {type(matched_tags)}" + ) + + # Should have multiple matching tags: "purpose" and "team" + assert len(matched_tags) >= 2, ( + f"Expected at least 2 matching tags for 'a' query, got {len(matched_tags)}: {matched_tags}" + ) + + # Verify the expected tags are present + assert "team" in matched_tags and "purpose" in matched_tags, ( + f"Expected 'team' and 'purpose' in matched_tags, got: {matched_tags}" + ) + + logger.debug(f"user_training_dataset matched_tags: {matched_tags}") + + def test_search_matched_tags_fuzzy_match(self, search_test_app): + """Test that matched_tags field is present when a tag matches via fuzzy matching""" # Search for "te" which should fuzzy match tag key "team" # "te" vs "team": overlap={'t','e'}/union={'t','e','a','m'} = 2/4 = 50% (below threshold) # Try "tea" which should fuzzy match "team" better @@ -789,7 +830,7 @@ def test_search_matched_tag_fuzzy_match(self, search_test_app): for r in results if r.get("match_score", 0) >= 40 and r.get("match_score", 0) < 60 - and "matched_tag" in r + and "matched_tags" in r ] # If we don't find fuzzy matches, try a different query that's more likely to match @@ -805,22 +846,21 @@ def test_search_matched_tag_fuzzy_match(self, search_test_app): for r in results if r.get("match_score", 0) >= 40 and r.get("match_score", 0) < 60 - and "matched_tag" in r + and "matched_tags" in r ] if len(fuzzy_tag_matched_results) > 0: - # Verify matched_tag is present for fuzzy matches + # Verify matched_tags is present for fuzzy matches for result in fuzzy_tag_matched_results: - matched_tag = result.get("matched_tag") - assert matched_tag is not None, ( - f"matched_tag should not be None for fuzzy-matched result {result['name']}" + matched_tags = result.get("matched_tags") + assert matched_tags is not None, ( + f"matched_tags should not be None for fuzzy-matched result {result['name']}" ) - assert isinstance(matched_tag, dict), ( - f"matched_tag should be a dictionary, got {type(matched_tag)}" + assert isinstance(matched_tags, dict), ( + f"matched_tags should be a dictionary, got {type(matched_tags)}" ) - assert len(matched_tag) > 0, "matched_tag should not be empty" - assert len(matched_tag) == 1, ( - f"matched_tag should contain exactly one key-value pair, got {len(matched_tag)}" + assert len(matched_tags) > 0, ( + "matched_tags should not be empty for fuzzy tag matches" ) # Verify the match_score is in the fuzzy range assert 40 <= result.get("match_score", 0) < 60, ( @@ -828,7 +868,7 @@ def test_search_matched_tag_fuzzy_match(self, search_test_app): ) logger.debug( - f"Found {len(fuzzy_tag_matched_results)} results with fuzzy matched_tag: {[r['name'] + ' -> ' + str(r.get('matched_tag', 'N/A')) + ' (score: ' + str(r.get('match_score', 'N/A')) + ')' for r in fuzzy_tag_matched_results]}" + f"Found {len(fuzzy_tag_matched_results)} results with fuzzy matched_tags: {[r['name'] + ' -> ' + str(r.get('matched_tags', 'N/A')) + ' (score: ' + str(r.get('match_score', 'N/A')) + ')' for r in fuzzy_tag_matched_results]}" ) def test_search_sorting_functionality(self, shared_search_responses): From 1524f1ca14bed2f274617035b5eb34f427617b0b Mon Sep 17 00:00:00 2001 From: Jitendra Yejare Date: Tue, 13 Jan 2026 20:22:37 +0530 Subject: [PATCH 23/26] fix: Denial by default to all resources when no permissions set (#5663) * Denial by default to all resources when no permissions set Signed-off-by: jyejare filter only for named patterns No matching permissions are handled * Tests are updated to match the new behavior Signed-off-by: jyejare --------- Signed-off-by: jyejare --- sdk/python/feast/permissions/enforcer.py | 49 ++++++++++++++----- .../auth/server/test_auth_registry_server.py | 30 ++++++++++++ .../unit/permissions/test_security_manager.py | 12 ++--- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 2cb6608a2d8..4db0241ef5a 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -43,9 +43,9 @@ def enforce_policy( # If no permissions are defined, deny access to all resources # This is a security measure to prevent unauthorized access logger.warning("No permissions defined - denying access to all resources") - if not filter_only: - raise FeastPermissionError("No permissions defined - access denied") - return [] + raise FeastPermissionError( + "Permissions are not defined - access denied for all resources" + ) _permitted_resources: list[FeastObject] = [] for resource in resources: @@ -71,17 +71,42 @@ def enforce_policy( if evaluator.is_decided(): grant, explanations = evaluator.grant() - if not grant and not filter_only: + if not grant: + if filter_only and p.name_patterns: + continue logger.error(f"Permission denied: {','.join(explanations)}") raise FeastPermissionError(",".join(explanations)) - if grant: - logger.debug( - f"Permission granted for {type(resource).__name__}:{resource.name}" - ) - _permitted_resources.append(resource) + logger.debug( + f"Permission granted for {type(resource).__name__}:{resource.name}" + ) + _permitted_resources.append(resource) break else: - message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." - logger.exception(f"**PERMISSION NOT GRANTED**: {message}") - raise FeastPermissionError(message) + if not filter_only: + message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." + logger.exception(f"**PERMISSION NOT GRANTED**: {message}") + raise FeastPermissionError(message) + else: + # filter_only=True: Check if there are permissions for this resource type + resource_type_permissions = [ + p + for p in permissions + if any(isinstance(resource, t) for t in p.types) # type: ignore + ] + if not resource_type_permissions: + # No permissions exist for this resource type - should raise error + message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." + logger.exception(f"**PERMISSION NOT GRANTED**: {message}") + raise FeastPermissionError(message) + elif not any(p.name_patterns for p in resource_type_permissions): + # Permissions exist for this resource type but no name_patterns - should raise error + message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." + logger.exception(f"**PERMISSION NOT GRANTED**: {message}") + raise FeastPermissionError(message) + else: + # Permissions exist for this resource type with name_patterns - filter out this resource + logger.debug( + f"Filtering out {type(resource).__name__}:{resource.name} - no matching permissions" + ) + continue return _permitted_resources diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 71a883e1933..e0f75d1d3d8 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -142,6 +142,11 @@ def _test_get_historical_features(client_fs: FeatureStore): def _test_get_entity(client_fs: FeatureStore, permissions: list[Permission]): + if _is_auth_enabled(client_fs) and len(permissions) == 0: + with pytest.raises(FeastPermissionError): + client_fs.get_entity("driver") + return + if not _is_auth_enabled(client_fs) or _is_permission_enabled( client_fs, permissions, read_entities_perm ): @@ -156,6 +161,18 @@ def _test_get_entity(client_fs: FeatureStore, permissions: list[Permission]): def _test_list_entities(client_fs: FeatureStore, permissions: list[Permission]): + if _is_auth_enabled(client_fs) and len(permissions) == 0: + with pytest.raises(FeastPermissionError): + client_fs.list_entities() + return + + if _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( + [invalid_list_entities_perm], permissions + ): + with pytest.raises(FeastPermissionError): + client_fs.list_entities() + return + entities = client_fs.list_entities() if not _is_auth_enabled(client_fs) or _is_permission_enabled( @@ -183,6 +200,10 @@ def _test_list_permissions( with pytest.raises(Exception): client_fs.list_permissions() return [] + elif _is_auth_enabled(client_fs) and len(applied_permissions) == 0: + with pytest.raises(FeastPermissionError): + client_fs.list_permissions() + return [] else: permissions = client_fs.list_permissions() @@ -229,6 +250,11 @@ def _is_auth_enabled(client_fs: FeatureStore) -> bool: def _test_get_fv(client_fs: FeatureStore, permissions: list[Permission]): + if _is_auth_enabled(client_fs) and len(permissions) == 0: + with pytest.raises(FeastPermissionError): + client_fs.get_feature_view("driver_hourly_stats") + return + if not _is_auth_enabled(client_fs) or _is_permission_enabled( client_fs, permissions, read_fv_perm ): @@ -249,6 +275,10 @@ def _test_list_fvs(client_fs: FeatureStore, permissions: list[Permission]): with pytest.raises(Exception): client_fs.list_feature_views() return [] + elif _is_auth_enabled(client_fs) and len(permissions) == 0: + with pytest.raises(FeastPermissionError): + client_fs.list_feature_views() + return [] else: fvs = client_fs.list_feature_views() for fv in fvs: diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index ee0ec9e079a..34d8e4962e9 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -15,7 +15,7 @@ @pytest.mark.parametrize( "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit, intra_communication_flag", [ - (None, [], False, [False, False], [True, True], False, False), + (None, [], False, [False, False], [True, True], True, False), (None, [], True, [True, True], [False, False], False, True), ( "r", @@ -42,7 +42,7 @@ False, [False, False], [True, True], - False, + True, False, ), ("r", [AuthzedAction.UPDATE], True, [True, True], [False, False], False, True), @@ -52,7 +52,7 @@ False, [False, False], [True, True], - False, + True, False, ), ( @@ -116,7 +116,7 @@ False, [False, False], [True, True], - True, + False, False, ), ( @@ -134,7 +134,7 @@ False, [False, True], [True, False], - True, + False, False, ), ( @@ -152,7 +152,7 @@ False, [False, False], [True, True], - True, + False, False, ), ( From 7d9c06f8fd96e4bd6f8f53f2e9ab5f6f0324f5c9 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 08:06:33 -0500 Subject: [PATCH 24/26] docs: Add feature transformation latency blog post (#5852) * Initial plan * Add feature transformation latency blog post and update gitignore Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Add files via upload * Apply suggestion from @franciscojavierarceo * Delete IMAGE_REQUIRED.md --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> Co-authored-by: Francisco Javier Arceo Co-authored-by: Francisco Javier Arceo --- .gitignore | 1 + .../blog/feature-transformation-latency.md | 79 ++++++++++++++++++ infra/website/public/images/blog/latency.png | Bin 0 -> 177998 bytes 3 files changed, 80 insertions(+) create mode 100644 infra/website/docs/blog/feature-transformation-latency.md create mode 100644 infra/website/public/images/blog/latency.png diff --git a/.gitignore b/.gitignore index df688d95c7e..64f5056279f 100644 --- a/.gitignore +++ b/.gitignore @@ -235,6 +235,7 @@ infra/feast-operator/bin # ignore the website build directory infra/website/node_modules/ infra/website/.astro/ +infra/website/dist/ # offline builds offline_build/ diff --git a/infra/website/docs/blog/feature-transformation-latency.md b/infra/website/docs/blog/feature-transformation-latency.md new file mode 100644 index 00000000000..5fdce45f72a --- /dev/null +++ b/infra/website/docs/blog/feature-transformation-latency.md @@ -0,0 +1,79 @@ +--- +title: "Faster On Demand Transformations in Feast 🏎️💨" +description: "Discover how Feast's new Native Python Mode and transformations on writes reduce feature transformation latency by up to 10x, enabling faster and more efficient feature engineering workflows." +date: 2025-01-14 +authors: ["Francisco Javier Arceo", "Shuchu Han"] +--- + +
+ Pandas vs Native Python Latency Decomposition +
+ +# Faster On Demand Transformations in Feast 🏎️💨 + +*Thank you to Shuchu Han and Francisco Javier Arceo for their contributions [evaluating the latency](https://github.com/feast-dev/feast/issues/4207) of transformation for On Demand Feature Views and adding [transformations on writes to On Demand Feature Views](https://github.com/feast-dev/feast/issues/4376). Thank you also to Maks Stachowiak, Ross Briden, Ankit Nadig, and the folks at Affirm for inspiring this work and creating an initial proof of concept.* + +Feature engineering is at the core of building high-performance machine learning models. The Feast team has introduced two major enhancements to [On Demand Feature Views](https://docs.feast.dev/reference/beta-on-demand-feature-view) (ODFVs), pushing the boundaries of efficiency and flexibility for data scientists and engineers. Here's a closer look at these exciting updates: + +## 1. Turbocharging Transformations with Native Python Mode + +Traditionally, transformations in ODFVs were limited to Pandas-based operations. While powerful, Pandas transformations can be computationally expensive for certain use cases. Feast now introduces **Native Python Mode**, a feature that allows users to write transformations using pure Python. + +Key benefits of Native Python Mode include: + +* **Blazing Speed:** Transformations using Native Python are nearly **10x faster** compared to Pandas for many operations. +* **Intuitive Design:** This mode supports list-based and singleton (row-level) transformations, making it easier for data scientists to think in terms of individual rows rather than entire datasets. +* **Versatility:** Users can now switch between batch and singleton transformations effortlessly, catering to both historical and online retrieval scenarios. + +Here's an example of using Native Python Mode for singleton transformations: + +```python +@on_demand_feature_view( + sources=[driver_hourly_stats_view, input_request], + schema=[Field(name="conv_rate_plus_acc_singleton", dtype=Float64)], + mode="python", + singleton=True, +) +def transformed_conv_rate_singleton(inputs: Dict[str, Any]) -> Dict[str, Any]: + return {"conv_rate_plus_acc_singleton": inputs["conv_rate"] + inputs["acc_rate"]} +``` + +This approach aligns with how many data scientists naturally process data, simplifying the implementation of feature engineering workflows. + +## 2. Transformations on Writes: A New Dimension of Latency Optimization + +Until now, ODFVs operated solely as **transformations on reads**, applying logic during online feature retrieval. While this ensured flexibility, it sometimes came at the cost of increased latency during retrieval. Feast now supports **transformations on writes**, enabling users to apply transformations during data ingestion and store the transformed features in the online store. + +Why does this matter? + +* **Reduced Online Latency:** With transformations pre-applied at ingestion, online retrieval becomes a straightforward lookup, significantly improving performance for latency-sensitive applications. +* **Operational Flexibility:** By toggling the `write_to_online_store` parameter, users can choose whether transformations should occur at write time (to optimize reads) or at read time (to preserve data freshness). + +Here's an example of applying transformations during ingestion: + +```python +@on_demand_feature_view( + sources=[driver_hourly_stats_view], + schema=[Field(name="conv_rate_adjusted", dtype=Float64)], + mode="pandas", + write_to_online_store=True, # Apply transformation during write time +) +def transformed_conv_rate(features_df: pd.DataFrame) -> pd.DataFrame: + df = pd.DataFrame() + df["conv_rate_adjusted"] = features_df["conv_rate"] * 1.1 + return df +``` + +With this new capability, data engineers can optimize online retrieval performance without sacrificing the flexibility of on-demand transformations. + +## The Future of ODFVs and Feature Transformations + +These enhancements bring ODFVs closer to the goal of seamless feature engineering at scale. By combining high-speed Python-based transformations with the ability to optimize retrieval latency, Feast empowers teams to build more efficient, responsive, and production-ready feature pipelines. + +For more detailed examples and use cases, check out the [documentation for On Demand Feature Views](https://docs.feast.dev/reference/beta-on-demand-feature-view). Whether you're a data scientist prototyping features or an engineer optimizing a production system, the new ODFV capabilities offer the tools you need to succeed. + +The future of Feature Transformations in Feast will be to unify feature transformations and feature views to allow for a simpler API. If you have thoughts or interest in giving feedback to the maintainers, feel free to comment directly on [the GitHub Issue](https://github.com/feast-dev/feast/issues/4584) or in [the RFC](https://docs.google.com/document/d/1KXCXcsXq1bUvbSpfhnUjDSsu4HpuUZ5XiZoQyltCkvo/edit?tab=t.0#heading=h.g6j9jyjkf5sm). + +Our goal is to make Feast blazing fast for feature transformation and serving. + +**Are you ready to unlock the full potential of On Demand Feature Views? Update your Feast repository and start building today!** diff --git a/infra/website/public/images/blog/latency.png b/infra/website/public/images/blog/latency.png new file mode 100644 index 0000000000000000000000000000000000000000..c0271a3f4fec2a5ade3cb20eb5244f2742d5585f GIT binary patch literal 177998 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 Ef~%^*tpET3 literal 0 HcmV?d00001 From 07b493fa9d99ef50d39b226751ef4c85fc14eb24 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 09:36:56 -0500 Subject: [PATCH 25/26] docs: Add comprehensive type system reference with Map type support (#5855) * Initial plan * docs: Add comprehensive type system documentation with Map support - Add detailed tables for all supported types (primitive, array, map) - Include complete feature view example with all types - Add Map type usage examples with nested structures - Improve documentation structure and clarity Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> --- docs/reference/type-system.md | 142 +++++++++++++++++++++++++++++++++- 1 file changed, 139 insertions(+), 3 deletions(-) diff --git a/docs/reference/type-system.md b/docs/reference/type-system.md index 4a1e93734f3..3bda3ad16c5 100644 --- a/docs/reference/type-system.md +++ b/docs/reference/type-system.md @@ -3,13 +3,149 @@ ## Motivation Feast uses an internal type system to provide guarantees on training and serving data. -Feast currently supports eight primitive types - `INT32`, `INT64`, `FLOAT32`, `FLOAT64`, `STRING`, `BYTES`, `BOOL`, and `UNIX_TIMESTAMP` - and the corresponding array types. -Map type is also supported using a key of `STRING` type and any supported feast type as a value. +Feast supports primitive types, array types, and map types for feature values. Null types are not supported, although the `UNIX_TIMESTAMP` type is nullable. The type system is controlled by [`Value.proto`](https://github.com/feast-dev/feast/blob/master/protos/feast/types/Value.proto) in protobuf and by [`types.py`](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/types.py) in Python. Type conversion logic can be found in [`type_map.py`](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/type_map.py). -## Examples +## Supported Types + +Feast supports the following data types: + +### Primitive Types + +| Feast Type | Python Type | Description | +|------------|-------------|-------------| +| `Int32` | `int` | 32-bit signed integer | +| `Int64` | `int` | 64-bit signed integer | +| `Float32` | `float` | 32-bit floating point | +| `Float64` | `float` | 64-bit floating point | +| `String` | `str` | String/text value | +| `Bytes` | `bytes` | Binary data | +| `Bool` | `bool` | Boolean value | +| `UnixTimestamp` | `datetime` | Unix timestamp (nullable) | + +### Array Types + +All primitive types have corresponding array (list) types: + +| Feast Type | Python Type | Description | +|------------|-------------|-------------| +| `Array(Int32)` | `List[int]` | List of 32-bit integers | +| `Array(Int64)` | `List[int]` | List of 64-bit integers | +| `Array(Float32)` | `List[float]` | List of 32-bit floats | +| `Array(Float64)` | `List[float]` | List of 64-bit floats | +| `Array(String)` | `List[str]` | List of strings | +| `Array(Bytes)` | `List[bytes]` | List of binary data | +| `Array(Bool)` | `List[bool]` | List of booleans | +| `Array(UnixTimestamp)` | `List[datetime]` | List of timestamps | + +### Map Types + +Map types allow storing dictionary-like data structures: + +| Feast Type | Python Type | Description | +|------------|-------------|-------------| +| `Map` | `Dict[str, Any]` | Dictionary with string keys and any supported Feast type as values (including nested maps) | +| `Array(Map)` | `List[Dict[str, Any]]` | List of dictionaries | + +**Note:** Map keys must always be strings. Map values can be any supported Feast type, including primitives, arrays, or nested maps. + +## Complete Feature View Example + +Below is a complete example showing how to define a feature view with all supported types: + +```python +from datetime import timedelta +from feast import Entity, FeatureView, Field, FileSource +from feast.types import ( + Int32, Int64, Float32, Float64, String, Bytes, Bool, UnixTimestamp, + Array, Map +) + +# Define a data source +user_features_source = FileSource( + path="data/user_features.parquet", + timestamp_field="event_timestamp", +) + +# Define an entity +user = Entity( + name="user_id", + description="User identifier", +) + +# Define a feature view with all supported types +user_features = FeatureView( + name="user_features", + entities=[user], + ttl=timedelta(days=1), + schema=[ + # Primitive types + Field(name="age", dtype=Int32), + Field(name="account_balance", dtype=Int64), + Field(name="transaction_amount", dtype=Float32), + Field(name="credit_score", dtype=Float64), + Field(name="username", dtype=String), + Field(name="profile_picture", dtype=Bytes), + Field(name="is_active", dtype=Bool), + Field(name="last_login", dtype=UnixTimestamp), + + # Array types + Field(name="daily_steps", dtype=Array(Int32)), + Field(name="transaction_history", dtype=Array(Int64)), + Field(name="ratings", dtype=Array(Float32)), + Field(name="portfolio_values", dtype=Array(Float64)), + Field(name="favorite_items", dtype=Array(String)), + Field(name="document_hashes", dtype=Array(Bytes)), + Field(name="notification_settings", dtype=Array(Bool)), + Field(name="login_timestamps", dtype=Array(UnixTimestamp)), + + # Map types + Field(name="user_preferences", dtype=Map), + Field(name="metadata", dtype=Map), + Field(name="activity_log", dtype=Array(Map)), + ], + source=user_features_source, +) +``` + +### Map Type Usage Examples + +Maps can store complex nested data structures: + +```python +# Simple map +user_preferences = { + "theme": "dark", + "language": "en", + "notifications_enabled": True, + "font_size": 14 +} + +# Nested map +metadata = { + "profile": { + "bio": "Software engineer", + "location": "San Francisco" + }, + "stats": { + "followers": 1000, + "posts": 250 + } +} + +# List of maps +activity_log = [ + {"action": "login", "timestamp": "2024-01-01T10:00:00", "ip": "192.168.1.1"}, + {"action": "purchase", "timestamp": "2024-01-01T11:30:00", "amount": 99.99}, + {"action": "logout", "timestamp": "2024-01-01T12:00:00"} +] +``` + +## Type System in Practice + +The sections below explain how Feast uses its type system in different contexts. ### Feature inference From d77bf50af3322e326db44574a1cd046df79c7d40 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:41:09 -0500 Subject: [PATCH 26/26] docs: Clarify that feast apply does not delete objects and document feast delete CLI (#5854) * Initial plan * Fix UI server to detect deleted feature views by checking registry file modifications Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Address code review: improve comments and reduce test duplication Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Add defensive null check and improve parameter naming Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Use store.project instead of None for _get_registry_proto call Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Revert UI server changes and add documentation about explicit deletion requirements Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> * Add feast delete CLI command documentation Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: franciscojavierarceo <4163062+franciscojavierarceo@users.noreply.github.com> --- docs/getting-started/components/registry.md | 58 +++++++++++++++++++++ docs/reference/feast-cli-commands.md | 39 ++++++++++++++ sdk/python/feast/feature_store.py | 4 ++ 3 files changed, 101 insertions(+) diff --git a/docs/getting-started/components/registry.md b/docs/getting-started/components/registry.md index 0c85c5ad36b..9723e6cfe63 100644 --- a/docs/getting-started/components/registry.md +++ b/docs/getting-started/components/registry.md @@ -11,6 +11,64 @@ automatically stays synced with the registry. Users will often also want multipl different environments (e.g. dev vs staging vs prod), with staging and production registries with locked down write access since they can impact real user traffic. See [Running Feast in Production](../../how-to-guides/running-feast-in-production.md#1.-automatically-deploying-changes-to-your-feature-definitions) for details on how to set this up. +## Deleting objects from the registry + +{% hint style="warning" %} +Simply removing a feature definition from your code and running `feast apply` or `FeatureStore.apply()` **does not** delete the object from the registry. You must explicitly delete objects using the dedicated delete methods or CLI commands. +{% endhint %} + +### Using the CLI + +The simplest way to delete objects is using the `feast delete` command: + +```bash +# Delete any Feast object by name +feast delete my_feature_view +feast delete my_entity +feast delete my_feature_service +``` + +See the [CLI documentation](../../reference/feast-cli-commands.md#delete) for more details. + +### Using the Python SDK + +To delete objects programmatically, use the explicit delete methods provided by the `FeatureStore` class: + +#### Deleting feature views +```python +from feast import FeatureStore + +store = FeatureStore(repo_path=".") +store.delete_feature_view("my_feature_view") +``` + +#### Deleting feature services +```python +store.delete_feature_service("my_feature_service") +``` + +#### Deleting entities, data sources, and other objects + +For entities, data sources, and other registry objects, you can use the registry methods directly: + +```python +# Delete an entity +store._registry.delete_entity("my_entity", project=store.project) + +# Delete a data source +store._registry.delete_data_source("my_data_source", project=store.project) + +# Delete a saved dataset +store._registry.delete_saved_dataset("my_saved_dataset", project=store.project) + +# Delete a validation reference +store._registry.delete_validation_reference("my_validation_reference", project=store.project) +``` + +{% hint style="info" %} +When using `feast apply` via the CLI, you can also use the `objects_to_delete` parameter with `partial=False` to delete objects as part of the apply operation. However, this is less common and typically used in automated deployment scenarios. +{% endhint %} + ## Accessing the registry from clients Users can specify the registry through a `feature_store.yaml` config file, or programmatically. We often see teams diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 15157863e9c..55d3c27ac84 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -20,6 +20,7 @@ Options: Commands: apply Create or update a feature store deployment configuration Display Feast configuration + delete Delete a Feast object from the registry entities Access entities feature-views Access feature views init Create a new Feast repository @@ -62,6 +63,10 @@ feast apply `feast apply` \(when configured to use cloud provider like `gcp` or `aws`\) will create cloud infrastructure. This may incur costs. {% endhint %} +{% hint style="info" %} +**Important:** `feast apply` only registers or updates objects found in your Python files. It does **not** delete objects that you've removed from your code. To delete objects from the registry, you must use the `feast delete` command or explicit delete methods in the Python SDK. See the [Delete command](#delete) below and the [Registry documentation](../getting-started/components/registry.md#deleting-objects-from-the-registry) for details. +{% endhint %} + ## Configuration Display the actual configuration being used by Feast, including both user-provided configurations and default configurations applied by Feast. @@ -84,6 +89,40 @@ auth: type: no_auth ``` +## Delete + +Delete a Feast object from the registry by its name. + +```bash +feast delete +``` + +**What does feast delete do?** + +The `feast delete` command removes a Feast object (such as a feature view, entity, data source, feature service, etc.) from the registry. The command will: + +1. Search for the object by name across all object types (entities, feature views, feature services, data sources, saved datasets, validation references, etc.) +2. Delete the first matching object found +3. Remove any associated infrastructure + +**Example:** + +```bash +# Delete a feature view named "driver_hourly_stats" +feast delete driver_hourly_stats + +# Delete an entity named "driver" +feast delete driver +``` + +{% hint style="warning" %} +The delete operation is permanent and will remove the object from the registry. Make sure you want to delete the object before running this command. +{% endhint %} + +{% hint style="info" %} +If multiple objects have the same name across different types, `feast delete` will delete the first one it finds. For programmatic deletion with more control, use the Python SDK methods like `store.delete_feature_view()`, `store.delete_feature_service()`, etc. +{% endhint %} + ## Entities List all registered entities diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index fce051f950d..5118cd4fde2 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -843,6 +843,10 @@ def apply( an online store), it will commit the updated registry. All operations are idempotent, meaning they can safely be rerun. + Note: The apply method does NOT delete objects that are removed from the provided list. To delete objects + from the registry, use explicit delete methods like delete_feature_view(), delete_feature_service(), or + pass objects to the objects_to_delete parameter with partial=False. + Args: objects: A single object, or a list of objects that should be registered with the Feature Store. objects_to_delete: A list of objects to be deleted from the registry and removed from the