Source code for obsplus.utils.dataset
"""
Simple utility for DataSet.
"""
from __future__ import annotations
import shutil
import tempfile
import textwrap
from contextlib import suppress
from pathlib import Path
import obsplus
def _create_opsdata(opsdata_path: Path):
"""Create the directory to store obsplus datasets, add readme."""
opsdata_path = Path(opsdata_path)
# bail out early if the directory already exists
if opsdata_path.exists():
return
# else create the directory and add a readme.
opsdata_path.mkdir(parents=True, exist_ok=True)
readme_path = opsdata_path / "README.txt"
msg = textwrap.dedent(
"""
This directory contains the data sets curated by the obsplus python
package (github.com/niosh-mining/obsplus).
Each sub-directory contains a single data set and the data set's name is
the name of the directory. You can load the dataset using the
obsplus.load_dataset function and passing the name of the data set as a
string.
"""
)
with readme_path.open("w") as fi:
fi.write(msg)
[docs]
def copy_dataset(
dataset: str | obsplus.DataSet,
destination: str | Path | None = None,
) -> obsplus.DataSet:
"""
Copy a dataset to a destination.
If the destination already exists simply do nothing.
Parameters
----------
dataset
The name of the dataset or a DataSet object.
destination
The destination to copy the dataset. It will be created if it
doesnt exist. If None is provided use tmpfile to create a temporary
directory.
Returns
-------
A new dataset object which refers to the copied files.
"""
dataset = obsplus.load_dataset(dataset)
expected_path: Path = dataset.data_path
assert expected_path.exists(), f"{expected_path} not yet downloaded"
# make destination paths and copy
if destination is None: # use a temp directory if none specified
dest_dir = Path(tempfile.mkdtemp())
else:
dest_dir = Path(destination)
dest_dir.mkdir(parents=True, exist_ok=True)
dest = dest_dir / dataset.name
with suppress(FileExistsError):
shutil.copytree(str(expected_path), str(dest))
# init new dataset of same class with updated base_path and return
return dataset.__class__(base_path=dest.parent)