diff options
Diffstat (limited to 'src/mlia/backend/executor/fs.py')
-rw-r--r-- | src/mlia/backend/executor/fs.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/mlia/backend/executor/fs.py b/src/mlia/backend/executor/fs.py new file mode 100644 index 0000000..3fce19c --- /dev/null +++ b/src/mlia/backend/executor/fs.py @@ -0,0 +1,88 @@ +# SPDX-FileCopyrightText: Copyright 2022, Arm Limited and/or its affiliates. +# SPDX-License-Identifier: Apache-2.0 +"""Module to host all file system related functions.""" +from __future__ import annotations + +import re +import shutil +from pathlib import Path +from typing import Literal + +from mlia.utils.filesystem import get_mlia_resources + +ResourceType = Literal["applications", "systems"] + + +def get_backend_resources() -> Path: + """Get backend resources folder path.""" + return get_mlia_resources() / "backends" + + +def get_backends_path(name: ResourceType) -> Path: + """Return the absolute path of the specified resource. + + It uses importlib to return resources packaged with MANIFEST.in. + """ + if not name: + raise ResourceWarning("Resource name is not provided") + + resource_path = get_backend_resources() / name + if resource_path.is_dir(): + return resource_path + + raise ResourceWarning(f"Resource '{name}' not found.") + + +def copy_directory_content(source: Path, destination: Path) -> None: + """Copy content of the source directory into destination directory.""" + for item in source.iterdir(): + src = source / item.name + dest = destination / item.name + + if src.is_dir(): + shutil.copytree(src, dest) + else: + shutil.copy2(src, dest) + + +def remove_resource(resource_directory: str, resource_type: ResourceType) -> None: + """Remove resource data.""" + resources = get_backends_path(resource_type) + + resource_location = resources / resource_directory + if not resource_location.exists(): + raise Exception(f"Resource {resource_directory} does not exist") + + if not resource_location.is_dir(): + raise Exception(f"Wrong resource {resource_directory}") + + shutil.rmtree(resource_location) + + +def remove_directory(directory_path: Path | None) -> None: + """Remove directory.""" + if not directory_path or not directory_path.is_dir(): + raise Exception("No directory path provided") + + shutil.rmtree(directory_path) + + +def recreate_directory(directory_path: Path | None) -> None: + """Recreate directory.""" + if not directory_path: + raise Exception("No directory path provided") + + if directory_path.exists() and not directory_path.is_dir(): + raise Exception( + f"Path {str(directory_path)} does exist and it is not a directory." + ) + + if directory_path.is_dir(): + remove_directory(directory_path) + + directory_path.mkdir() + + +def valid_for_filename(value: str, replacement: str = "") -> str: + """Replace non alpha numeric characters.""" + return re.sub(r"[^\w.]", replacement, value, flags=re.ASCII) |