1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
# coding: utf-8
"""
utils functions for io
"""
from __future__ import annotations
import logging
import re
import h5py
import numpy
from silx.utils.enum import Enum as _Enum
from silx.io.utils import h5py_read_dataset
_logger = logging.getLogger(__name__)
__all__ = [
"remove_parenthesis_or_brackets",
"filter_str_def",
"convert_str_to_tuple",
"convert_str_to_bool",
"is_url_path",
"PathType",
]
def remove_parenthesis_or_brackets(input_str):
if (
input_str.startswith("(")
and input_str.endswith(")")
or input_str.startswith("[")
and input_str.endswith("]")
):
input_str = input_str[1:-1]
return input_str
def filter_str_def(elmt):
if elmt is None:
return None
assert isinstance(elmt, str)
elmt = elmt.lstrip(" ").rstrip(" ")
for character in ("'", '"'):
if elmt.startswith(character) and elmt.endswith(character):
elmt = elmt[1:-1]
return elmt
def convert_str_to_tuple(input_str: str, none_if_empty: bool = False) -> tuple | None:
"""
:param input_str: string to convert
:param none_if_empty: if true and the conversion is an empty tuple
return None instead of an empty tuple
"""
if isinstance(input_str, (list, set)):
input_str = tuple(input_str)
if isinstance(input_str, tuple):
return input_str
if input_str is None:
input_str = ""
if not isinstance(input_str, str):
raise TypeError(
f"input_str should be a string not {type(input_str)}, {input_str}"
)
input_str = input_str.lstrip(" ").rstrip(" ")
input_str = remove_parenthesis_or_brackets(input_str)
elmts = input_str.split(",")
elmts = [filter_str_def(elmt) for elmt in elmts]
rm_empty_str = lambda a: a != ""
elmts = list(filter(rm_empty_str, elmts))
if none_if_empty and len(elmts) == 0:
return None
else:
return tuple(elmts)
def convert_str_to_bool(value: str | bool | numpy.bool_):
if isinstance(value, (bool, numpy.bool_)):
return bool(value)
elif isinstance(value, str):
if value not in ("False", "True", "1", "0"):
raise ValueError("value should be 'True' or 'False'")
return value in ("True", "1")
else:
raise TypeError(f"value should be a string or a boolean. Got {type(value)}")
def is_url_path(url_str: str) -> bool:
"""
:param url_str: url as a string
:return: True if the provided string fit DataUrl pattern
[scheme]:://[file_path]?[data_path]
"""
pattern_str_seq = "[a-zA-Z0-9]*"
url_path_pattern = rf"{pattern_str_seq}\:\/\/{pattern_str_seq}"
pattern = re.compile(url_path_pattern)
return bool(re.match(pattern, url_str))
def _get_title_dataset(entry: h5py.Group, title_paths: tuple[str]):
for title_path in title_paths:
if title_path in entry:
return h5py_read_dataset(entry[title_path])
return None
class PathType(_Enum):
ABSOLUTE = "absolute"
RELATIVE = "relative"
|