Source code for swh.graphql.resolvers.directory_entry
# Copyright (C) 2022 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
from swh.graphql.errors import DataError
from swh.graphql.utils import utils
from swh.model.model import ReleaseTargetType, Sha1Git
from .base_connection import BaseConnection, ConnectionData
from .base_node import BaseNode
[docs]
class BaseDirectoryEntryNode(BaseNode):
[docs]
    def target_hash(self) -> Sha1Git:
        assert self._node is not None
        return self._node.target 
[docs]
    def target_type(self) -> ReleaseTargetType:
        mapping = {
            "file": ReleaseTargetType.CONTENT,
            "dir": ReleaseTargetType.DIRECTORY,
            "rev": ReleaseTargetType.REVISION,
        }
        assert self._node is not None
        return mapping[self._node.type] 
 
[docs]
class DirEntryDirectNode(BaseDirectoryEntryNode):
    """
    Node resolver for a directory entry requested with a
    directory SWHID and a relative path
    """
    def _get_node_data(self):
        # STORAGE-TODO, archive is returning a dict
        # return DirectoryEntry object instead
        return self.archive.get_directory_entry_by_path(
            directory_id=self.kwargs.get("directorySWHID").object_id,
            path=self.kwargs.get("path"),
        ) 
[docs]
class DirEntryInDirectoryNode(BaseDirectoryEntryNode):
    """
    Node resolver for a directory entry requested
    inside a directory object
    """
    from .directory import BaseDirectoryNode
    obj: BaseDirectoryNode
    def _get_node_data(self):
        return self.archive.get_directory_entry_by_path(
            directory_id=self.obj.swhid.object_id,
            path=self.kwargs.get("path"),
        ) 
[docs]
class DirectoryEntryConnection(BaseConnection):
    """
    Connection resolver for entries in a directory
    """
    from .directory import BaseDirectoryNode
    obj: BaseDirectoryNode
    _node_class = BaseDirectoryEntryNode
    def _name_filter(self, dir_entry_name, name_include):
        if not self.kwargs.get("caseSensitive", False):
            return name_include.casefold() in dir_entry_name.decode().casefold()
        return name_include in dir_entry_name.decode()
    def _get_connection_data(self) -> ConnectionData:
        # FIXME, using dummy(local) pagination, move pagination to backend
        # STORAGE-TODO
        response = self.archive.get_directory_entries(self.obj.swhid.object_id)
        if response is None:
            # directory must be available in this case as it is a reference
            raise DataError("Directory object is missing on entries")
        entries = response.results
        if self.kwargs.get("nameInclude") is not None:
            # STORAGE-TODO, move this filter to swh-storage
            entries = [
                entry
                for entry in entries
                if self._name_filter(entry.name, self.kwargs.get("nameInclude"))
            ]
        return utils.get_local_paginated_data(
            entries, self._get_first_arg(), self._get_after_arg()
        )