You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.0 KiB
51 lines
1.0 KiB
2 years ago
|
import pathlib
|
||
|
import functools
|
||
|
|
||
|
|
||
|
####
|
||
|
# from jaraco.path 3.4
|
||
|
|
||
|
|
||
|
def build(spec, prefix=pathlib.Path()):
|
||
|
"""
|
||
|
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",
|
||
|
... }
|
||
|
... }
|
||
|
>>> tmpdir = getfixture('tmpdir')
|
||
|
>>> build(spec, tmpdir)
|
||
|
"""
|
||
|
for name, contents in spec.items():
|
||
|
create(contents, pathlib.Path(prefix) / name)
|
||
|
|
||
|
|
||
|
@functools.singledispatch
|
||
|
def create(content, path):
|
||
|
path.mkdir(exist_ok=True)
|
||
|
build(content, prefix=path) # type: ignore
|
||
|
|
||
|
|
||
|
@create.register
|
||
|
def _(content: bytes, path):
|
||
|
path.write_bytes(content)
|
||
|
|
||
|
|
||
|
@create.register
|
||
|
def _(content: str, path):
|
||
|
path.write_text(content)
|
||
|
|
||
|
|
||
|
# end from jaraco.path
|
||
|
####
|