Changeset View
Changeset View
Standalone View
Standalone View
swh/model/model.py
Show First 20 Lines • Show All 766 Lines • ▼ Show 20 Lines | class DirectoryEntry(BaseModel): | ||||
object_type: Final = "directory_entry" | object_type: Final = "directory_entry" | ||||
name = attr.ib(type=bytes, validator=type_validator()) | name = attr.ib(type=bytes, validator=type_validator()) | ||||
type = attr.ib(type=str, validator=attr.validators.in_(["file", "dir", "rev"])) | type = attr.ib(type=str, validator=attr.validators.in_(["file", "dir", "rev"])) | ||||
target = attr.ib(type=Sha1Git, validator=type_validator(), repr=hash_repr) | target = attr.ib(type=Sha1Git, validator=type_validator(), repr=hash_repr) | ||||
perms = attr.ib(type=int, validator=type_validator(), converter=int, repr=oct) | perms = attr.ib(type=int, validator=type_validator(), converter=int, repr=oct) | ||||
"""Usually one of the values of `swh.model.from_disk.DentryPerms`.""" | """Usually one of the values of `swh.model.from_disk.DentryPerms`.""" | ||||
@name.validator | |||||
def check_name(self, attribute, value): | |||||
if b"/" in value: | |||||
raise ValueError("{value!r} is not a valid directory entry name.") | |||||
@attr.s(frozen=True, slots=True) | @attr.s(frozen=True, slots=True) | ||||
class Directory(HashableObject, BaseModel): | class Directory(HashableObject, BaseModel): | ||||
object_type: Final = "directory" | object_type: Final = "directory" | ||||
entries = attr.ib(type=Tuple[DirectoryEntry, ...], validator=type_validator()) | entries = attr.ib(type=Tuple[DirectoryEntry, ...], validator=type_validator()) | ||||
id = attr.ib(type=Sha1Git, validator=type_validator(), default=b"", repr=hash_repr) | id = attr.ib(type=Sha1Git, validator=type_validator(), default=b"", repr=hash_repr) | ||||
def compute_hash(self) -> bytes: | def compute_hash(self) -> bytes: | ||||
git_object = git_objects.directory_git_object(self) | git_object = git_objects.directory_git_object(self) | ||||
return hashlib.new("sha1", git_object).digest() | return hashlib.new("sha1", git_object).digest() | ||||
@entries.validator | |||||
def check_entries(self, attribute, value): | |||||
seen = set() | |||||
for entry in value: | |||||
if entry.name in seen: | |||||
raise ValueError( | |||||
"{self.swhid()} has duplicated entry name: {entry.name!r}" | |||||
) | |||||
seen.add(entry.name) | |||||
@classmethod | @classmethod | ||||
def from_dict(cls, d): | def from_dict(cls, d): | ||||
d = d.copy() | d = d.copy() | ||||
return cls( | return cls( | ||||
entries=tuple( | entries=tuple( | ||||
DirectoryEntry.from_dict(entry) for entry in d.pop("entries") | DirectoryEntry.from_dict(entry) for entry in d.pop("entries") | ||||
), | ), | ||||
**d, | **d, | ||||
▲ Show 20 Lines • Show All 529 Lines • Show Last 20 Lines |