Source code for feast.project_metadata
# Copyright 2019 The Feast Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import uuid
from typing import Optional
from google.protobuf.json_format import MessageToJson
from typeguard import typechecked
from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto
from feast.usage import log_exceptions
[docs]@typechecked
class ProjectMetadata:
"""
Tracks project level metadata
Attributes:
project_name: The registry-scoped unique name of the project.
project_uuid: The UUID for this project
"""
project_name: str
project_uuid: str
@log_exceptions
def __init__(
self,
*args,
project_name: Optional[str] = None,
project_uuid: Optional[str] = None,
):
"""
Creates an Project metadata object.
Args:
project_name: The registry-scoped unique name of the project.
project_uuid: The UUID for this project
Raises:
ValueError: Parameters are specified incorrectly.
"""
if not project_name:
raise ValueError("Project name needs to be specified")
self.project_name = project_name
self.project_uuid = project_uuid or f"{uuid.uuid4()}"
def __hash__(self) -> int:
return hash((self.project_name, self.project_uuid))
def __eq__(self, other):
if not isinstance(other, ProjectMetadata):
raise TypeError(
"Comparisons should only involve ProjectMetadata class objects."
)
if (
self.project_name != other.project_name
or self.project_uuid != other.project_uuid
):
return False
return True
def __str__(self):
return str(MessageToJson(self.to_proto()))
def __lt__(self, other):
return self.project_name < other.project_name
[docs] @classmethod
def from_proto(cls, project_metadata_proto: ProjectMetadataProto):
"""
Creates project metadata from a protobuf representation.
Args:
project_metadata_proto: A protobuf representation of project metadata.
Returns:
A ProjectMetadata object based on the protobuf.
"""
entity = cls(
project_name=project_metadata_proto.project,
project_uuid=project_metadata_proto.project_uuid,
)
return entity
[docs] def to_proto(self) -> ProjectMetadataProto:
"""
Converts a project metadata object to its protobuf representation.
Returns:
An ProjectMetadataProto protobuf.
"""
return ProjectMetadataProto(
project=self.project_name, project_uuid=self.project_uuid
)