code cleaning

This commit is contained in:
klemek
2020-04-28 16:28:29 +02:00
parent 9e2d2fcce7
commit 462ec21a53
+68 -34
View File
@@ -5,10 +5,18 @@ from typing import List, Optional, Union
from Levenshtein import distance
# region path utils
def relative_path(file: str, *args: str) -> str:
return path.realpath(path.join(path.dirname(path.realpath(file)), *args))
# endregion
# region dict utils
def read_key_safe(d: dict, k: str, default=None, *,
types: Optional[List[type]] = None,
is_list: bool = False,
@@ -37,6 +45,11 @@ def read_key(d: dict, k: str, default=None, *,
raise KeyError(k)
# endregion
# region type utils
def check_type(obj, types: List[type], is_list: bool = False, is_list_size: Optional[int] = None):
if is_list:
if not is_list_of(obj, types, is_list_size):
@@ -65,6 +78,11 @@ def is_list_of(obj, types: List[type], length: Optional[int] = None) -> bool:
return True
# endregion
# region args utils
args_regex = re.compile('"([^"]*)"|\'([^\']*)\'|([^ ]+)')
@@ -78,6 +96,29 @@ def parse_arguments(src: str) -> List[str]:
return [get_found_match(m) for m in args_regex.findall(src)]
def read_argument(args: List[str], *names: str, valued: bool = False, delete: bool = False):
for i, arg in enumerate(args):
if arg.lower() in names:
if delete:
del args[i]
i -= 1
if not valued:
return True
else:
v = None
if i + 1 < len(args):
v = args[i + 1]
if delete:
del args[i + 1]
return v
return None
# endregion
# region lang utils
def find_nearest(word: str, wlist: List[str], threshold: int = 5) -> Optional[str]:
distances = [
(distance(word, w), # distance
@@ -91,6 +132,10 @@ def find_nearest(word: str, wlist: List[str], threshold: int = 5) -> Optional[st
return found[2]
# endregion
# region text formatting utils
def justify_text(src: str, n_lines: int) -> Optional[str]:
spaces_indexes = find_all(src, " ")
if n_lines - 1 > len(spaces_indexes):
@@ -102,6 +147,28 @@ def justify_text(src: str, n_lines: int) -> Optional[str]:
return replace_at(src, "\n", break_indexes, 1)
def place_line_breaks(breaks_positions: List[float], spaces_indexes: List[int]) -> List[int]:
breaks_positions = breaks_positions[:]
breaks_indexes = []
dist = sys.maxsize
for i, value in enumerate(spaces_indexes):
if not len(breaks_positions):
break
if dist < abs(value - breaks_positions[0]):
breaks_indexes += [spaces_indexes[i - 1]]
breaks_positions.pop(0)
else:
dist = abs(value - breaks_positions[0])
if len(breaks_positions):
breaks_indexes += [spaces_indexes[-1]]
return breaks_indexes
# endregion
# region string utils
def find_all(src: str, pattern: str) -> List[int]:
indexes = []
i = safe_index(src, pattern)
@@ -121,43 +188,10 @@ def replace_at(src: str, pattern: str, indexes: List[int], remove: int) -> str:
return output
def place_line_breaks(breaks_positions: List[float], spaces_indexes: List[int]) -> List[int]:
breaks_positions = breaks_positions[:]
breaks_indexes = []
dist = sys.maxsize
for i, value in enumerate(spaces_indexes):
if not len(breaks_positions):
break
if dist < abs(value - breaks_positions[0]):
breaks_indexes += [spaces_indexes[i - 1]]
breaks_positions.pop(0)
else:
dist = abs(value - breaks_positions[0])
if len(breaks_positions):
breaks_indexes += [spaces_indexes[-1]]
return breaks_indexes
def safe_index(src: Union[str, list], pattern, start: int = 0):
try:
return src.index(pattern, start)
except ValueError:
return None
def read_argument(args: List[str], *names: str, valued: bool = False, delete: bool = False):
for i, arg in enumerate(args):
if arg.lower() in names:
if delete:
del args[i]
i -= 1
if not valued:
return True
else:
v = None
if i + 1 < len(args):
v = args[i + 1]
if delete:
del args[i + 1]
return v
return None
# endregion