# standard imports import os import typing import urllib # bsie imports from bsie.utils import bsfs # inner-module imports from . import nodes from .matcher import Matcher # exports __all__: typing.Sequence[str] = ( 'DefaultMatcher', ) ## code ## class DefaultMatcher(Matcher): """Compose URIs as What information is used as fragment depends on the node type. Typically, the default is to use the "ucid" hint. The fallback in all cases is to generate a random uuid. Never changes previously assigned uris. Sets uris in-place. """ def __init__( self, host: bsfs.URI, user: str, ): self._prefix = bsfs.Namespace(os.path.join(host, user)) def match_node(self, node: nodes.Node) -> nodes.Node: if node.uri is not None: return node if isinstance(node, nodes.Entity): return self.match_entity(node) if isinstance(node, nodes.Preview): return self.match_preview(node) if isinstance(node, nodes.Tag): return self.match_tag(node) if isinstance(node, nodes.Face): return self.match_face(node) raise ValueError(f'no matching policy available for bsfs.typename{node}') def match_entity(self, node: nodes.Entity) -> nodes.Entity: """Set a bsn:Entity node's uri fragment to its ucid.""" node.uri = getattr(self._prefix.file(), node.ucid) return node def match_preview(self, node: nodes.Preview) -> nodes.Preview: """Set a bsn:Preview node's uri fragment to its ucid and size suffix.""" fragment = node.ucid + '_s' + str(node.size) node.uri = getattr(self._prefix.preview(), fragment) return node def match_tag(self, node: nodes.Tag) -> nodes.Tag: """Set a bsn:Tag node's uri to its label.""" # FIXME: match to existing tags in bsfs storage?! fragment = urllib.parse.quote(node.label) node.uri = getattr(self._prefix.tag(), fragment) return node def match_face(self, node: nodes.Face) -> nodes.Face: """Set a bsn:Face node's uri to its ucid.""" node.uri = getattr(self._prefix.face(), node.ucid) return node ## EOF ##