mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-01-07 11:40:01 -08:00
01589cb8b0
* Bump importlib-resources from 6.4.0 to 6.4.5 Bumps [importlib-resources](https://github.com/python/importlib_resources) from 6.4.0 to 6.4.5. - [Release notes](https://github.com/python/importlib_resources/releases) - [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst) - [Commits](https://github.com/python/importlib_resources/compare/v6.4.0...v6.4.5) --- updated-dependencies: - dependency-name: importlib-resources dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Update importlib-resources==6.4.5 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> [skip ci]
95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
import pathlib
|
|
import functools
|
|
|
|
from typing import Dict, Union
|
|
from typing import runtime_checkable
|
|
from typing import Protocol
|
|
|
|
|
|
####
|
|
# from jaraco.path 3.7.1
|
|
|
|
|
|
class Symlink(str):
|
|
"""
|
|
A string indicating the target of a symlink.
|
|
"""
|
|
|
|
|
|
FilesSpec = Dict[str, Union[str, bytes, Symlink, 'FilesSpec']]
|
|
|
|
|
|
@runtime_checkable
|
|
class TreeMaker(Protocol):
|
|
def __truediv__(self, *args, **kwargs): ... # pragma: no cover
|
|
|
|
def mkdir(self, **kwargs): ... # pragma: no cover
|
|
|
|
def write_text(self, content, **kwargs): ... # pragma: no cover
|
|
|
|
def write_bytes(self, content): ... # pragma: no cover
|
|
|
|
def symlink_to(self, target): ... # pragma: no cover
|
|
|
|
|
|
def _ensure_tree_maker(obj: Union[str, TreeMaker]) -> TreeMaker:
|
|
return obj if isinstance(obj, TreeMaker) else pathlib.Path(obj) # type: ignore[return-value]
|
|
|
|
|
|
def build(
|
|
spec: FilesSpec,
|
|
prefix: Union[str, TreeMaker] = pathlib.Path(), # type: ignore[assignment]
|
|
):
|
|
"""
|
|
Build a set of files/directories, as described by the spec.
|
|
|
|
Each key represents a pathname, and the value represents
|
|
the content. Content may be a nested directory.
|
|
|
|
>>> spec = {
|
|
... 'README.txt': "A README file",
|
|
... "foo": {
|
|
... "__init__.py": "",
|
|
... "bar": {
|
|
... "__init__.py": "",
|
|
... },
|
|
... "baz.py": "# Some code",
|
|
... "bar.py": Symlink("baz.py"),
|
|
... },
|
|
... "bing": Symlink("foo"),
|
|
... }
|
|
>>> target = getfixture('tmp_path')
|
|
>>> build(spec, target)
|
|
>>> target.joinpath('foo/baz.py').read_text(encoding='utf-8')
|
|
'# Some code'
|
|
>>> target.joinpath('bing/bar.py').read_text(encoding='utf-8')
|
|
'# Some code'
|
|
"""
|
|
for name, contents in spec.items():
|
|
create(contents, _ensure_tree_maker(prefix) / name)
|
|
|
|
|
|
@functools.singledispatch
|
|
def create(content: Union[str, bytes, FilesSpec], path):
|
|
path.mkdir(exist_ok=True)
|
|
build(content, prefix=path) # type: ignore[arg-type]
|
|
|
|
|
|
@create.register
|
|
def _(content: bytes, path):
|
|
path.write_bytes(content)
|
|
|
|
|
|
@create.register
|
|
def _(content: str, path):
|
|
path.write_text(content, encoding='utf-8')
|
|
|
|
|
|
@create.register
|
|
def _(content: Symlink, path):
|
|
path.symlink_to(content)
|
|
|
|
|
|
# end from jaraco.path
|
|
####
|