diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index 4dbb220c1ef..11ce9ebc626 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -1,11 +1,13 @@ import importlib import json import logging -from typing import Any, List, Optional, Set +from typing import TYPE_CHECKING, Any, List, Optional, Set from colorama import Fore, Style from fastapi import status as HttpStatusCode -from grpc import StatusCode as GrpcStatusCode + +if TYPE_CHECKING: + from grpc import StatusCode as GrpcStatusCode from feast.field import Field @@ -15,7 +17,9 @@ class FeastError(Exception): pass - def grpc_status_code(self) -> GrpcStatusCode: + def grpc_status_code(self) -> "GrpcStatusCode": + from grpc import StatusCode as GrpcStatusCode + return GrpcStatusCode.INTERNAL def http_status_code(self) -> int: @@ -89,7 +93,9 @@ def __init__(self, ds_name: str): class FeastObjectNotFoundException(FeastError): pass - def grpc_status_code(self) -> GrpcStatusCode: + def grpc_status_code(self) -> "GrpcStatusCode": + from grpc import StatusCode as GrpcStatusCode + return GrpcStatusCode.NOT_FOUND def http_status_code(self) -> int: @@ -504,7 +510,9 @@ class FeastPermissionError(FeastError, PermissionError): def __init__(self, details: str): super().__init__(f"Permission error:\n{details}") - def grpc_status_code(self) -> GrpcStatusCode: + def grpc_status_code(self) -> "GrpcStatusCode": + from grpc import StatusCode as GrpcStatusCode + return GrpcStatusCode.PERMISSION_DENIED def http_status_code(self) -> int: diff --git a/sdk/python/feast/infra/offline_stores/bigquery.py b/sdk/python/feast/infra/offline_stores/bigquery.py index ef12eba442b..3ee17174619 100644 --- a/sdk/python/feast/infra/offline_stores/bigquery.py +++ b/sdk/python/feast/infra/offline_stores/bigquery.py @@ -114,7 +114,7 @@ class BigQueryOfflineStoreConfig(FeastConfigBaseModel): @field_validator("billing_project_id") def project_id_exists(cls, v, values, **kwargs): - if v and not values["project_id"]: + if v and not values.data["project_id"]: raise ValueError( "please specify project_id if billing_project_id is specified" ) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index f9dd37e516f..e68d9d64b5e 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -1303,6 +1303,7 @@ def delete_project( "DATA_SOURCES", "ENTITIES", "PERMISSIONS", + "FEAST_METADATA", "PROJECTS", }: query = f""" diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index a6a2417c6e7..6ae27acf4e4 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -1237,6 +1237,7 @@ def delete_project( data_sources, entities, permissions, + feast_metadata, projects, }: stmt = delete(t).where(t.c.project_id == name) diff --git a/sdk/python/feast/ui/yarn.lock b/sdk/python/feast/ui/yarn.lock index 452b6f9f31b..d9e9ce03c88 100644 --- a/sdk/python/feast/ui/yarn.lock +++ b/sdk/python/feast/ui/yarn.lock @@ -3545,10 +3545,10 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -3558,7 +3558,7 @@ body-parser@1.20.2: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" + qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3593,7 +3593,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -3675,6 +3675,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -4632,6 +4643,15 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -4912,6 +4932,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" @@ -4968,6 +4993,18 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-module-lexer@^1.2.1: version "1.5.4" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" @@ -5330,36 +5367,36 @@ expect@^27.5.1: jest-message-util "^27.5.1" express@^4.17.3: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.2" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.10" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -5471,13 +5508,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -5645,6 +5682,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -5684,6 +5726,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -5790,6 +5843,13 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -5839,6 +5899,18 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -5858,6 +5930,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hast-to-hyperscript@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" @@ -7415,10 +7494,10 @@ memfs@^3.4.3: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -7436,11 +7515,11 @@ methods@~1.1.2: integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" microseconds@0.2.0: @@ -7671,6 +7750,11 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -7958,10 +8042,10 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== path-type@^4.0.0: version "4.0.0" @@ -8682,12 +8766,12 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" query-string@^7.1.1: version "7.1.1" @@ -9533,10 +9617,10 @@ semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -9591,15 +9675,27 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" setprototypeof@1.1.0: version "1.1.0" @@ -9642,6 +9738,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" diff --git a/sdk/python/feast/utils.py b/sdk/python/feast/utils.py index a6d7853e1b8..2ab73ae0892 100644 --- a/sdk/python/feast/utils.py +++ b/sdk/python/feast/utils.py @@ -49,6 +49,7 @@ if typing.TYPE_CHECKING: from feast.feature_service import FeatureService from feast.feature_view import FeatureView + from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView APPLICATION_NAME = "feast-dev/feast" @@ -756,61 +757,64 @@ def _list_feature_views( def _get_feature_views_to_use( - registry, + registry: "BaseRegistry", project, features: Optional[Union[List[str], "FeatureService"]], allow_cache=False, hide_dummy_entity: bool = True, ) -> Tuple[List["FeatureView"], List["OnDemandFeatureView"]]: from feast.feature_service import FeatureService - - fvs = { - fv.name: fv - for fv in [ - *_list_feature_views(registry, project, allow_cache, hide_dummy_entity), - *registry.list_stream_feature_views( - project=project, allow_cache=allow_cache - ), - ] - } - - od_fvs = { - fv.name: fv - for fv in registry.list_on_demand_feature_views( - project=project, allow_cache=allow_cache - ) - } + from feast.feature_view import DUMMY_ENTITY_NAME + from feast.on_demand_feature_view import OnDemandFeatureView if isinstance(features, FeatureService): - fvs_to_use, od_fvs_to_use = [], [] - for fv_name, projection in [ + feature_views = [ (projection.name, projection) for projection in features.feature_view_projections - ]: - if fv_name in fvs: - fvs_to_use.append(fvs[fv_name].with_projection(copy.copy(projection))) - elif fv_name in od_fvs: - odfv = od_fvs[fv_name].with_projection(copy.copy(projection)) - od_fvs_to_use.append(odfv) - # Let's make sure to include an FVs which the ODFV requires Features from. - for projection in odfv.source_feature_view_projections.values(): - fv = fvs[projection.name].with_projection(copy.copy(projection)) - if fv not in fvs_to_use: - fvs_to_use.append(fv) - else: - raise ValueError( - f"The provided feature service {features.name} contains a reference to a feature view" - f"{fv_name} which doesn't exist. Please make sure that you have created the feature view" - f'{fv_name} and that you have registered it by running "apply".' - ) - views_to_use = (fvs_to_use, od_fvs_to_use) + ] else: - views_to_use = ( - [*fvs.values()], - [*od_fvs.values()], - ) + assert features is not None + feature_views = [(feature.split(":")[0], None) for feature in features] # type: ignore[misc] + + fvs_to_use, od_fvs_to_use = [], [] + for name, projection in feature_views: + fv = registry.get_any_feature_view(name, project, allow_cache) + + if isinstance(fv, OnDemandFeatureView): + od_fvs_to_use.append( + fv.with_projection(copy.copy(projection)) if projection else fv + ) + + for source_projection in fv.source_feature_view_projections.values(): + source_fv = registry.get_any_feature_view( + source_projection.name, project, allow_cache + ) + # TODO better way to handler dummy entities + if ( + hide_dummy_entity + and source_fv.entities # type: ignore[attr-defined] + and source_fv.entities[0] == DUMMY_ENTITY_NAME # type: ignore[attr-defined] + ): + source_fv.entities = [] # type: ignore[attr-defined] + source_fv.entity_columns = [] # type: ignore[attr-defined] + + if source_fv not in fvs_to_use: + fvs_to_use.append( + source_fv.with_projection(copy.copy(source_projection)) + ) + else: + if ( + hide_dummy_entity + and fv.entities # type: ignore[attr-defined] + and fv.entities[0] == DUMMY_ENTITY_NAME # type: ignore[attr-defined] + ): + fv.entities = [] # type: ignore[attr-defined] + fv.entity_columns = [] # type: ignore[attr-defined] + fvs_to_use.append( + fv.with_projection(copy.copy(projection)) if projection else fv + ) - return views_to_use + return (fvs_to_use, od_fvs_to_use) def _get_online_request_context( diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 59e799ebab6..6268de6ae13 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -1,7 +1,6 @@ # This file was autogenerated by uv via the following command: # uv pip compile -p 3.10 --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.10-ci-requirements.txt -aiobotocore==2.15.0 - # via feast (setup.py) +aiobotocore==2.15.1 aiohappyeyeballs==2.4.0 # via aiohttp aiohttp==3.10.5 @@ -22,8 +21,6 @@ anyio==4.5.0 # jupyter-server # starlette # watchfiles -appnope==0.1.4 - # via ipykernel argon2-cffi==23.1.0 # via jupyter-server argon2-cffi-bindings==21.2.0 @@ -33,7 +30,6 @@ arrow==1.3.0 asn1crypto==1.5.1 # via snowflake-connector-python assertpy==1.1 - # via feast (setup.py) asttokens==2.4.1 # via stack-data async-lru==2.0.4 @@ -55,10 +51,8 @@ azure-core==1.31.0 # via # azure-identity # azure-storage-blob -azure-identity==1.17.1 - # via feast (setup.py) +azure-identity==1.18.0 azure-storage-blob==12.23.0 - # via feast (setup.py) babel==2.16.0 # via # jupyterlab-server @@ -66,14 +60,11 @@ babel==2.16.0 beautifulsoup4==4.12.3 # via nbconvert bigtree==0.21.1 - # via feast (setup.py) bleach==6.1.0 # via nbconvert -boto3==1.35.16 - # via - # feast (setup.py) - # moto -botocore==1.35.16 +boto3==1.35.23 + # via moto +botocore==1.35.23 # via # aiobotocore # boto3 @@ -81,13 +72,11 @@ botocore==1.35.16 # s3transfer build==1.2.2 # via - # feast (setup.py) # pip-tools # singlestoredb cachetools==5.5.0 # via google-auth cassandra-driver==3.29.2 - # via feast (setup.py) certifi==2024.8.30 # via # elastic-transport @@ -110,7 +99,6 @@ charset-normalizer==3.3.2 # snowflake-connector-python click==8.1.7 # via - # feast (setup.py) # dask # geomet # great-expectations @@ -119,18 +107,15 @@ click==8.1.7 cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via - # feast (setup.py) - # great-expectations + # via great-expectations comm==0.2.2 # via # ipykernel # ipywidgets coverage[toml]==7.6.1 # via pytest-cov -cryptography==42.0.8 +cryptography==43.0.1 # via - # feast (setup.py) # azure-identity # azure-storage-blob # great-expectations @@ -145,9 +130,7 @@ cryptography==42.0.8 cython==3.0.11 # via thriftpy2 dask[dataframe]==2024.9.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.14 # via dask db-dtypes==1.3.0 @@ -159,11 +142,9 @@ decorator==5.1.1 defusedxml==0.7.1 # via nbconvert deltalake==0.20.0 - # via feast (setup.py) deprecation==2.1.0 # via python-keycloak dill==0.3.8 - # via feast (setup.py) distlib==0.3.8 # via virtualenv docker==7.1.0 @@ -175,7 +156,6 @@ duckdb==1.1.0 elastic-transport==8.15.0 # via elasticsearch elasticsearch==8.15.1 - # via feast (setup.py) entrypoints==0.4 # via altair exceptiongroup==1.2.2 @@ -188,7 +168,6 @@ execnet==2.1.1 executing==2.1.0 # via stack-data fastapi==0.115.0 - # via feast (setup.py) fastjsonschema==2.20.0 # via nbformat filelock==3.16.1 @@ -202,21 +181,18 @@ frozenlist==1.4.1 # aiohttp # aiosignal fsspec==2024.9.0 - # via - # feast (setup.py) - # dask + # via dask geomet==0.2.1.post1 # via cassandra-driver -google-api-core[grpc]==2.19.2 +google-api-core[grpc]==2.20.0 # via - # feast (setup.py) # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-bigtable # google-cloud-core # google-cloud-datastore # google-cloud-storage -google-auth==2.34.0 +google-auth==2.35.0 # via # google-api-core # google-cloud-bigquery @@ -227,11 +203,8 @@ google-auth==2.34.0 # google-cloud-storage # kubernetes google-cloud-bigquery[pandas]==3.25.0 - # via feast (setup.py) google-cloud-bigquery-storage==2.26.0 - # via feast (setup.py) google-cloud-bigtable==2.26.0 - # via feast (setup.py) google-cloud-core==2.4.1 # via # google-cloud-bigquery @@ -239,9 +212,7 @@ google-cloud-core==2.4.1 # google-cloud-datastore # google-cloud-storage google-cloud-datastore==2.20.1 - # via feast (setup.py) google-cloud-storage==2.18.2 - # via feast (setup.py) google-crc32c==1.6.0 # via # google-cloud-storage @@ -252,17 +223,16 @@ google-resumable-media==2.7.2 # google-cloud-storage googleapis-common-protos[grpc]==1.65.0 # via - # feast (setup.py) # google-api-core # grpc-google-iam-v1 # grpcio-status great-expectations==0.18.21 - # via feast (setup.py) +greenlet==3.1.0 + # via sqlalchemy grpc-google-iam-v1==0.13.1 # via google-cloud-bigtable grpcio==1.66.1 # via - # feast (setup.py) # google-api-core # googleapis-common-protos # grpc-google-iam-v1 @@ -272,42 +242,30 @@ grpcio==1.66.1 # grpcio-testing # grpcio-tools grpcio-health-checking==1.62.3 - # via feast (setup.py) grpcio-reflection==1.62.3 - # via feast (setup.py) grpcio-status==1.62.3 # via google-api-core grpcio-testing==1.62.3 - # via feast (setup.py) grpcio-tools==1.62.3 - # via feast (setup.py) gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via # httpcore # uvicorn happybase==1.2.0 - # via feast (setup.py) hazelcast-python-client==5.5.0 - # via feast (setup.py) hiredis==2.4.0 - # via feast (setup.py) httpcore==1.0.5 # via httpx httptools==0.6.1 # via uvicorn httpx==0.27.2 # via - # feast (setup.py) # jupyterlab # python-keycloak ibis-framework[duckdb]==9.5.0 - # via - # feast (setup.py) - # ibis-substrait + # via ibis-substrait ibis-substrait==4.0.1 - # via feast (setup.py) identify==2.6.1 # via pre-commit idna==3.10 @@ -343,7 +301,6 @@ jedi==0.19.1 # via ipython jinja2==3.1.4 # via - # feast (setup.py) # altair # great-expectations # jupyter-server @@ -366,7 +323,6 @@ jsonpointer==3.0.0 # jsonschema jsonschema[format-nongpl]==4.23.0 # via - # feast (setup.py) # altair # great-expectations # jupyter-events @@ -414,7 +370,6 @@ jupyterlab-widgets==3.0.13 jwcrypto==1.5.6 # via python-keycloak kubernetes==20.13.0 - # via feast (setup.py) locket==1.0.0 # via partd makefun==1.15.4 @@ -435,17 +390,13 @@ matplotlib-inline==0.1.7 mdurl==0.1.2 # via markdown-it-py minio==7.1.0 - # via feast (setup.py) mistune==3.0.2 # via # great-expectations # nbconvert mmh3==5.0.0 - # via feast (setup.py) mock==2.0.0 - # via feast (setup.py) moto==4.2.14 - # via feast (setup.py) msal==1.31.0 # via # azure-identity @@ -457,13 +408,10 @@ multidict==6.1.0 # aiohttp # yarl mypy==1.11.2 - # via - # feast (setup.py) - # sqlalchemy + # via sqlalchemy mypy-extensions==1.0.0 # via mypy mypy-protobuf==3.3.0 - # via feast (setup.py) nbclient==0.10.0 # via nbconvert nbconvert==7.16.4 @@ -486,7 +434,6 @@ notebook-shim==0.2.4 # notebook numpy==1.26.4 # via - # feast (setup.py) # altair # dask # db-dtypes @@ -521,7 +468,6 @@ packaging==24.1 # sphinx pandas==2.2.2 # via - # feast (setup.py) # altair # dask # dask-expr @@ -547,7 +493,6 @@ pexpect==4.9.0 pip==24.2 # via pip-tools pip-tools==7.4.1 - # via feast (setup.py) platformdirs==3.11.0 # via # jupyter-core @@ -560,11 +505,8 @@ ply==3.11 portalocker==2.10.1 # via msal-extensions pre-commit==3.3.1 - # via feast (setup.py) prometheus-client==0.20.0 - # via - # feast (setup.py) - # jupyter-server + # via jupyter-server prompt-toolkit==3.0.47 # via ipython proto-plus==1.24.0 @@ -575,7 +517,6 @@ proto-plus==1.24.0 # google-cloud-datastore protobuf==4.25.5 # via - # feast (setup.py) # google-api-core # google-cloud-bigquery-storage # google-cloud-bigtable @@ -591,11 +532,8 @@ protobuf==4.25.5 # proto-plus # substrait psutil==5.9.0 - # via - # feast (setup.py) - # ipykernel + # via ipykernel psycopg[binary, pool]==3.2.2 - # via feast (setup.py) psycopg-binary==3.2.2 # via psycopg psycopg-pool==3.2.3 @@ -607,14 +545,12 @@ ptyprocess==0.7.0 pure-eval==0.2.3 # via stack-data py==1.11.0 - # via feast (setup.py) py-cpuinfo==9.0.0 # via pytest-benchmark py4j==0.10.9.7 # via pyspark pyarrow==17.0.0 # via - # feast (setup.py) # dask-expr # db-dtypes # deltalake @@ -630,35 +566,28 @@ pyasn1==0.6.1 pyasn1-modules==0.4.1 # via google-auth pybindgen==0.22.1 - # via feast (setup.py) pycparser==2.22 # via cffi pydantic==2.9.2 # via - # feast (setup.py) # fastapi # great-expectations pydantic-core==2.23.4 # via pydantic pygments==2.18.0 # via - # feast (setup.py) # ipython # nbconvert # rich # sphinx pyjwt[crypto]==2.9.0 # via - # feast (setup.py) # msal # singlestoredb # snowflake-connector-python pymssql==2.3.1 - # via feast (setup.py) pymysql==1.1.1 - # via feast (setup.py) pyodbc==5.1.0 - # via feast (setup.py) pyopenssl==24.2.1 # via snowflake-connector-python pyparsing==3.1.4 @@ -668,10 +597,8 @@ pyproject-hooks==1.1.0 # build # pip-tools pyspark==3.5.2 - # via feast (setup.py) pytest==7.4.4 # via - # feast (setup.py) # pytest-benchmark # pytest-cov # pytest-env @@ -681,21 +608,13 @@ pytest==7.4.4 # pytest-timeout # pytest-xdist pytest-benchmark==3.4.1 - # via feast (setup.py) pytest-cov==5.0.0 - # via feast (setup.py) pytest-env==1.1.3 - # via feast (setup.py) pytest-lazy-fixture==0.6.3 - # via feast (setup.py) pytest-mock==1.10.4 - # via feast (setup.py) pytest-ordering==0.6 - # via feast (setup.py) pytest-timeout==1.4.2 - # via feast (setup.py) pytest-xdist==3.6.1 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via # arrow @@ -713,7 +632,6 @@ python-dotenv==1.0.1 python-json-logger==2.0.7 # via jupyter-events python-keycloak==4.2.2 - # via feast (setup.py) pytz==2024.2 # via # great-expectations @@ -723,7 +641,6 @@ pytz==2024.2 # trino pyyaml==6.0.2 # via - # feast (setup.py) # dask # ibis-substrait # jupyter-events @@ -737,19 +654,15 @@ pyzmq==26.2.0 # jupyter-client # jupyter-server redis==4.6.0 - # via feast (setup.py) referencing==0.35.1 # via # jsonschema # jsonschema-specifications # jupyter-events regex==2024.9.11 - # via - # feast (setup.py) - # parsimonious + # via parsimonious requests==2.32.3 # via - # feast (setup.py) # azure-core # docker # google-api-core @@ -794,8 +707,7 @@ ruamel-yaml==0.17.40 # via great-expectations ruamel-yaml-clib==0.2.8 # via ruamel-yaml -ruff==0.6.5 - # via feast (setup.py) +ruff==0.6.6 s3transfer==0.10.2 # via boto3 scipy==1.14.1 @@ -810,7 +722,6 @@ setuptools==75.1.0 # pip-tools # singlestoredb singlestoredb==1.6.3 - # via feast (setup.py) six==1.16.0 # via # asttokens @@ -831,13 +742,11 @@ sniffio==1.3.1 snowballstemmer==2.2.0 # via sphinx snowflake-connector-python[pandas]==3.12.2 - # via feast (setup.py) sortedcontainers==2.4.0 # via snowflake-connector-python soupsieve==2.6 # via beautifulsoup4 sphinx==6.2.1 - # via feast (setup.py) sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 @@ -851,11 +760,9 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 # via sphinx sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) sqlglot==25.20.1 # via ibis-framework sqlite-vec==0.1.1 - # via feast (setup.py) sqlparams==6.1.0 # via singlestoredb stack-data==0.6.3 @@ -865,21 +772,17 @@ starlette==0.38.5 substrait==0.23.0 # via ibis-substrait tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals testcontainers==4.4.0 - # via feast (setup.py) thriftpy2==0.5.2 # via happybase tinycss2==1.3.0 # via nbconvert toml==0.10.2 - # via feast (setup.py) tomli==2.0.1 # via # build @@ -907,9 +810,7 @@ tornado==6.4.1 # notebook # terminado tqdm==4.66.5 - # via - # feast (setup.py) - # great-expectations + # via great-expectations traitlets==5.14.3 # via # comm @@ -926,37 +827,23 @@ traitlets==5.14.3 # nbconvert # nbformat trino==0.329.0 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) types-cffi==1.16.0.20240331 # via types-pyopenssl types-protobuf==3.19.22 - # via - # feast (setup.py) - # mypy-protobuf + # via mypy-protobuf types-pymysql==1.1.0.20240524 - # via feast (setup.py) types-pyopenssl==24.1.0.20240722 # via types-redis types-python-dateutil==2.9.0.20240906 - # via - # feast (setup.py) - # arrow + # via arrow types-pytz==2024.2.0.20240913 - # via feast (setup.py) types-pyyaml==6.0.12.20240917 - # via feast (setup.py) types-redis==4.6.0.20240903 - # via feast (setup.py) types-requests==2.30.0.0 - # via feast (setup.py) types-setuptools==75.1.0.20240917 - # via - # feast (setup.py) - # types-cffi + # via types-cffi types-tabulate==0.9.0.20240106 - # via feast (setup.py) types-urllib3==1.26.25.14 # via types-requests typing-extensions==4.12.2 @@ -992,7 +879,6 @@ uri-template==1.3.0 # via jsonschema urllib3==2.2.3 # via - # feast (setup.py) # botocore # docker # elastic-transport @@ -1003,13 +889,10 @@ urllib3==2.2.3 # responses # testcontainers uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn virtualenv==20.23.0 - # via - # feast (setup.py) - # pre-commit + # via pre-commit watchfiles==0.24.0 # via uvicorn wcwidth==0.2.13 diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt index 26eeca3529a..9e5eb0be728 100644 --- a/sdk/python/requirements/py3.10-requirements.txt +++ b/sdk/python/requirements/py3.10-requirements.txt @@ -11,36 +11,30 @@ attrs==24.2.0 # jsonschema # referencing bigtree==0.21.1 - # via feast (setup.py) certifi==2024.8.30 # via requests charset-normalizer==3.3.2 # via requests click==8.1.7 # via - # feast (setup.py) # dask # uvicorn cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via feast (setup.py) dask[dataframe]==2024.9.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.14 # via dask dill==0.3.8 - # via feast (setup.py) exceptiongroup==1.2.2 # via anyio fastapi==0.115.0 - # via feast (setup.py) fsspec==2024.9.0 # via dask +greenlet==3.1.0 + # via sqlalchemy gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via uvicorn httptools==0.6.1 @@ -52,9 +46,7 @@ idna==3.10 importlib-metadata==8.5.0 # via dask jinja2==3.1.4 - # via feast (setup.py) jsonschema==4.23.0 - # via feast (setup.py) jsonschema-specifications==2023.12.1 # via jsonschema locket==1.0.0 @@ -62,14 +54,12 @@ locket==1.0.0 markupsafe==2.1.5 # via jinja2 mmh3==5.0.0 - # via feast (setup.py) mypy==1.11.2 # via sqlalchemy mypy-extensions==1.0.0 # via mypy numpy==1.26.4 # via - # feast (setup.py) # dask # pandas # pyarrow @@ -79,31 +69,21 @@ packaging==24.1 # gunicorn pandas==2.2.2 # via - # feast (setup.py) # dask # dask-expr partd==1.4.2 # via dask prometheus-client==0.20.0 - # via feast (setup.py) protobuf==4.25.5 - # via feast (setup.py) psutil==6.0.0 - # via feast (setup.py) pyarrow==17.0.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr pydantic==2.9.2 - # via - # feast (setup.py) - # fastapi + # via fastapi pydantic-core==2.23.4 # via pydantic pygments==2.18.0 - # via feast (setup.py) pyjwt==2.9.0 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via pandas python-dotenv==1.0.1 @@ -112,7 +92,6 @@ pytz==2024.2 # via pandas pyyaml==6.0.2 # via - # feast (setup.py) # dask # uvicorn referencing==0.35.1 @@ -120,7 +99,6 @@ referencing==0.35.1 # jsonschema # jsonschema-specifications requests==2.32.3 - # via feast (setup.py) rpds-py==0.20.0 # via # jsonschema @@ -130,15 +108,11 @@ six==1.16.0 sniffio==1.3.1 # via anyio sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) starlette==0.38.5 # via fastapi tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) toml==0.10.2 - # via feast (setup.py) tomli==2.0.1 # via mypy toolz==0.12.1 @@ -146,9 +120,7 @@ toolz==0.12.1 # dask # partd tqdm==4.66.5 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) typing-extensions==4.12.2 # via # anyio @@ -164,7 +136,6 @@ tzdata==2024.1 urllib3==2.2.3 # via requests uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn watchfiles==0.24.0 diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index 9f57ecd8411..946d4e05195 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -1,7 +1,6 @@ # This file was autogenerated by uv via the following command: # uv pip compile -p 3.11 --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.11-ci-requirements.txt -aiobotocore==2.15.0 - # via feast (setup.py) +aiobotocore==2.15.1 aiohappyeyeballs==2.4.0 # via aiohttp aiohttp==3.10.5 @@ -22,8 +21,6 @@ anyio==4.5.0 # jupyter-server # starlette # watchfiles -appnope==0.1.4 - # via ipykernel argon2-cffi==23.1.0 # via jupyter-server argon2-cffi-bindings==21.2.0 @@ -33,7 +30,6 @@ arrow==1.3.0 asn1crypto==1.5.1 # via snowflake-connector-python assertpy==1.1 - # via feast (setup.py) asttokens==2.4.1 # via stack-data async-lru==2.0.4 @@ -53,10 +49,8 @@ azure-core==1.31.0 # via # azure-identity # azure-storage-blob -azure-identity==1.17.1 - # via feast (setup.py) +azure-identity==1.18.0 azure-storage-blob==12.23.0 - # via feast (setup.py) babel==2.16.0 # via # jupyterlab-server @@ -64,14 +58,11 @@ babel==2.16.0 beautifulsoup4==4.12.3 # via nbconvert bigtree==0.21.1 - # via feast (setup.py) bleach==6.1.0 # via nbconvert -boto3==1.35.16 - # via - # feast (setup.py) - # moto -botocore==1.35.16 +boto3==1.35.23 + # via moto +botocore==1.35.23 # via # aiobotocore # boto3 @@ -79,13 +70,11 @@ botocore==1.35.16 # s3transfer build==1.2.2 # via - # feast (setup.py) # pip-tools # singlestoredb cachetools==5.5.0 # via google-auth cassandra-driver==3.29.2 - # via feast (setup.py) certifi==2024.8.30 # via # elastic-transport @@ -108,7 +97,6 @@ charset-normalizer==3.3.2 # snowflake-connector-python click==8.1.7 # via - # feast (setup.py) # dask # geomet # great-expectations @@ -117,18 +105,15 @@ click==8.1.7 cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via - # feast (setup.py) - # great-expectations + # via great-expectations comm==0.2.2 # via # ipykernel # ipywidgets coverage[toml]==7.6.1 # via pytest-cov -cryptography==42.0.8 +cryptography==43.0.1 # via - # feast (setup.py) # azure-identity # azure-storage-blob # great-expectations @@ -143,9 +128,7 @@ cryptography==42.0.8 cython==3.0.11 # via thriftpy2 dask[dataframe]==2024.9.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.14 # via dask db-dtypes==1.3.0 @@ -157,11 +140,9 @@ decorator==5.1.1 defusedxml==0.7.1 # via nbconvert deltalake==0.20.0 - # via feast (setup.py) deprecation==2.1.0 # via python-keycloak dill==0.3.8 - # via feast (setup.py) distlib==0.3.8 # via virtualenv docker==7.1.0 @@ -173,7 +154,6 @@ duckdb==1.1.0 elastic-transport==8.15.0 # via elasticsearch elasticsearch==8.15.1 - # via feast (setup.py) entrypoints==0.4 # via altair execnet==2.1.1 @@ -181,7 +161,6 @@ execnet==2.1.1 executing==2.1.0 # via stack-data fastapi==0.115.0 - # via feast (setup.py) fastjsonschema==2.20.0 # via nbformat filelock==3.16.1 @@ -195,21 +174,18 @@ frozenlist==1.4.1 # aiohttp # aiosignal fsspec==2024.9.0 - # via - # feast (setup.py) - # dask + # via dask geomet==0.2.1.post1 # via cassandra-driver -google-api-core[grpc]==2.19.2 +google-api-core[grpc]==2.20.0 # via - # feast (setup.py) # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-bigtable # google-cloud-core # google-cloud-datastore # google-cloud-storage -google-auth==2.34.0 +google-auth==2.35.0 # via # google-api-core # google-cloud-bigquery @@ -220,11 +196,8 @@ google-auth==2.34.0 # google-cloud-storage # kubernetes google-cloud-bigquery[pandas]==3.25.0 - # via feast (setup.py) google-cloud-bigquery-storage==2.26.0 - # via feast (setup.py) google-cloud-bigtable==2.26.0 - # via feast (setup.py) google-cloud-core==2.4.1 # via # google-cloud-bigquery @@ -232,9 +205,7 @@ google-cloud-core==2.4.1 # google-cloud-datastore # google-cloud-storage google-cloud-datastore==2.20.1 - # via feast (setup.py) google-cloud-storage==2.18.2 - # via feast (setup.py) google-crc32c==1.6.0 # via # google-cloud-storage @@ -245,17 +216,16 @@ google-resumable-media==2.7.2 # google-cloud-storage googleapis-common-protos[grpc]==1.65.0 # via - # feast (setup.py) # google-api-core # grpc-google-iam-v1 # grpcio-status great-expectations==0.18.21 - # via feast (setup.py) +greenlet==3.1.0 + # via sqlalchemy grpc-google-iam-v1==0.13.1 # via google-cloud-bigtable grpcio==1.66.1 # via - # feast (setup.py) # google-api-core # googleapis-common-protos # grpc-google-iam-v1 @@ -265,42 +235,30 @@ grpcio==1.66.1 # grpcio-testing # grpcio-tools grpcio-health-checking==1.62.3 - # via feast (setup.py) grpcio-reflection==1.62.3 - # via feast (setup.py) grpcio-status==1.62.3 # via google-api-core grpcio-testing==1.62.3 - # via feast (setup.py) grpcio-tools==1.62.3 - # via feast (setup.py) gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via # httpcore # uvicorn happybase==1.2.0 - # via feast (setup.py) hazelcast-python-client==5.5.0 - # via feast (setup.py) hiredis==2.4.0 - # via feast (setup.py) httpcore==1.0.5 # via httpx httptools==0.6.1 # via uvicorn httpx==0.27.2 # via - # feast (setup.py) # jupyterlab # python-keycloak ibis-framework[duckdb]==9.5.0 - # via - # feast (setup.py) - # ibis-substrait + # via ibis-substrait ibis-substrait==4.0.1 - # via feast (setup.py) identify==2.6.1 # via pre-commit idna==3.10 @@ -334,7 +292,6 @@ jedi==0.19.1 # via ipython jinja2==3.1.4 # via - # feast (setup.py) # altair # great-expectations # jupyter-server @@ -357,7 +314,6 @@ jsonpointer==3.0.0 # jsonschema jsonschema[format-nongpl]==4.23.0 # via - # feast (setup.py) # altair # great-expectations # jupyter-events @@ -405,7 +361,6 @@ jupyterlab-widgets==3.0.13 jwcrypto==1.5.6 # via python-keycloak kubernetes==20.13.0 - # via feast (setup.py) locket==1.0.0 # via partd makefun==1.15.4 @@ -426,17 +381,13 @@ matplotlib-inline==0.1.7 mdurl==0.1.2 # via markdown-it-py minio==7.1.0 - # via feast (setup.py) mistune==3.0.2 # via # great-expectations # nbconvert mmh3==5.0.0 - # via feast (setup.py) mock==2.0.0 - # via feast (setup.py) moto==4.2.14 - # via feast (setup.py) msal==1.31.0 # via # azure-identity @@ -448,13 +399,10 @@ multidict==6.1.0 # aiohttp # yarl mypy==1.11.2 - # via - # feast (setup.py) - # sqlalchemy + # via sqlalchemy mypy-extensions==1.0.0 # via mypy mypy-protobuf==3.3.0 - # via feast (setup.py) nbclient==0.10.0 # via nbconvert nbconvert==7.16.4 @@ -477,7 +425,6 @@ notebook-shim==0.2.4 # notebook numpy==1.26.4 # via - # feast (setup.py) # altair # dask # db-dtypes @@ -512,7 +459,6 @@ packaging==24.1 # sphinx pandas==2.2.2 # via - # feast (setup.py) # altair # dask # dask-expr @@ -538,7 +484,6 @@ pexpect==4.9.0 pip==24.2 # via pip-tools pip-tools==7.4.1 - # via feast (setup.py) platformdirs==3.11.0 # via # jupyter-core @@ -551,11 +496,8 @@ ply==3.11 portalocker==2.10.1 # via msal-extensions pre-commit==3.3.1 - # via feast (setup.py) prometheus-client==0.20.0 - # via - # feast (setup.py) - # jupyter-server + # via jupyter-server prompt-toolkit==3.0.47 # via ipython proto-plus==1.24.0 @@ -566,7 +508,6 @@ proto-plus==1.24.0 # google-cloud-datastore protobuf==4.25.5 # via - # feast (setup.py) # google-api-core # google-cloud-bigquery-storage # google-cloud-bigtable @@ -582,11 +523,8 @@ protobuf==4.25.5 # proto-plus # substrait psutil==5.9.0 - # via - # feast (setup.py) - # ipykernel + # via ipykernel psycopg[binary, pool]==3.2.2 - # via feast (setup.py) psycopg-binary==3.2.2 # via psycopg psycopg-pool==3.2.3 @@ -598,14 +536,12 @@ ptyprocess==0.7.0 pure-eval==0.2.3 # via stack-data py==1.11.0 - # via feast (setup.py) py-cpuinfo==9.0.0 # via pytest-benchmark py4j==0.10.9.7 # via pyspark pyarrow==17.0.0 # via - # feast (setup.py) # dask-expr # db-dtypes # deltalake @@ -621,35 +557,28 @@ pyasn1==0.6.1 pyasn1-modules==0.4.1 # via google-auth pybindgen==0.22.1 - # via feast (setup.py) pycparser==2.22 # via cffi pydantic==2.9.2 # via - # feast (setup.py) # fastapi # great-expectations pydantic-core==2.23.4 # via pydantic pygments==2.18.0 # via - # feast (setup.py) # ipython # nbconvert # rich # sphinx pyjwt[crypto]==2.9.0 # via - # feast (setup.py) # msal # singlestoredb # snowflake-connector-python pymssql==2.3.1 - # via feast (setup.py) pymysql==1.1.1 - # via feast (setup.py) pyodbc==5.1.0 - # via feast (setup.py) pyopenssl==24.2.1 # via snowflake-connector-python pyparsing==3.1.4 @@ -659,10 +588,8 @@ pyproject-hooks==1.1.0 # build # pip-tools pyspark==3.5.2 - # via feast (setup.py) pytest==7.4.4 # via - # feast (setup.py) # pytest-benchmark # pytest-cov # pytest-env @@ -672,21 +599,13 @@ pytest==7.4.4 # pytest-timeout # pytest-xdist pytest-benchmark==3.4.1 - # via feast (setup.py) pytest-cov==5.0.0 - # via feast (setup.py) pytest-env==1.1.3 - # via feast (setup.py) pytest-lazy-fixture==0.6.3 - # via feast (setup.py) pytest-mock==1.10.4 - # via feast (setup.py) pytest-ordering==0.6 - # via feast (setup.py) pytest-timeout==1.4.2 - # via feast (setup.py) pytest-xdist==3.6.1 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via # arrow @@ -704,7 +623,6 @@ python-dotenv==1.0.1 python-json-logger==2.0.7 # via jupyter-events python-keycloak==4.2.2 - # via feast (setup.py) pytz==2024.2 # via # great-expectations @@ -714,7 +632,6 @@ pytz==2024.2 # trino pyyaml==6.0.2 # via - # feast (setup.py) # dask # ibis-substrait # jupyter-events @@ -728,19 +645,15 @@ pyzmq==26.2.0 # jupyter-client # jupyter-server redis==4.6.0 - # via feast (setup.py) referencing==0.35.1 # via # jsonschema # jsonschema-specifications # jupyter-events regex==2024.9.11 - # via - # feast (setup.py) - # parsimonious + # via parsimonious requests==2.32.3 # via - # feast (setup.py) # azure-core # docker # google-api-core @@ -785,8 +698,7 @@ ruamel-yaml==0.17.40 # via great-expectations ruamel-yaml-clib==0.2.8 # via ruamel-yaml -ruff==0.6.5 - # via feast (setup.py) +ruff==0.6.6 s3transfer==0.10.2 # via boto3 scipy==1.14.1 @@ -801,7 +713,6 @@ setuptools==75.1.0 # pip-tools # singlestoredb singlestoredb==1.6.3 - # via feast (setup.py) six==1.16.0 # via # asttokens @@ -822,13 +733,11 @@ sniffio==1.3.1 snowballstemmer==2.2.0 # via sphinx snowflake-connector-python[pandas]==3.12.2 - # via feast (setup.py) sortedcontainers==2.4.0 # via snowflake-connector-python soupsieve==2.6 # via beautifulsoup4 sphinx==6.2.1 - # via feast (setup.py) sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 @@ -842,11 +751,9 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 # via sphinx sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) sqlglot==25.20.1 # via ibis-framework sqlite-vec==0.1.1 - # via feast (setup.py) sqlparams==6.1.0 # via singlestoredb stack-data==0.6.3 @@ -856,23 +763,17 @@ starlette==0.38.5 substrait==0.23.0 # via ibis-substrait tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals testcontainers==4.4.0 - # via feast (setup.py) thriftpy2==0.5.2 # via happybase tinycss2==1.3.0 # via nbconvert toml==0.10.2 - # via feast (setup.py) -tomli==2.0.1 - # via coverage tomlkit==0.13.2 # via snowflake-connector-python toolz==0.12.1 @@ -890,9 +791,7 @@ tornado==6.4.1 # notebook # terminado tqdm==4.66.5 - # via - # feast (setup.py) - # great-expectations + # via great-expectations traitlets==5.14.3 # via # comm @@ -909,37 +808,23 @@ traitlets==5.14.3 # nbconvert # nbformat trino==0.329.0 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) types-cffi==1.16.0.20240331 # via types-pyopenssl types-protobuf==3.19.22 - # via - # feast (setup.py) - # mypy-protobuf + # via mypy-protobuf types-pymysql==1.1.0.20240524 - # via feast (setup.py) types-pyopenssl==24.1.0.20240722 # via types-redis types-python-dateutil==2.9.0.20240906 - # via - # feast (setup.py) - # arrow + # via arrow types-pytz==2024.2.0.20240913 - # via feast (setup.py) types-pyyaml==6.0.12.20240917 - # via feast (setup.py) types-redis==4.6.0.20240903 - # via feast (setup.py) types-requests==2.30.0.0 - # via feast (setup.py) types-setuptools==75.1.0.20240917 - # via - # feast (setup.py) - # types-cffi + # via types-cffi types-tabulate==0.9.0.20240106 - # via feast (setup.py) types-urllib3==1.26.25.14 # via types-requests typing-extensions==4.12.2 @@ -971,7 +856,6 @@ uri-template==1.3.0 # via jsonschema urllib3==2.2.3 # via - # feast (setup.py) # botocore # docker # elastic-transport @@ -982,13 +866,10 @@ urllib3==2.2.3 # responses # testcontainers uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn virtualenv==20.23.0 - # via - # feast (setup.py) - # pre-commit + # via pre-commit watchfiles==0.24.0 # via uvicorn wcwidth==0.2.13 diff --git a/sdk/python/requirements/py3.11-requirements.txt b/sdk/python/requirements/py3.11-requirements.txt index 5c20e45f075..1ce25e7d5b7 100644 --- a/sdk/python/requirements/py3.11-requirements.txt +++ b/sdk/python/requirements/py3.11-requirements.txt @@ -11,34 +11,28 @@ attrs==24.2.0 # jsonschema # referencing bigtree==0.21.1 - # via feast (setup.py) certifi==2024.8.30 # via requests charset-normalizer==3.3.2 # via requests click==8.1.7 # via - # feast (setup.py) # dask # uvicorn cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via feast (setup.py) dask[dataframe]==2024.9.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.14 # via dask dill==0.3.8 - # via feast (setup.py) fastapi==0.115.0 - # via feast (setup.py) fsspec==2024.9.0 # via dask +greenlet==3.1.0 + # via sqlalchemy gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via uvicorn httptools==0.6.1 @@ -50,9 +44,7 @@ idna==3.10 importlib-metadata==8.5.0 # via dask jinja2==3.1.4 - # via feast (setup.py) jsonschema==4.23.0 - # via feast (setup.py) jsonschema-specifications==2023.12.1 # via jsonschema locket==1.0.0 @@ -60,14 +52,12 @@ locket==1.0.0 markupsafe==2.1.5 # via jinja2 mmh3==5.0.0 - # via feast (setup.py) mypy==1.11.2 # via sqlalchemy mypy-extensions==1.0.0 # via mypy numpy==1.26.4 # via - # feast (setup.py) # dask # pandas # pyarrow @@ -77,31 +67,21 @@ packaging==24.1 # gunicorn pandas==2.2.2 # via - # feast (setup.py) # dask # dask-expr partd==1.4.2 # via dask prometheus-client==0.20.0 - # via feast (setup.py) protobuf==4.25.5 - # via feast (setup.py) psutil==6.0.0 - # via feast (setup.py) pyarrow==17.0.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr pydantic==2.9.2 - # via - # feast (setup.py) - # fastapi + # via fastapi pydantic-core==2.23.4 # via pydantic pygments==2.18.0 - # via feast (setup.py) pyjwt==2.9.0 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via pandas python-dotenv==1.0.1 @@ -110,7 +90,6 @@ pytz==2024.2 # via pandas pyyaml==6.0.2 # via - # feast (setup.py) # dask # uvicorn referencing==0.35.1 @@ -118,7 +97,6 @@ referencing==0.35.1 # jsonschema # jsonschema-specifications requests==2.32.3 - # via feast (setup.py) rpds-py==0.20.0 # via # jsonschema @@ -128,23 +106,17 @@ six==1.16.0 sniffio==1.3.1 # via anyio sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) starlette==0.38.5 # via fastapi tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) toml==0.10.2 - # via feast (setup.py) toolz==0.12.1 # via # dask # partd tqdm==4.66.5 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) typing-extensions==4.12.2 # via # fastapi @@ -158,7 +130,6 @@ tzdata==2024.1 urllib3==2.2.3 # via requests uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn watchfiles==0.24.0 diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index bbdca890b6a..5ea2c58819d 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -1,7 +1,6 @@ # This file was autogenerated by uv via the following command: # uv pip compile -p 3.9 --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.9-ci-requirements.txt -aiobotocore==2.15.0 - # via feast (setup.py) +aiobotocore==2.15.1 aiohappyeyeballs==2.4.0 # via aiohttp aiohttp==3.10.5 @@ -22,8 +21,6 @@ anyio==4.5.0 # jupyter-server # starlette # watchfiles -appnope==0.1.4 - # via ipykernel argon2-cffi==23.1.0 # via jupyter-server argon2-cffi-bindings==21.2.0 @@ -33,7 +30,6 @@ arrow==1.3.0 asn1crypto==1.5.1 # via snowflake-connector-python assertpy==1.1 - # via feast (setup.py) asttokens==2.4.1 # via stack-data async-lru==2.0.4 @@ -55,10 +51,8 @@ azure-core==1.31.0 # via # azure-identity # azure-storage-blob -azure-identity==1.17.1 - # via feast (setup.py) +azure-identity==1.18.0 azure-storage-blob==12.23.0 - # via feast (setup.py) babel==2.16.0 # via # jupyterlab-server @@ -68,14 +62,11 @@ beautifulsoup4==4.12.3 bidict==0.23.1 # via ibis-framework bigtree==0.21.1 - # via feast (setup.py) bleach==6.1.0 # via nbconvert -boto3==1.35.16 - # via - # feast (setup.py) - # moto -botocore==1.35.16 +boto3==1.35.23 + # via moto +botocore==1.35.23 # via # aiobotocore # boto3 @@ -83,13 +74,11 @@ botocore==1.35.16 # s3transfer build==1.2.2 # via - # feast (setup.py) # pip-tools # singlestoredb cachetools==5.5.0 # via google-auth cassandra-driver==3.29.2 - # via feast (setup.py) certifi==2024.8.30 # via # elastic-transport @@ -112,7 +101,6 @@ charset-normalizer==3.3.2 # snowflake-connector-python click==8.1.7 # via - # feast (setup.py) # dask # geomet # great-expectations @@ -121,18 +109,15 @@ click==8.1.7 cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via - # feast (setup.py) - # great-expectations + # via great-expectations comm==0.2.2 # via # ipykernel # ipywidgets coverage[toml]==7.6.1 # via pytest-cov -cryptography==42.0.8 +cryptography==43.0.1 # via - # feast (setup.py) # azure-identity # azure-storage-blob # great-expectations @@ -147,9 +132,7 @@ cryptography==42.0.8 cython==3.0.11 # via thriftpy2 dask[dataframe]==2024.8.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.10 # via dask db-dtypes==1.3.0 @@ -161,11 +144,9 @@ decorator==5.1.1 defusedxml==0.7.1 # via nbconvert deltalake==0.20.0 - # via feast (setup.py) deprecation==2.1.0 # via python-keycloak dill==0.3.8 - # via feast (setup.py) distlib==0.3.8 # via virtualenv docker==7.1.0 @@ -177,7 +158,6 @@ duckdb==0.10.3 elastic-transport==8.15.0 # via elasticsearch elasticsearch==8.15.1 - # via feast (setup.py) entrypoints==0.4 # via altair exceptiongroup==1.2.2 @@ -190,7 +170,6 @@ execnet==2.1.1 executing==2.1.0 # via stack-data fastapi==0.115.0 - # via feast (setup.py) fastjsonschema==2.20.0 # via nbformat filelock==3.16.1 @@ -204,21 +183,18 @@ frozenlist==1.4.1 # aiohttp # aiosignal fsspec==2024.9.0 - # via - # feast (setup.py) - # dask + # via dask geomet==0.2.1.post1 # via cassandra-driver -google-api-core[grpc]==2.19.2 +google-api-core[grpc]==2.20.0 # via - # feast (setup.py) # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-bigtable # google-cloud-core # google-cloud-datastore # google-cloud-storage -google-auth==2.34.0 +google-auth==2.35.0 # via # google-api-core # google-cloud-bigquery @@ -229,11 +205,8 @@ google-auth==2.34.0 # google-cloud-storage # kubernetes google-cloud-bigquery[pandas]==3.25.0 - # via feast (setup.py) google-cloud-bigquery-storage==2.26.0 - # via feast (setup.py) google-cloud-bigtable==2.26.0 - # via feast (setup.py) google-cloud-core==2.4.1 # via # google-cloud-bigquery @@ -241,9 +214,7 @@ google-cloud-core==2.4.1 # google-cloud-datastore # google-cloud-storage google-cloud-datastore==2.20.1 - # via feast (setup.py) google-cloud-storage==2.18.2 - # via feast (setup.py) google-crc32c==1.6.0 # via # google-cloud-storage @@ -254,17 +225,16 @@ google-resumable-media==2.7.2 # google-cloud-storage googleapis-common-protos[grpc]==1.65.0 # via - # feast (setup.py) # google-api-core # grpc-google-iam-v1 # grpcio-status great-expectations==0.18.21 - # via feast (setup.py) +greenlet==3.1.0 + # via sqlalchemy grpc-google-iam-v1==0.13.1 # via google-cloud-bigtable grpcio==1.66.1 # via - # feast (setup.py) # google-api-core # googleapis-common-protos # grpc-google-iam-v1 @@ -274,42 +244,30 @@ grpcio==1.66.1 # grpcio-testing # grpcio-tools grpcio-health-checking==1.62.3 - # via feast (setup.py) grpcio-reflection==1.62.3 - # via feast (setup.py) grpcio-status==1.62.3 # via google-api-core grpcio-testing==1.62.3 - # via feast (setup.py) grpcio-tools==1.62.3 - # via feast (setup.py) gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via # httpcore # uvicorn happybase==1.2.0 - # via feast (setup.py) hazelcast-python-client==5.5.0 - # via feast (setup.py) hiredis==2.4.0 - # via feast (setup.py) httpcore==1.0.5 # via httpx httptools==0.6.1 # via uvicorn httpx==0.27.2 # via - # feast (setup.py) # jupyterlab # python-keycloak ibis-framework[duckdb]==9.0.0 - # via - # feast (setup.py) - # ibis-substrait + # via ibis-substrait ibis-substrait==4.0.1 - # via feast (setup.py) identify==2.6.1 # via pre-commit idna==3.10 @@ -352,7 +310,6 @@ jedi==0.19.1 # via ipython jinja2==3.1.4 # via - # feast (setup.py) # altair # great-expectations # jupyter-server @@ -375,7 +332,6 @@ jsonpointer==3.0.0 # jsonschema jsonschema[format-nongpl]==4.23.0 # via - # feast (setup.py) # altair # great-expectations # jupyter-events @@ -423,7 +379,6 @@ jupyterlab-widgets==3.0.13 jwcrypto==1.5.6 # via python-keycloak kubernetes==20.13.0 - # via feast (setup.py) locket==1.0.0 # via partd makefun==1.15.4 @@ -444,17 +399,13 @@ matplotlib-inline==0.1.7 mdurl==0.1.2 # via markdown-it-py minio==7.1.0 - # via feast (setup.py) mistune==3.0.2 # via # great-expectations # nbconvert mmh3==5.0.0 - # via feast (setup.py) mock==2.0.0 - # via feast (setup.py) moto==4.2.14 - # via feast (setup.py) msal==1.31.0 # via # azure-identity @@ -466,13 +417,10 @@ multidict==6.1.0 # aiohttp # yarl mypy==1.11.2 - # via - # feast (setup.py) - # sqlalchemy + # via sqlalchemy mypy-extensions==1.0.0 # via mypy mypy-protobuf==3.3.0 - # via feast (setup.py) nbclient==0.10.0 # via nbconvert nbconvert==7.16.4 @@ -495,7 +443,6 @@ notebook-shim==0.2.4 # notebook numpy==1.26.4 # via - # feast (setup.py) # altair # dask # db-dtypes @@ -529,7 +476,6 @@ packaging==24.1 # sphinx pandas==2.2.2 # via - # feast (setup.py) # altair # dask # dask-expr @@ -555,7 +501,6 @@ pexpect==4.9.0 pip==24.2 # via pip-tools pip-tools==7.4.1 - # via feast (setup.py) platformdirs==3.11.0 # via # jupyter-core @@ -568,11 +513,8 @@ ply==3.11 portalocker==2.10.1 # via msal-extensions pre-commit==3.3.1 - # via feast (setup.py) prometheus-client==0.20.0 - # via - # feast (setup.py) - # jupyter-server + # via jupyter-server prompt-toolkit==3.0.47 # via ipython proto-plus==1.24.0 @@ -583,7 +525,6 @@ proto-plus==1.24.0 # google-cloud-datastore protobuf==4.25.5 # via - # feast (setup.py) # google-api-core # google-cloud-bigquery-storage # google-cloud-bigtable @@ -599,12 +540,9 @@ protobuf==4.25.5 # proto-plus # substrait psutil==5.9.0 - # via - # feast (setup.py) - # ipykernel -psycopg[binary, pool]==3.1.18 - # via feast (setup.py) -psycopg-binary==3.1.18 + # via ipykernel +psycopg[binary, pool]==3.2.2 +psycopg-binary==3.2.2 # via psycopg psycopg-pool==3.2.3 # via psycopg @@ -615,14 +553,12 @@ ptyprocess==0.7.0 pure-eval==0.2.3 # via stack-data py==1.11.0 - # via feast (setup.py) py-cpuinfo==9.0.0 # via pytest-benchmark py4j==0.10.9.7 # via pyspark pyarrow==16.1.0 # via - # feast (setup.py) # dask-expr # db-dtypes # deltalake @@ -638,35 +574,28 @@ pyasn1==0.6.1 pyasn1-modules==0.4.1 # via google-auth pybindgen==0.22.1 - # via feast (setup.py) pycparser==2.22 # via cffi pydantic==2.9.2 # via - # feast (setup.py) # fastapi # great-expectations pydantic-core==2.23.4 # via pydantic pygments==2.18.0 # via - # feast (setup.py) # ipython # nbconvert # rich # sphinx pyjwt[crypto]==2.9.0 # via - # feast (setup.py) # msal # singlestoredb # snowflake-connector-python pymssql==2.3.1 - # via feast (setup.py) pymysql==1.1.1 - # via feast (setup.py) pyodbc==5.1.0 - # via feast (setup.py) pyopenssl==24.2.1 # via snowflake-connector-python pyparsing==3.1.4 @@ -676,10 +605,8 @@ pyproject-hooks==1.1.0 # build # pip-tools pyspark==3.5.2 - # via feast (setup.py) pytest==7.4.4 # via - # feast (setup.py) # pytest-benchmark # pytest-cov # pytest-env @@ -689,21 +616,13 @@ pytest==7.4.4 # pytest-timeout # pytest-xdist pytest-benchmark==3.4.1 - # via feast (setup.py) pytest-cov==5.0.0 - # via feast (setup.py) pytest-env==1.1.3 - # via feast (setup.py) pytest-lazy-fixture==0.6.3 - # via feast (setup.py) pytest-mock==1.10.4 - # via feast (setup.py) pytest-ordering==0.6 - # via feast (setup.py) pytest-timeout==1.4.2 - # via feast (setup.py) pytest-xdist==3.6.1 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via # arrow @@ -721,7 +640,6 @@ python-dotenv==1.0.1 python-json-logger==2.0.7 # via jupyter-events python-keycloak==4.2.2 - # via feast (setup.py) pytz==2024.2 # via # great-expectations @@ -731,7 +649,6 @@ pytz==2024.2 # trino pyyaml==6.0.2 # via - # feast (setup.py) # dask # ibis-substrait # jupyter-events @@ -745,19 +662,15 @@ pyzmq==26.2.0 # jupyter-client # jupyter-server redis==4.6.0 - # via feast (setup.py) referencing==0.35.1 # via # jsonschema # jsonschema-specifications # jupyter-events regex==2024.9.11 - # via - # feast (setup.py) - # parsimonious + # via parsimonious requests==2.32.3 # via - # feast (setup.py) # azure-core # docker # google-api-core @@ -802,8 +715,7 @@ ruamel-yaml==0.17.40 # via great-expectations ruamel-yaml-clib==0.2.8 # via ruamel-yaml -ruff==0.6.5 - # via feast (setup.py) +ruff==0.6.6 s3transfer==0.10.2 # via boto3 scipy==1.13.1 @@ -818,7 +730,6 @@ setuptools==75.1.0 # pip-tools # singlestoredb singlestoredb==1.6.3 - # via feast (setup.py) six==1.16.0 # via # asttokens @@ -839,13 +750,11 @@ sniffio==1.3.1 snowballstemmer==2.2.0 # via sphinx snowflake-connector-python[pandas]==3.12.2 - # via feast (setup.py) sortedcontainers==2.4.0 # via snowflake-connector-python soupsieve==2.6 # via beautifulsoup4 sphinx==6.2.1 - # via feast (setup.py) sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 @@ -859,11 +768,9 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 # via sphinx sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) sqlglot==23.12.2 # via ibis-framework sqlite-vec==0.1.1 - # via feast (setup.py) sqlparams==6.1.0 # via singlestoredb stack-data==0.6.3 @@ -873,21 +780,17 @@ starlette==0.38.5 substrait==0.23.0 # via ibis-substrait tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals testcontainers==4.4.0 - # via feast (setup.py) thriftpy2==0.5.2 # via happybase tinycss2==1.3.0 # via nbconvert toml==0.10.2 - # via feast (setup.py) tomli==2.0.1 # via # build @@ -915,9 +818,7 @@ tornado==6.4.1 # notebook # terminado tqdm==4.66.5 - # via - # feast (setup.py) - # great-expectations + # via great-expectations traitlets==5.14.3 # via # comm @@ -934,37 +835,23 @@ traitlets==5.14.3 # nbconvert # nbformat trino==0.329.0 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) types-cffi==1.16.0.20240331 # via types-pyopenssl types-protobuf==3.19.22 - # via - # feast (setup.py) - # mypy-protobuf + # via mypy-protobuf types-pymysql==1.1.0.20240524 - # via feast (setup.py) types-pyopenssl==24.1.0.20240722 # via types-redis types-python-dateutil==2.9.0.20240906 - # via - # feast (setup.py) - # arrow + # via arrow types-pytz==2024.2.0.20240913 - # via feast (setup.py) types-pyyaml==6.0.12.20240917 - # via feast (setup.py) types-redis==4.6.0.20240903 - # via feast (setup.py) types-requests==2.30.0.0 - # via feast (setup.py) types-setuptools==75.1.0.20240917 - # via - # feast (setup.py) - # types-cffi + # via types-cffi types-tabulate==0.9.0.20240106 - # via feast (setup.py) types-urllib3==1.26.25.14 # via types-requests typing-extensions==4.12.2 @@ -1002,7 +889,6 @@ uri-template==1.3.0 # via jsonschema urllib3==1.26.20 # via - # feast (setup.py) # botocore # docker # elastic-transport @@ -1014,13 +900,10 @@ urllib3==1.26.20 # snowflake-connector-python # testcontainers uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn virtualenv==20.23.0 - # via - # feast (setup.py) - # pre-commit + # via pre-commit watchfiles==0.24.0 # via uvicorn wcwidth==0.2.13 diff --git a/sdk/python/requirements/py3.9-requirements.txt b/sdk/python/requirements/py3.9-requirements.txt index 7ffef84b235..857d7d72bf7 100644 --- a/sdk/python/requirements/py3.9-requirements.txt +++ b/sdk/python/requirements/py3.9-requirements.txt @@ -11,36 +11,30 @@ attrs==24.2.0 # jsonschema # referencing bigtree==0.21.1 - # via feast (setup.py) certifi==2024.8.30 # via requests charset-normalizer==3.3.2 # via requests click==8.1.7 # via - # feast (setup.py) # dask # uvicorn cloudpickle==3.0.0 # via dask colorama==0.4.6 - # via feast (setup.py) dask[dataframe]==2024.8.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr dask-expr==1.1.10 # via dask dill==0.3.8 - # via feast (setup.py) exceptiongroup==1.2.2 # via anyio fastapi==0.115.0 - # via feast (setup.py) fsspec==2024.9.0 # via dask +greenlet==3.1.0 + # via sqlalchemy gunicorn==23.0.0 - # via feast (setup.py) h11==0.14.0 # via uvicorn httptools==0.6.1 @@ -54,9 +48,7 @@ importlib-metadata==8.5.0 # dask # typeguard jinja2==3.1.4 - # via feast (setup.py) jsonschema==4.23.0 - # via feast (setup.py) jsonschema-specifications==2023.12.1 # via jsonschema locket==1.0.0 @@ -64,14 +56,12 @@ locket==1.0.0 markupsafe==2.1.5 # via jinja2 mmh3==5.0.0 - # via feast (setup.py) mypy==1.11.2 # via sqlalchemy mypy-extensions==1.0.0 # via mypy numpy==1.26.4 # via - # feast (setup.py) # dask # pandas # pyarrow @@ -81,31 +71,21 @@ packaging==24.1 # gunicorn pandas==2.2.2 # via - # feast (setup.py) # dask # dask-expr partd==1.4.2 # via dask prometheus-client==0.20.0 - # via feast (setup.py) protobuf==4.25.5 - # via feast (setup.py) psutil==6.0.0 - # via feast (setup.py) pyarrow==17.0.0 - # via - # feast (setup.py) - # dask-expr + # via dask-expr pydantic==2.9.2 - # via - # feast (setup.py) - # fastapi + # via fastapi pydantic-core==2.23.4 # via pydantic pygments==2.18.0 - # via feast (setup.py) pyjwt==2.9.0 - # via feast (setup.py) python-dateutil==2.9.0.post0 # via pandas python-dotenv==1.0.1 @@ -114,7 +94,6 @@ pytz==2024.2 # via pandas pyyaml==6.0.2 # via - # feast (setup.py) # dask # uvicorn referencing==0.35.1 @@ -122,7 +101,6 @@ referencing==0.35.1 # jsonschema # jsonschema-specifications requests==2.32.3 - # via feast (setup.py) rpds-py==0.20.0 # via # jsonschema @@ -132,15 +110,11 @@ six==1.16.0 sniffio==1.3.1 # via anyio sqlalchemy[mypy]==2.0.35 - # via feast (setup.py) starlette==0.38.5 # via fastapi tabulate==0.9.0 - # via feast (setup.py) tenacity==8.5.0 - # via feast (setup.py) toml==0.10.2 - # via feast (setup.py) tomli==2.0.1 # via mypy toolz==0.12.1 @@ -148,9 +122,7 @@ toolz==0.12.1 # dask # partd tqdm==4.66.5 - # via feast (setup.py) typeguard==4.3.0 - # via feast (setup.py) typing-extensions==4.12.2 # via # anyio @@ -167,7 +139,6 @@ tzdata==2024.1 urllib3==2.2.3 # via requests uvicorn[standard]==0.30.6 - # via feast (setup.py) uvloop==0.20.0 # via uvicorn watchfiles==0.24.0 diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index c86441d56c1..5ed16a84302 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -11,7 +11,7 @@ from feast.entity import Entity from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_store import FeatureStore -from feast.feature_view import FeatureView +from feast.feature_view import DUMMY_ENTITY_ID, FeatureView from feast.field import Field from feast.infra.offline_stores.file_source import FileSource from feast.infra.online_stores.sqlite import SqliteOnlineStoreConfig @@ -342,6 +342,51 @@ def test_apply_entities_and_feature_views(test_feature_store): test_feature_store.teardown() +@pytest.mark.parametrize( + "test_feature_store", + [lazy_fixture("feature_store_with_local_registry")], +) +def test_apply_dummuy_entity_and_feature_view_columns(test_feature_store): + assert isinstance(test_feature_store, FeatureStore) + # Create Feature Views + batch_source = FileSource( + file_format=ParquetFormat(), + path="file://feast/*", + timestamp_field="ts_col", + created_timestamp_column="timestamp", + ) + + e1 = Entity(name="fs1_my_entity_1", description="something") + + fv = FeatureView( + name="my_feature_view_no_entity", + schema=[ + Field(name="fs1_my_feature_1", dtype=Int64), + Field(name="fs1_my_feature_2", dtype=String), + Field(name="fs1_my_feature_3", dtype=Array(String)), + Field(name="fs1_my_feature_4", dtype=Array(Bytes)), + Field(name="fs1_my_entity_2", dtype=Int64), + ], + entities=[], + tags={"team": "matchmaking"}, + source=batch_source, + ttl=timedelta(minutes=5), + ) + + # Check that the entity_columns are empty before applying + assert fv.entity_columns == [] + + # Register Feature View + test_feature_store.apply([fv, e1]) + fv_actual = test_feature_store.get_feature_view("my_feature_view_no_entity") + + # Note that after the apply() the feature_view serializes the Dummy Entity ID + assert fv.entity_columns[0].name == DUMMY_ENTITY_ID + assert fv_actual.entity_columns[0].name == DUMMY_ENTITY_ID + + test_feature_store.teardown() + + @pytest.mark.parametrize( "test_feature_store", [lazy_fixture("feature_store_with_local_registry")],