Changeset View
Changeset View
Standalone View
Standalone View
swh/model/model.py
Show First 20 Lines • Show All 879 Lines • ▼ Show 20 Lines | def to_dict(self): | ||||
if d["metadata"] is None: | if d["metadata"] is None: | ||||
del d["metadata"] | del d["metadata"] | ||||
return d | return d | ||||
def unique_key(self) -> KeyType: | def unique_key(self) -> KeyType: | ||||
return {"name": self.name, "version": self.version} | return {"name": self.name, "version": self.version} | ||||
def normalize_discovery_date(value: Any) -> datetime.datetime: | |||||
if not isinstance(value, datetime.datetime): | |||||
vlorentz: not tested | |||||
Done Inline ActionsIt wasn't tested before, but fair enough. olasd: It wasn't tested before, but fair enough. | |||||
raise TypeError("discovery_date must be a timezone-aware datetime.") | |||||
if value.tzinfo is None: | |||||
raise ValueError("discovery_date must be a timezone-aware datetime.") | |||||
# Normalize timezone to utc, and truncate microseconds to 0 | |||||
return value.astimezone(datetime.timezone.utc).replace(microsecond=0) | |||||
@attr.s(frozen=True, slots=True) | @attr.s(frozen=True, slots=True) | ||||
class RawExtrinsicMetadata(HashableObject, BaseModel): | class RawExtrinsicMetadata(HashableObject, BaseModel): | ||||
object_type: Final = "raw_extrinsic_metadata" | object_type: Final = "raw_extrinsic_metadata" | ||||
# target object | # target object | ||||
target = attr.ib(type=ExtendedSWHID, validator=type_validator()) | target = attr.ib(type=ExtendedSWHID, validator=type_validator()) | ||||
# source | # source | ||||
discovery_date = attr.ib(type=datetime.datetime, validator=type_validator()) | discovery_date = attr.ib(type=datetime.datetime, converter=normalize_discovery_date) | ||||
authority = attr.ib(type=MetadataAuthority, validator=type_validator()) | authority = attr.ib(type=MetadataAuthority, validator=type_validator()) | ||||
fetcher = attr.ib(type=MetadataFetcher, validator=type_validator()) | fetcher = attr.ib(type=MetadataFetcher, validator=type_validator()) | ||||
# the metadata itself | # the metadata itself | ||||
format = attr.ib(type=str, validator=type_validator()) | format = attr.ib(type=str, validator=type_validator()) | ||||
metadata = attr.ib(type=bytes, validator=type_validator()) | metadata = attr.ib(type=bytes, validator=type_validator()) | ||||
# context | # context | ||||
Show All 13 Lines | directory = attr.ib( | ||||
type=Optional[CoreSWHID], default=None, validator=type_validator() | type=Optional[CoreSWHID], default=None, validator=type_validator() | ||||
) | ) | ||||
id = attr.ib(type=Sha1Git, validator=type_validator(), default=b"") | id = attr.ib(type=Sha1Git, validator=type_validator(), default=b"") | ||||
def compute_hash(self) -> bytes: | def compute_hash(self) -> bytes: | ||||
return hash_to_bytes(raw_extrinsic_metadata_identifier(self.to_dict())) | return hash_to_bytes(raw_extrinsic_metadata_identifier(self.to_dict())) | ||||
@discovery_date.validator | |||||
def check_discovery_date(self, attribute, value): | |||||
"""Checks the discovery_date has a timezone.""" | |||||
if value is not None and value.tzinfo is None: | |||||
raise ValueError("discovery_date must be a timezone-aware datetime.") | |||||
@origin.validator | @origin.validator | ||||
def check_origin(self, attribute, value): | def check_origin(self, attribute, value): | ||||
if value is None: | if value is None: | ||||
return | return | ||||
if self.target.object_type not in ( | if self.target.object_type not in ( | ||||
SwhidExtendedObjectType.SNAPSHOT, | SwhidExtendedObjectType.SNAPSHOT, | ||||
SwhidExtendedObjectType.RELEASE, | SwhidExtendedObjectType.RELEASE, | ||||
▲ Show 20 Lines • Show All 189 Lines • Show Last 20 Lines |
not tested