From 0dc13f096b0a1547b3dc0b442d7d023b9391cd34 Mon Sep 17 00:00:00 2001 From: codyjlin <31944154+codyjlin@users.noreply.github.com> Date: Tue, 7 Sep 2021 13:33:13 -0400 Subject: [PATCH] Enforce case-insensitively unique feature view names (#1835) * Enforce case-insensitively unique feature view names Signed-off-by: Cody Lin * Update tests for case-insensitive uniqueness Signed-off-by: Cody Lin --- sdk/python/feast/feature_store.py | 11 ++++++----- .../test_cli_apply_duplicated_featureview_names.py | 6 ++++-- .../integration/registration/test_feature_store.py | 9 +++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 861d42d3ae..2546a9bf2e 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -982,12 +982,13 @@ def _print_materialization_log( def _validate_feature_views(feature_views: List[FeatureView]): - """ Verify feature views have unique names""" - name_to_fv_dict = {} + """ Verify feature views have case-insensitively unique names""" + fv_names = set() for fv in feature_views: - if fv.name in name_to_fv_dict: + case_insensitive_fv_name = fv.name.lower() + if case_insensitive_fv_name in fv_names: raise ValueError( - f"More than one feature view with name {fv.name} found. Please ensure that all feature view names are unique. It may be necessary to ignore certain files in your feature repository by using a .feastignore file." + f"More than one feature view with name {case_insensitive_fv_name} found. Please ensure that all feature view names are case-insensitively unique. It may be necessary to ignore certain files in your feature repository by using a .feastignore file." ) else: - name_to_fv_dict[fv.name] = fv + fv_names.add(case_insensitive_fv_name) diff --git a/sdk/python/tests/integration/registration/test_cli_apply_duplicated_featureview_names.py b/sdk/python/tests/integration/registration/test_cli_apply_duplicated_featureview_names.py index 61c938c07e..120e56e4ff 100644 --- a/sdk/python/tests/integration/registration/test_cli_apply_duplicated_featureview_names.py +++ b/sdk/python/tests/integration/registration/test_cli_apply_duplicated_featureview_names.py @@ -40,7 +40,8 @@ def test_cli_apply_duplicated_featureview_names() -> None: assert ( rc != 0 - and b"Please ensure that all feature view names are unique" in output + and b"Please ensure that all feature view names are case-insensitively unique" + in output ) @@ -76,5 +77,6 @@ def test_cli_apply_duplicated_featureview_names_multiple_py_files() -> None: assert ( rc != 0 - and b"Please ensure that all feature view names are unique" in output + and b"Please ensure that all feature view names are case-insensitively unique" + in output ) diff --git a/sdk/python/tests/integration/registration/test_feature_store.py b/sdk/python/tests/integration/registration/test_feature_store.py index c90131f7f8..b0cedfd642 100644 --- a/sdk/python/tests/integration/registration/test_feature_store.py +++ b/sdk/python/tests/integration/registration/test_feature_store.py @@ -482,8 +482,8 @@ def test_reapply_feature_view_success(test_feature_store, dataframe_source): test_feature_store.teardown() -def test_apply_duplicated_featureview_names(feature_store_with_local_registry): - """ Test applying feature views with duplicated names""" +def test_apply_conflicting_featureview_names(feature_store_with_local_registry): + """ Test applying feature views with non-case-insensitively unique names""" driver_stats = FeatureView( name="driver_hourly_stats", @@ -495,7 +495,7 @@ def test_apply_duplicated_featureview_names(feature_store_with_local_registry): ) customer_stats = FeatureView( - name="driver_hourly_stats", + name="DRIVER_HOURLY_STATS", entities=["id"], ttl=timedelta(seconds=10), online=False, @@ -509,7 +509,8 @@ def test_apply_duplicated_featureview_names(feature_store_with_local_registry): error = e assert ( isinstance(error, ValueError) - and "Please ensure that all feature view names are unique" in error.args[0] + and "Please ensure that all feature view names are case-insensitively unique" + in error.args[0] ) feature_store_with_local_registry.teardown()