Merged find_source_item() and get_full_path()

* Also fixed regex match (it wasn't matching the whole string)
This commit is contained in:
2Shirt 2019-04-07 23:26:22 -07:00
parent b6c6fc9aa9
commit 50cb765108
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C

View file

@ -6,37 +6,48 @@ from functions.common import *
def case_insensitive_search(path, item):
"""Search path for item case insensitively, returns str."""
regex_match = '^{}$'.format(item)
real_path = ''
# Quick check first
if os.path.exists('{}/{}'.format(path, item)):
# Easy mode
return '{}/{}'.format(path, item)
real_path = '{}{}{}'.format(
path,
'' if path == '/' else '/',
item,
)
# Check all items in dir
for entry in os.scandir(path):
if re.match(entry.name, item, re.IGNORECASE):
return '{}/{}'.format(path, entry.name)
if re.match(regex_match, entry.name, re.IGNORECASE):
real_path = '{}{}{}'.format(
path,
'' if path == '/' else '/',
entry.name,
)
# If we get here the item wasn't found
raise FileNotFoundError('{}/{}'.format(path, item))
# Done
if real_path:
return real_path
else:
raise FileNotFoundError('{}/{}'.format(path, item))
def find_source_item(source_dir, item):
"""Find item relative to source dir, returns str."""
path = source_dir
if item.startswith('/'):
item = item[1:]
def find_path(path):
"""Find path case-insensitively, returns pathlib.Path obj."""
parts = pathlib.Path(path).resolve().relative_to('/').parts
real_path = '/'
for part in item.split('/'):
path = case_insensitive_search(path, part)
# Fix case
for part in parts:
real_path = case_insensitive_search(real_path, part)
return path
def get_full_path(item):
"""Get full path to item, returns pathlib.Path obj."""
path_obj = pathlib.Path(item).resolve()
# Raise error if path doesn't exist
path_obj = pathlib.Path(real_path)
if not path_obj.exists():
raise FileNotFoundError(path_obj)
# Done
return path_obj