Skip to content
Snippets Groups Projects
Commit 48c7d3f5 authored by Jenkins for Software Heritage's avatar Jenkins for Software Heritage
Browse files

New upstream version 6.5.0

parents 2549a1b0 2d65a24a
No related branches found
Tags debian/upstream/6.5.0
No related merge requests found
Daniele Serafini
Ishan Bhanuka
Antoine Cezar
Pierre-Yves David
Metadata-Version: 2.1
Name: swh.model
Version: 6.4.1
Version: 6.5.0
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
Metadata-Version: 2.1
Name: swh.model
Version: 6.4.1
Version: 6.5.0
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
......@@ -401,7 +401,7 @@ class Directory(MerkleNode):
for instance when the client is applying diffs.
"""
__slots__ = ["__entries"]
__slots__ = ["__entries", "__model_object"]
object_type: Final = "directory"
@classmethod
......@@ -447,9 +447,11 @@ class Directory(MerkleNode):
def __init__(self, data=None):
super().__init__(data=data)
self.__entries = None
self.__model_object = None
def invalidate_hash(self):
self.__entries = None
self.__model_object = None
super().invalidate_hash()
@staticmethod
......@@ -497,12 +499,37 @@ class Directory(MerkleNode):
return CoreSWHID(object_type=ObjectType.DIRECTORY, object_id=self.hash)
def compute_hash(self):
return model.Directory.from_dict({"entries": self.entries}).id
return self.to_model().id
def to_model(self) -> model.Directory:
"""Builds a `model.Directory` object based on this node;
ignoring its children."""
return model.Directory.from_dict(self.get_data())
if self.__model_object is None:
DirectoryEntry = model.DirectoryEntry
entries = []
for name, child in self.items():
if child.object_type == "directory":
e = DirectoryEntry(
type="dir",
perms=DentryPerms.directory,
target=child.hash,
name=name,
)
elif child.object_type == "content":
e = DirectoryEntry(
type="file",
perms=child.data["perms"],
target=child.hash,
name=name,
)
else:
raise ValueError(f"unknown child {child}")
entries.append(e)
entries.sort(key=directory_entry_sort_key)
self.__model_object = model.Directory(entries=tuple(entries))
return self.__model_object
def __getitem__(self, key):
if not isinstance(key, bytes):
......
......@@ -55,12 +55,16 @@ def content_git_object(content: model.Content) -> bytes:
def directory_entry_sort_key(entry: model.DirectoryEntry):
"""The sorting key for tree entries"""
if isinstance(entry, dict):
# For backward compatibility
entry = model.DirectoryEntry.from_dict(entry)
if entry.type == "dir":
return entry.name + b"/"
type_ = entry["type"]
name = entry["name"]
else:
type_ = entry.type
name = entry.name
if type_ == "dir":
return name + b"/"
else:
return entry.name
return name
@lru_cache()
......
This diff is collapsed.
......@@ -43,7 +43,7 @@ from swh.model.model import (
TargetType,
Timestamp,
TimestampWithTimezone,
type_validator,
optimized_validator,
)
import swh.model.swhids
from swh.model.swhids import CoreSWHID, ExtendedSWHID, ObjectType
......@@ -167,6 +167,16 @@ _TYPE_VALIDATOR_PARAMETERS: List[Tuple[Any, List[Any], List[Any]]] = [
[("foo", "bar"), ("", ""), _custom_namedtuple("", ""), _custom_tuple(("", ""))],
[("foo",), ("foo", "bar", "baz"), ("foo", 42), (42, "foo")],
),
(
Tuple[bytes, bytes],
[
(b"foo", b"bar"),
(b"", b""),
_custom_namedtuple(b"", b""),
_custom_tuple((b"", b"")),
],
[(b"foo",), (b"foo", b"bar", b"baz"), (b"foo", 42), (42, b"foo")],
),
(
Tuple[str, ...],
[
......@@ -275,8 +285,9 @@ _TYPE_VALIDATOR_PARAMETERS: List[Tuple[Any, List[Any], List[Any]]] = [
for value in values
],
)
def test_type_validator_valid(type_, value):
type_validator()(None, attr.ib(type=type_), value)
def test_optimized_type_validator_valid(type_, value):
validator = optimized_validator(type_)
validator(None, attr.ib(type=type_), value)
@pytest.mark.parametrize(
......@@ -287,9 +298,10 @@ def test_type_validator_valid(type_, value):
for value in values
],
)
def test_type_validator_invalid(type_, value):
def test_optimized_type_validator_invalid(type_, value):
validator = optimized_validator(type_)
with pytest.raises(AttributeTypeError):
type_validator()(None, attr.ib(type=type_), value)
validator(None, attr.ib(type=type_), value)
@pytest.mark.parametrize("object_type, objects", TEST_OBJECTS.items())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment