diff --git a/.coveragerc b/.coveragerc index b3df18a1..3b2d64ce 100644 --- a/.coveragerc +++ b/.coveragerc @@ -4,6 +4,7 @@ omit = */.tox/* */_itertools.py */_legacy.py + */simple.py [report] show_missing = True diff --git a/importlib_resources/abc.py b/importlib_resources/abc.py index a2b0af62..5e38ba61 100644 --- a/importlib_resources/abc.py +++ b/importlib_resources/abc.py @@ -55,6 +55,9 @@ class Traversable(Protocol): """ An object with a subset of pathlib.Path methods suitable for traversing directories and opening files. + + Any exceptions that occur when accessing the backing resource + may propagate unaltered. """ @abc.abstractmethod @@ -90,9 +93,13 @@ def is_file(self) -> bool: """ @abc.abstractmethod - def joinpath(self, child: StrPath) -> "Traversable": + def joinpath(self, *descendants: StrPath) -> "Traversable": """ - Return Traversable child in self + Return Traversable resolved with any descendants applied. + + Each descendant should be a path segment relative to self + and each may contain multiple levels separated by + ``posixpath.sep`` (``/``). """ def __truediv__(self, child: StrPath) -> "Traversable": diff --git a/importlib_resources/simple.py b/importlib_resources/simple.py index da073cbd..1f6e43a2 100644 --- a/importlib_resources/simple.py +++ b/importlib_resources/simple.py @@ -99,10 +99,13 @@ def iterdir(self): def open(self, *args, **kwargs): raise IsADirectoryError() - def joinpath(self, name): + def joinpath(self, *names): + if not names: + return self + name, rest = names[0], names[1:] return next( traversable for traversable in self.iterdir() if traversable.name == name - ) + ).joinpath(*rest) class TraversableReader(TraversableResources, SimpleReader):