Source code for mth5.data.paths

"""
Sets up paths for synthetic data testing.

"""
import errno
import pathlib
import tempfile
from typing import Optional, Union

from loguru import logger


[docs] DEFAULT_SANDBOX_PATH = pathlib.Path(__file__).parent.resolve()
[docs] class SyntheticTestPaths: """ This class was created to workaround installations with read-only access to the folder containing mth5. Normally, the mth5 data/ folder can be used to store mth5 test data generated when running tests or examples. If data/ is read-only, then this class allows setting "sandbox_path", a writable folder for tests or examples. """ def __init__( self, sandbox_path: Optional[Union[pathlib.Path, None]] = None, ascii_data_path: Optional[Union[pathlib.Path, None]] = None, ): """ :type sandbox_path: Union[pathlib.Path, None] :param sandbox_path: A writable path where test results are stored. :type ascii_data_path: Union[pathlib.Path, None] :param ascii_data_path: This is where the synthetic ascii data are loaded from. """ # READ ONLY OK if ascii_data_path is None: self.ascii_data_path = pathlib.Path(__file__).parent.resolve() # NEED WRITE ACCESS # Consider using an environment variable for sandbox_path if sandbox_path is None: logger.debug( f"synthetic sandbox path is being set to {DEFAULT_SANDBOX_PATH}" ) self._sandbox_path = DEFAULT_SANDBOX_PATH else: self._sandbox_path = sandbox_path
[docs] self.mth5_path = self._sandbox_path.joinpath("mth5")
self.mkdirs() self.writability_check()
[docs] def writability_check(self) -> None: """ Check if the path is writable, and Placeholder Tried adding the second solution from here: https://stackoverflow.com/questions/2113427/determining-whether-a-directory-is-writeable If dirs are not writeable, consider HOME = pathlib.Path().home() workaround_sandbox = HOME.joinpath(".cache", "aurora", "sandbox") """ if not _is_writable(self.mth5_path): msg = f"mth5_path {self.mth5_path} is not writable -- cannot make test data" raise IOError(msg)
[docs] def mkdirs(self) -> None: """ Makes the directories that the tests will write results to. """ try: self.mth5_path.mkdir(parents=True, exist_ok=True) except Exception as e: msg = "unable to create mth5 data folder -- check write access!" raise FileNotFoundError(msg)
def _is_writable(path: pathlib.Path) -> bool: """ Checks a path to see if you can write to it. :type path: pathlib.Path :param path: a place you want to write data :rtype: bool :return: True if path is writable, else False """ try: testfile = tempfile.TemporaryFile(dir=path) testfile.close() except OSError as e: if e.errno == errno.EACCES: # 13 return False e.filename = path raise return True # def main(): # print(DEFAULT_SANDBOX_PATH.absolute()) # # if __name__ =="__main__": # main()