From a6b80e7a09aee84aa0bfb7b8a6e2ddb4a0807db1 Mon Sep 17 00:00:00 2001 From: ntkathole Date: Tue, 9 Sep 2025 19:24:43 +0530 Subject: [PATCH] fix: Fixed project_description to set in registry and UI Signed-off-by: ntkathole --- sdk/python/feast/repo_config.py | 4 ++++ sdk/python/feast/repo_operations.py | 17 +++++++++++++---- ui/src/queries/useLoadRegistry.ts | 10 ++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index f699aeaa198..395720304de 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -185,6 +185,10 @@ class RepoConfig(FeastBaseModel): provider account, as long as they have different project identifier. """ + project_description: Optional[StrictStr] = None + """ str: Optional description of the project to provide context about the project's purpose and usage. + """ + provider: StrictStr = "local" """ str: local or gcp or aws """ diff --git a/sdk/python/feast/repo_operations.py b/sdk/python/feast/repo_operations.py index 72d892e5a0a..8eae581a260 100644 --- a/sdk/python/feast/repo_operations.py +++ b/sdk/python/feast/repo_operations.py @@ -222,7 +222,7 @@ def parse_repo(repo_root: Path) -> RepoContents: def plan(repo_config: RepoConfig, repo_path: Path, skip_source_validation: bool): os.chdir(repo_path) - repo = _get_repo_contents(repo_path, repo_config.project) + repo = _get_repo_contents(repo_path, repo_config.project, repo_config) for project in repo.projects: repo_config.project = project.name store, registry = _get_store_and_registry(repo_config) @@ -239,7 +239,11 @@ def plan(repo_config: RepoConfig, repo_path: Path, skip_source_validation: bool) click.echo(infra_diff.to_string()) -def _get_repo_contents(repo_path, project_name: Optional[str] = None): +def _get_repo_contents( + repo_path, + project_name: Optional[str] = None, + repo_config: Optional[RepoConfig] = None, +): sys.dont_write_bytecode = True repo = parse_repo(repo_path) @@ -248,7 +252,12 @@ def _get_repo_contents(repo_path, project_name: Optional[str] = None): print( f"No project found in the repository. Using project name {project_name} defined in feature_store.yaml" ) - repo.projects.append(Project(name=project_name)) + project_description = ( + repo_config.project_description if repo_config else None + ) + repo.projects.append( + Project(name=project_name, description=project_description or "") + ) else: print( "No project found in the repository. Either define Project in repository or define a project in feature_store.yaml" @@ -389,7 +398,7 @@ def create_feature_store( def apply_total(repo_config: RepoConfig, repo_path: Path, skip_source_validation: bool): os.chdir(repo_path) - repo = _get_repo_contents(repo_path, repo_config.project) + repo = _get_repo_contents(repo_path, repo_config.project, repo_config) for project in repo.projects: repo_config.project = project.name store, registry = _get_store_and_registry(repo_config) diff --git a/ui/src/queries/useLoadRegistry.ts b/ui/src/queries/useLoadRegistry.ts index 07f5d6d6f78..4354ec0e98e 100644 --- a/ui/src/queries/useLoadRegistry.ts +++ b/ui/src/queries/useLoadRegistry.ts @@ -122,8 +122,18 @@ const useLoadRegistry = (url: string) => { ? objects.project : "credit_scoring_aws"; + let projectDescription = undefined; + if ( + objects.projects && + objects.projects.length > 0 && + objects.projects[0].spec + ) { + projectDescription = objects.projects[0].spec.description; + } + return { project: projectName, + description: projectDescription, objects, mergedFVMap, mergedFVList,