From a3304d4e2d6d803f2a0fe35ef74204bd5cef7517 Mon Sep 17 00:00:00 2001 From: Achal Shah Date: Fri, 24 Jun 2022 12:16:27 -0700 Subject: [PATCH] feat: Add feast repo-upgrade for automated repo upgrades (#2733) * WIP feat: Add feast repo-upgrade for automated repo upgrades Signed-off-by: Achal Shah * pin deps Signed-off-by: Achal Shah --- sdk/python/feast/cli.py | 24 ++++++- sdk/python/feast/repo_upgrade.py | 72 +++++++++++++++++++ .../requirements/py3.10-ci-requirements.txt | 55 ++++++++------ .../requirements/py3.10-requirements.txt | 38 ++++++---- .../requirements/py3.8-ci-requirements.txt | 55 ++++++++------ .../requirements/py3.8-requirements.txt | 38 ++++++---- .../requirements/py3.9-ci-requirements.txt | 55 ++++++++------ .../requirements/py3.9-requirements.txt | 38 ++++++---- setup.py | 1 + 9 files changed, 269 insertions(+), 107 deletions(-) create mode 100644 sdk/python/feast/repo_upgrade.py diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index 41d5be03c5..91815d30fd 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -41,6 +41,7 @@ registry_dump, teardown, ) +from feast.repo_upgrade import RepoUpgrader from feast.utils import maybe_local_tz _logger = logging.getLogger(__name__) @@ -85,7 +86,7 @@ def cli(ctx: click.Context, chdir: Optional[str], log_level: str): try: level = getattr(logging, log_level.upper()) logging.basicConfig( - format="%(asctime)s %(levelname)s:%(message)s", + format="%(asctime)s %(name)s %(levelname)s: %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p", level=level, ) @@ -98,7 +99,6 @@ def cli(ctx: click.Context, chdir: Optional[str], log_level: str): if "feast" in logger_name: logger = logging.getLogger(logger_name) logger.setLevel(level) - except Exception as e: raise e pass @@ -825,5 +825,25 @@ def validate( exit(1) +@cli.command("repo-upgrade", cls=NoOptionDefaultFormat) +@click.option( + "--write", + is_flag=True, + default=False, + help="Upgrade a feature repo to use the API expected by feast 0.23.", +) +@click.pass_context +def repo_upgrade(ctx: click.Context, write: bool): + """ + Upgrade a feature repo in place. + """ + repo = ctx.obj["CHDIR"] + cli_check_repo(repo) + try: + RepoUpgrader(repo, write).upgrade() + except FeastProviderLoginError as e: + print(str(e)) + + if __name__ == "__main__": cli() diff --git a/sdk/python/feast/repo_upgrade.py b/sdk/python/feast/repo_upgrade.py new file mode 100644 index 0000000000..5c8d7433b2 --- /dev/null +++ b/sdk/python/feast/repo_upgrade.py @@ -0,0 +1,72 @@ +import logging +from pathlib import Path +from typing import Dict, List + +from bowler import Query +from fissix.pgen2 import token +from fissix.pygram import python_symbols +from fissix.pytree import Node + +from feast.repo_operations import get_repo_files + +SOURCES = { + "FileSource", + "BigQuerySource", + "RedshiftSource", + "SnowflakeSource", + "KafkaSource", + "KinesisSource", +} + + +class RepoUpgrader: + def __init__(self, repo_path: str, write: bool): + self.repo_path = repo_path + self.write = write + self.repo_files: List[str] = [ + str(p) for p in get_repo_files(Path(self.repo_path)) + ] + logging.getLogger("RefactoringTool").setLevel(logging.WARNING) + + def upgrade(self): + self.remove_date_partition_column() + + def remove_date_partition_column(self): + def _remove_date_partition_column( + node: Node, capture: Dict[str, Node], filename: str + ) -> None: + self.remove_argument_transform(node, "date_partition_column") + + for s in SOURCES: + Query(self.repo_files).select_class(s).is_call().modify( + _remove_date_partition_column + ).execute(write=self.write, interactive=False) + + @staticmethod + def remove_argument_transform(node: Node, argument: str): + """ + Removes the specified argument. + For example, if the argument is "join_key", this method transforms + driver = Entity( + name="driver_id", + join_key="driver_id", + ) + into + driver = Entity( + name="driver_id", + ) + This method assumes that node represents a class call that already has an arglist. + """ + if len(node.children) < 2 or len(node.children[1].children) < 2: + raise ValueError(f"Expected a class call with an arglist but got {node}.") + class_args = node.children[1].children[1].children + for i, class_arg in enumerate(class_args): + if ( + class_arg.type == python_symbols.argument + and class_arg.children[0].value == argument + ): + class_args.pop(i) + if i < len(class_args) and class_args[i].type == token.COMMA: + class_args.pop(i) + if i < len(class_args) and class_args[i].type == token.NEWLINE: + class_args.pop(i) diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 59c643234f..3bdf468bb2 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -31,13 +31,13 @@ altair==4.2.0 anyio==3.6.1 # via # starlette - # watchgod + # watchfiles appdirs==1.4.4 - # via black + # via + # black + # fissix appnope==0.1.3 # via ipython -asgiref==3.5.2 - # via uvicorn asn1crypto==1.5.1 # via # oscrypto @@ -54,6 +54,7 @@ attrs==21.4.0 # via # aiohttp # black + # bowler # jsonschema # pytest avro==1.10.0 @@ -86,6 +87,8 @@ botocore==1.23.24 # boto3 # moto # s3transfer +bowler==0.9.0 + # via feast (setup.py) build==0.8.0 # via feast (setup.py) cachecontrol==0.12.11 @@ -113,8 +116,10 @@ charset-normalizer==2.0.12 click==8.0.1 # via # black + # bowler # feast (setup.py) # great-expectations + # moreorless # pip-tools # uvicorn cloudpickle==2.1.0 @@ -178,6 +183,8 @@ filelock==3.7.1 # via virtualenv firebase-admin==4.5.2 # via feast (setup.py) +fissix==21.11.13 + # via bowler flake8==4.0.1 # via feast (setup.py) frozenlist==1.3.0 @@ -243,7 +250,7 @@ google-resumable-media==1.3.3 # via # google-cloud-bigquery # google-cloud-storage -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core @@ -252,7 +259,7 @@ great-expectations==0.14.13 # via feast (setup.py) greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # google-api-core @@ -260,7 +267,7 @@ grpcio==1.46.3 # grpcio-reflection # grpcio-testing # grpcio-tools -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) grpcio-testing==1.44.0 # via feast (setup.py) @@ -341,7 +348,9 @@ mmh3==3.0.0 # via feast (setup.py) mock==2.0.0 # via feast (setup.py) -moto==3.1.13 +moreorless==0.4.0 + # via bowler +moto==3.1.14 # via feast (setup.py) msal==1.18.0 # via @@ -369,7 +378,7 @@ mypy-extensions==0.4.3 # via mypy mypy-protobuf==3.1 # via feast (setup.py) -mysqlclient==2.1.0 +mysqlclient==2.1.1 # via feast (setup.py) nbformat==5.4.0 # via great-expectations @@ -399,7 +408,7 @@ packaging==21.3 # pytest # redis # sphinx -pandas==1.4.2 +pandas==1.4.3 # via # altair # feast (setup.py) @@ -492,7 +501,7 @@ pycodestyle==2.8.0 # via flake8 pycparser==2.21 # via cffi -pycryptodomex==3.14.1 +pycryptodomex==3.15.0 # via snowflake-connector-python pydantic==1.9.1 # via @@ -656,7 +665,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy @@ -664,11 +673,11 @@ stack-data==0.3.0 # via ipython starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) termcolor==1.1.0 # via great-expectations @@ -713,19 +722,19 @@ types-protobuf==3.19.22 # via # feast (setup.py) # mypy-protobuf -types-python-dateutil==2.8.17 +types-python-dateutil==2.8.18 # via feast (setup.py) -types-pytz==2021.3.8 +types-pytz==2022.1.0 # via feast (setup.py) types-pyyaml==6.0.8 # via feast (setup.py) -types-redis==4.2.7 +types-redis==4.3.2 # via feast (setup.py) -types-requests==2.27.30 +types-requests==2.27.31 # via feast (setup.py) types-setuptools==57.4.17 # via feast (setup.py) -types-tabulate==0.8.9 +types-tabulate==0.8.10 # via feast (setup.py) types-urllib3==1.26.15 # via types-requests @@ -750,17 +759,19 @@ urllib3==1.26.9 # minio # requests # responses -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn virtualenv==20.14.1 # via pre-commit -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn wcwidth==0.2.5 # via prompt-toolkit -websocket-client==1.3.2 +websocket-client==1.3.3 # via docker websockets==10.3 # via uvicorn diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt index f5ec75ee06..15ee46aff5 100644 --- a/sdk/python/requirements/py3.10-requirements.txt +++ b/sdk/python/requirements/py3.10-requirements.txt @@ -9,11 +9,15 @@ absl-py==1.1.0 anyio==3.6.1 # via # starlette - # watchgod -asgiref==3.5.2 - # via uvicorn + # watchfiles +appdirs==1.4.4 + # via fissix attrs==21.4.0 - # via jsonschema + # via + # bowler + # jsonschema +bowler==0.9.0 + # via feast (setup.py) cachetools==5.2.0 # via google-auth certifi==2022.6.15 @@ -22,7 +26,9 @@ charset-normalizer==2.0.12 # via requests click==8.0.1 # via + # bowler # feast (setup.py) + # moreorless # uvicorn cloudpickle==2.1.0 # via dask @@ -38,24 +44,26 @@ fastavro==1.5.1 # via # feast (setup.py) # pandavro +fissix==21.11.13 + # via bowler fsspec==2022.5.0 # via dask google-api-core==2.8.2 # via feast (setup.py) google-auth==2.8.0 # via google-api-core -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core # tensorflow-metadata greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # grpcio-reflection -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) h11==0.13.0 # via uvicorn @@ -75,6 +83,8 @@ markupsafe==2.1.1 # via jinja2 mmh3==3.0.0 # via feast (setup.py) +moreorless==0.4.0 + # via bowler mypy==0.961 # via sqlalchemy mypy-extensions==0.4.3 @@ -87,7 +97,7 @@ numpy==1.21.6 # pyarrow packaging==21.3 # via dask -pandas==1.4.2 +pandas==1.4.3 # via # feast (setup.py) # pandavro @@ -146,17 +156,17 @@ six==1.16.0 # python-dateutil sniffio==1.2.0 # via anyio -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) toml==0.10.2 # via feast (setup.py) @@ -177,11 +187,13 @@ typing-extensions==4.2.0 # sqlalchemy2-stubs urllib3==1.26.9 # via requests -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn websockets==10.3 # via uvicorn diff --git a/sdk/python/requirements/py3.8-ci-requirements.txt b/sdk/python/requirements/py3.8-ci-requirements.txt index 07d0ff3438..dd21fae0a2 100644 --- a/sdk/python/requirements/py3.8-ci-requirements.txt +++ b/sdk/python/requirements/py3.8-ci-requirements.txt @@ -31,13 +31,13 @@ altair==4.2.0 anyio==3.6.1 # via # starlette - # watchgod + # watchfiles appdirs==1.4.4 - # via black + # via + # black + # fissix appnope==0.1.3 # via ipython -asgiref==3.5.2 - # via uvicorn asn1crypto==1.5.1 # via # oscrypto @@ -54,6 +54,7 @@ attrs==21.4.0 # via # aiohttp # black + # bowler # jsonschema # pytest avro==1.10.0 @@ -90,6 +91,8 @@ botocore==1.23.24 # boto3 # moto # s3transfer +bowler==0.9.0 + # via feast (setup.py) build==0.8.0 # via feast (setup.py) cachecontrol==0.12.11 @@ -117,8 +120,10 @@ charset-normalizer==2.0.12 click==8.0.1 # via # black + # bowler # feast (setup.py) # great-expectations + # moreorless # pip-tools # uvicorn cloudpickle==2.1.0 @@ -182,6 +187,8 @@ filelock==3.7.1 # via virtualenv firebase-admin==4.5.2 # via feast (setup.py) +fissix==21.11.13 + # via bowler flake8==4.0.1 # via feast (setup.py) frozenlist==1.3.0 @@ -247,7 +254,7 @@ google-resumable-media==1.3.3 # via # google-cloud-bigquery # google-cloud-storage -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core @@ -256,7 +263,7 @@ great-expectations==0.14.13 # via feast (setup.py) greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # google-api-core @@ -264,7 +271,7 @@ grpcio==1.46.3 # grpcio-reflection # grpcio-testing # grpcio-tools -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) grpcio-testing==1.44.0 # via feast (setup.py) @@ -347,7 +354,9 @@ mmh3==3.0.0 # via feast (setup.py) mock==2.0.0 # via feast (setup.py) -moto==3.1.13 +moreorless==0.4.0 + # via bowler +moto==3.1.14 # via feast (setup.py) msal==1.18.0 # via @@ -375,7 +384,7 @@ mypy-extensions==0.4.3 # via mypy mypy-protobuf==3.1 # via feast (setup.py) -mysqlclient==2.1.0 +mysqlclient==2.1.1 # via feast (setup.py) nbformat==5.4.0 # via great-expectations @@ -405,7 +414,7 @@ packaging==21.3 # pytest # redis # sphinx -pandas==1.4.2 +pandas==1.4.3 # via # altair # feast (setup.py) @@ -498,7 +507,7 @@ pycodestyle==2.8.0 # via flake8 pycparser==2.21 # via cffi -pycryptodomex==3.14.1 +pycryptodomex==3.15.0 # via snowflake-connector-python pydantic==1.9.1 # via @@ -664,7 +673,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy @@ -672,11 +681,11 @@ stack-data==0.3.0 # via ipython starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) termcolor==1.1.0 # via great-expectations @@ -721,19 +730,19 @@ types-protobuf==3.19.22 # via # feast (setup.py) # mypy-protobuf -types-python-dateutil==2.8.17 +types-python-dateutil==2.8.18 # via feast (setup.py) -types-pytz==2021.3.8 +types-pytz==2022.1.0 # via feast (setup.py) types-pyyaml==6.0.8 # via feast (setup.py) -types-redis==4.2.7 +types-redis==4.3.2 # via feast (setup.py) -types-requests==2.27.30 +types-requests==2.27.31 # via feast (setup.py) types-setuptools==57.4.17 # via feast (setup.py) -types-tabulate==0.8.9 +types-tabulate==0.8.10 # via feast (setup.py) types-urllib3==1.26.15 # via types-requests @@ -760,17 +769,19 @@ urllib3==1.26.9 # minio # requests # responses -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn virtualenv==20.14.1 # via pre-commit -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn wcwidth==0.2.5 # via prompt-toolkit -websocket-client==1.3.2 +websocket-client==1.3.3 # via docker websockets==10.3 # via uvicorn diff --git a/sdk/python/requirements/py3.8-requirements.txt b/sdk/python/requirements/py3.8-requirements.txt index 7b8be107ad..7756acad31 100644 --- a/sdk/python/requirements/py3.8-requirements.txt +++ b/sdk/python/requirements/py3.8-requirements.txt @@ -9,11 +9,15 @@ absl-py==1.1.0 anyio==3.6.1 # via # starlette - # watchgod -asgiref==3.5.2 - # via uvicorn + # watchfiles +appdirs==1.4.4 + # via fissix attrs==21.4.0 - # via jsonschema + # via + # bowler + # jsonschema +bowler==0.9.0 + # via feast (setup.py) cachetools==5.2.0 # via google-auth certifi==2022.6.15 @@ -22,7 +26,9 @@ charset-normalizer==2.0.12 # via requests click==8.0.1 # via + # bowler # feast (setup.py) + # moreorless # uvicorn cloudpickle==2.1.0 # via dask @@ -38,24 +44,26 @@ fastavro==1.5.1 # via # feast (setup.py) # pandavro +fissix==21.11.13 + # via bowler fsspec==2022.5.0 # via dask google-api-core==2.8.2 # via feast (setup.py) google-auth==2.8.0 # via google-api-core -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core # tensorflow-metadata greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # grpcio-reflection -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) h11==0.13.0 # via uvicorn @@ -77,6 +85,8 @@ markupsafe==2.1.1 # via jinja2 mmh3==3.0.0 # via feast (setup.py) +moreorless==0.4.0 + # via bowler mypy==0.961 # via sqlalchemy mypy-extensions==0.4.3 @@ -89,7 +99,7 @@ numpy==1.21.6 # pyarrow packaging==21.3 # via dask -pandas==1.4.2 +pandas==1.4.3 # via # feast (setup.py) # pandavro @@ -148,17 +158,17 @@ six==1.16.0 # python-dateutil sniffio==1.2.0 # via anyio -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) toml==0.10.2 # via feast (setup.py) @@ -180,11 +190,13 @@ typing-extensions==4.2.0 # starlette urllib3==1.26.9 # via requests -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn websockets==10.3 # via uvicorn diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index 46b44f26f7..f9f65633f0 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -31,13 +31,13 @@ altair==4.2.0 anyio==3.6.1 # via # starlette - # watchgod + # watchfiles appdirs==1.4.4 - # via black + # via + # black + # fissix appnope==0.1.3 # via ipython -asgiref==3.5.2 - # via uvicorn asn1crypto==1.5.1 # via # oscrypto @@ -54,6 +54,7 @@ attrs==21.4.0 # via # aiohttp # black + # bowler # jsonschema # pytest avro==1.10.0 @@ -86,6 +87,8 @@ botocore==1.23.24 # boto3 # moto # s3transfer +bowler==0.9.0 + # via feast (setup.py) build==0.8.0 # via feast (setup.py) cachecontrol==0.12.11 @@ -113,8 +116,10 @@ charset-normalizer==2.0.12 click==8.0.1 # via # black + # bowler # feast (setup.py) # great-expectations + # moreorless # pip-tools # uvicorn cloudpickle==2.1.0 @@ -178,6 +183,8 @@ filelock==3.7.1 # via virtualenv firebase-admin==4.5.2 # via feast (setup.py) +fissix==21.11.13 + # via bowler flake8==4.0.1 # via feast (setup.py) frozenlist==1.3.0 @@ -243,7 +250,7 @@ google-resumable-media==1.3.3 # via # google-cloud-bigquery # google-cloud-storage -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core @@ -252,7 +259,7 @@ great-expectations==0.14.13 # via feast (setup.py) greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # google-api-core @@ -260,7 +267,7 @@ grpcio==1.46.3 # grpcio-reflection # grpcio-testing # grpcio-tools -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) grpcio-testing==1.44.0 # via feast (setup.py) @@ -341,7 +348,9 @@ mmh3==3.0.0 # via feast (setup.py) mock==2.0.0 # via feast (setup.py) -moto==3.1.13 +moreorless==0.4.0 + # via bowler +moto==3.1.14 # via feast (setup.py) msal==1.18.0 # via @@ -369,7 +378,7 @@ mypy-extensions==0.4.3 # via mypy mypy-protobuf==3.1 # via feast (setup.py) -mysqlclient==2.1.0 +mysqlclient==2.1.1 # via feast (setup.py) nbformat==5.4.0 # via great-expectations @@ -399,7 +408,7 @@ packaging==21.3 # pytest # redis # sphinx -pandas==1.4.2 +pandas==1.4.3 # via # altair # feast (setup.py) @@ -492,7 +501,7 @@ pycodestyle==2.8.0 # via flake8 pycparser==2.21 # via cffi -pycryptodomex==3.14.1 +pycryptodomex==3.15.0 # via snowflake-connector-python pydantic==1.9.1 # via @@ -658,7 +667,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy @@ -666,11 +675,11 @@ stack-data==0.3.0 # via ipython starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) termcolor==1.1.0 # via great-expectations @@ -715,19 +724,19 @@ types-protobuf==3.19.22 # via # feast (setup.py) # mypy-protobuf -types-python-dateutil==2.8.17 +types-python-dateutil==2.8.18 # via feast (setup.py) -types-pytz==2021.3.8 +types-pytz==2022.1.0 # via feast (setup.py) types-pyyaml==6.0.8 # via feast (setup.py) -types-redis==4.2.7 +types-redis==4.3.2 # via feast (setup.py) -types-requests==2.27.30 +types-requests==2.27.31 # via feast (setup.py) types-setuptools==57.4.17 # via feast (setup.py) -types-tabulate==0.8.9 +types-tabulate==0.8.10 # via feast (setup.py) types-urllib3==1.26.15 # via types-requests @@ -754,17 +763,19 @@ urllib3==1.26.9 # minio # requests # responses -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn virtualenv==20.14.1 # via pre-commit -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn wcwidth==0.2.5 # via prompt-toolkit -websocket-client==1.3.2 +websocket-client==1.3.3 # via docker websockets==10.3 # via uvicorn diff --git a/sdk/python/requirements/py3.9-requirements.txt b/sdk/python/requirements/py3.9-requirements.txt index 754847471d..f5c15dad5d 100644 --- a/sdk/python/requirements/py3.9-requirements.txt +++ b/sdk/python/requirements/py3.9-requirements.txt @@ -9,11 +9,15 @@ absl-py==1.1.0 anyio==3.6.1 # via # starlette - # watchgod -asgiref==3.5.2 - # via uvicorn + # watchfiles +appdirs==1.4.4 + # via fissix attrs==21.4.0 - # via jsonschema + # via + # bowler + # jsonschema +bowler==0.9.0 + # via feast (setup.py) cachetools==5.2.0 # via google-auth certifi==2022.6.15 @@ -22,7 +26,9 @@ charset-normalizer==2.0.12 # via requests click==8.0.1 # via + # bowler # feast (setup.py) + # moreorless # uvicorn cloudpickle==2.1.0 # via dask @@ -38,24 +44,26 @@ fastavro==1.5.1 # via # feast (setup.py) # pandavro +fissix==21.11.13 + # via bowler fsspec==2022.5.0 # via dask google-api-core==2.8.2 # via feast (setup.py) google-auth==2.8.0 # via google-api-core -googleapis-common-protos==1.56.2 +googleapis-common-protos==1.56.3 # via # feast (setup.py) # google-api-core # tensorflow-metadata greenlet==1.1.2 # via sqlalchemy -grpcio==1.46.3 +grpcio==1.47.0 # via # feast (setup.py) # grpcio-reflection -grpcio-reflection==1.46.3 +grpcio-reflection==1.47.0 # via feast (setup.py) h11==0.13.0 # via uvicorn @@ -75,6 +83,8 @@ markupsafe==2.1.1 # via jinja2 mmh3==3.0.0 # via feast (setup.py) +moreorless==0.4.0 + # via bowler mypy==0.961 # via sqlalchemy mypy-extensions==0.4.3 @@ -87,7 +97,7 @@ numpy==1.21.6 # pyarrow packaging==21.3 # via dask -pandas==1.4.2 +pandas==1.4.3 # via # feast (setup.py) # pandavro @@ -146,17 +156,17 @@ six==1.16.0 # python-dateutil sniffio==1.2.0 # via anyio -sqlalchemy[mypy]==1.4.37 +sqlalchemy[mypy]==1.4.38 # via feast (setup.py) sqlalchemy2-stubs==0.0.2a24 # via sqlalchemy starlette==0.19.1 # via fastapi -tabulate==0.8.9 +tabulate==0.8.10 # via feast (setup.py) tenacity==8.0.1 # via feast (setup.py) -tensorflow-metadata==1.8.0 +tensorflow-metadata==1.9.0 # via feast (setup.py) toml==0.10.2 # via feast (setup.py) @@ -178,11 +188,13 @@ typing-extensions==4.2.0 # starlette urllib3==1.26.9 # via requests -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.1 # via feast (setup.py) uvloop==0.16.0 # via uvicorn -watchgod==0.8.2 +volatile==2.1.0 + # via bowler +watchfiles==0.15.0 # via uvicorn websockets==10.3 # via uvicorn diff --git a/setup.py b/setup.py index 49b2d45d03..6622a56ed7 100644 --- a/setup.py +++ b/setup.py @@ -76,6 +76,7 @@ "uvicorn[standard]>=0.14.0,<1", "tensorflow-metadata>=1.0.0,<2.0.0", "dask>=2021.*,<2022.02.0", + "bowler", # Needed for automatic repo upgrades ] GCP_REQUIRED = [