Skip to content

Commit

Permalink
Merge pull request #25 from brainglobe/brainmapper-refactor
Browse files Browse the repository at this point in the history
Add misc functionality from brainmapper
  • Loading branch information
alessandrofelder authored Jan 16, 2024
2 parents d3a1a5f + 4ad9f79 commit 4b4f350
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 1 deletion.
51 changes: 51 additions & 0 deletions brainglobe_utils/general/list.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from natsort import natsorted


def remove_empty_string(str_list):
"""
Removes any empty strings from a list of strings
Expand All @@ -10,3 +13,51 @@ def remove_empty_string(str_list):
def unique_elements_lists(list_in):
"""return the unique elements in a list"""
return list(dict.fromkeys(list_in))


def check_unique_list(in_list, natural_sort=True):
"""
Checks if all the items in a list are unique or not
:param list in_list: Input list
:param bool natural_sort: Sort the resulting items naturally
(default: True)
:return: True/False and a list of any repeated values
"""
unique = set(in_list)
repeated_items = []

for item in unique:
count = in_list.count(item)
if count > 1:
repeated_items.append(item)

if repeated_items:
if natural_sort:
repeated_items = natsorted(repeated_items)
return False, repeated_items
else:
return True, []


def common_member(a, b, natural_sort=True):
"""
Checks if two lists (or sets) have a common member, and if so, returns
the common members.
:param a: First list (or set)
:param b: Second list (or set)
:param bool natural_sort: Sort the resulting items naturally
(default: True)
:return: True/False and the list of values
"""
a_set = set(a)
b_set = set(b)
intersection = list(a_set.intersection(b_set))
if len(intersection) > 0:
result = True
else:
result = False

if natural_sort:
intersection = natsorted(intersection)

return result, intersection
30 changes: 30 additions & 0 deletions brainglobe_utils/general/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from slurmio import slurmio
from tqdm import tqdm

from brainglobe_utils.general.exceptions import CommandLineInputError
from brainglobe_utils.general.string import get_text_lines

# On Windows, max_workers must be less than or equal to 61
Expand Down Expand Up @@ -349,3 +350,32 @@ def delete_directory_contents(directory, progress=False):
else:
for f in files:
os.remove(os.path.join(directory, f))


def check_path_exists(file):
"""
Returns True is a file exists, otherwise throws a FileNotFoundError
:param file: Input file
:return: True, if the file exists
"""
file = Path(file)
if file.exists():
return True
else:
raise FileNotFoundError


def catch_input_file_error(path):
"""
Catches if an input path doesn't exist, and returns an informative error
:param path: Input file path
default)
"""
try:
check_path_exists(path)
except FileNotFoundError:
message = (
"File path: '{}' cannot be found. Please check your input "
"arguments.".format(path)
)
raise CommandLineInputError(message)
16 changes: 15 additions & 1 deletion tests/tests/test_general/test_list.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from brainglobe_utils.general import list as list_tools

list_with_empty = ["test1", "test 2", " ", "", "test4", ""]
a = [1, "a", 10, 30]
b = [30, 10, "c", "d"]


list_with_empty = ["test1", "test 2", " ", "", "test4", ""]
list_without_empty = ["test1", "test 2", " ", "test4"]


Expand All @@ -15,3 +18,14 @@ def test_unique_elements_list():
list_in = [1, 2, 2, "a", "b", 1, "a", "dog"]
unique_list = [1, 2, "a", "b", "dog"]
assert list_tools.unique_elements_lists(list_in) == unique_list


def test_check_unique_list():
a = [1, "a", 10, 30]
assert (True, []) == list_tools.check_unique_list(a)
repeating_list = [1, 2, 3, 3, "dog", "cat", "dog"]
assert (False, [3, "dog"]) == list_tools.check_unique_list(repeating_list)


def test_common_member():
assert (True, [10, 30]) == list_tools.common_member(a, b)
31 changes: 31 additions & 0 deletions tests/tests/test_general/test_system.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import pytest

from brainglobe_utils.general import system
from brainglobe_utils.general.exceptions import CommandLineInputError
from brainglobe_utils.general.string import get_text_lines

data_dir = Path("tests", "data")
Expand Down Expand Up @@ -326,3 +327,33 @@ def test_delete_directory_contents(tmp_path):

system.delete_directory_contents(delete_dir, progress=False)
assert os.listdir(delete_dir) == []


def write_file_single_size(directory, file_size):
with open(os.path.join(directory, str(file_size)), "wb") as fout:
fout.write(os.urandom(file_size))


def test_check_path_exists(tmpdir):
num = 10
tmpdir = str(tmpdir)

assert system.check_path_exists(os.path.join(tmpdir))
no_exist_dir = os.path.join(tmpdir, "i_dont_exist")
with pytest.raises(FileNotFoundError):
assert system.check_path_exists(no_exist_dir)

write_file_single_size(tmpdir, num)
assert system.check_path_exists(os.path.join(tmpdir, str(num)))
with pytest.raises(FileNotFoundError):
assert system.check_path_exists(os.path.join(tmpdir, "20"))


def test_catch_input_file_error(tmpdir):
tmpdir = str(tmpdir)
# check no error is raised:
system.catch_input_file_error(tmpdir)

no_exist_dir = os.path.join(tmpdir, "i_dont_exist")
with pytest.raises(CommandLineInputError):
system.catch_input_file_error(no_exist_dir)

0 comments on commit 4b4f350

Please sign in to comment.