Source code for catcher.utils.file_utils

import inspect
import io
import json
import ntpath
import os
import shutil
from glob import glob
from os.path import join
from typing import List

import yaml


[docs]def get_module_filename(module) -> str: return get_filename(inspect.getfile(module))
[docs]def get_filename(filename: str) -> str: return ntpath.basename(filename).split('.')[0]
[docs]def cut_path(tests_path, test_path): return get_filename(cut_part_path(tests_path, test_path))
[docs]def cut_part_path(tests_path, test_path): if tests_path == test_path: return get_filename(test_path) # quick fix: fail with include step: can't mix absolute and relative path # TODO need to be rewritten try: common = os.path.commonpath([test_path, tests_path]) except ValueError: return get_filename(test_path) return test_path.split(common)[1][1:]
# Get list of yaml files in dir and subdirs
[docs]def get_files(path: str) -> list: if not os.path.exists(path): raise FileNotFoundError('No such path: ' + path) file = [] if os.path.isdir(path): for f in os.listdir(path): path_in_dir = join(path, f) if os.path.isfile(path_in_dir) and (path_in_dir.endswith('yaml') or path_in_dir.endswith('yml')): file.append(path_in_dir) elif os.path.isdir(path_in_dir): file += get_files(path_in_dir) else: file.append(path) return file
[docs]def find_resource(path: str, resource_name: str, extension=".*") -> List[str]: files = [] pattern = resource_name + extension for d, _, _ in os.walk(path): files.extend(glob(os.path.join(d, pattern))) if not files: raise Exception('No resource found for {}'.format(resource_name)) return files
[docs]def read_source_file(file: str) -> dict: if not os.path.exists(file): raise FileNotFoundError('No such file: ' + file) if file.lower().endswith('json'): return _read_json_file(file) else: return _read_yaml_file(file)
[docs]def read_file(file: str) -> str: if not os.path.exists(file): raise FileNotFoundError('No such file: ' + file) with io.open(file, mode='r', encoding='utf-8') as stream: return stream.read()
# If dir exists delete and and create again
[docs]def ensure_empty(path: str): remove_dir(path) ensure_dir(path)
[docs]def remove_dir(path: str): if os.path.exists(path): shutil.rmtree(path)
[docs]def ensure_dir(path: str): if not os.path.exists(path): os.makedirs(path)
def _read_yaml_file(file: str) -> dict: with open(file, 'r') as stream: try: return yaml.load(stream, Loader=yaml.FullLoader) or {} except yaml.YAMLError as exc: raise yaml.YAMLError('Wrong YAML format for file ' + file + ' : ' + str(exc)) def _read_json_file(file: str) -> dict: with open(file, 'r') as stream: try: return json.load(stream) or {} except yaml.YAMLError as exc: raise yaml.YAMLError('Wrong YAML format for file ' + file + ' : ' + str(exc))