Split up ScanDirectory._find_files into seperate functions
This commit is contained in:
parent
254305a7a5
commit
7295b86cf6
2 changed files with 53 additions and 42 deletions
|
|
@ -5,7 +5,7 @@ Currently it handles scan getting information from a information from a scan dir
|
||||||
eventually is should handle all the file system operation for smart_scan.
|
eventually is should handle all the file system operation for smart_scan.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from typing import Optional, Literal
|
from typing import Optional
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
|
@ -254,40 +254,40 @@ class ScanDirectory:
|
||||||
return []
|
return []
|
||||||
return os.listdir(self.images_dir)
|
return os.listdir(self.images_dir)
|
||||||
|
|
||||||
def _find_files(
|
def _extract_scan_images(self, file_list: list[str]):
|
||||||
self, file_types=Literal["all", "scan_images", "stitches", "dzi"]
|
"""Extract files which match the naming convention for scan images
|
||||||
) -> tuple[list[str], list[str], list[str]] | list[str]:
|
|
||||||
folder_contents = self.get_scan_files()
|
|
||||||
|
|
||||||
# Return empty lists if no folder contents.
|
:param file_list: The list of files to search. Normally this would be
|
||||||
if not folder_contents:
|
`self.get_scan_files()`
|
||||||
if file_types == "all":
|
|
||||||
return [], [], []
|
|
||||||
return []
|
|
||||||
|
|
||||||
if file_types in ["all", "scan_images"]:
|
:returns: The list of files that match the naming convention for scan images
|
||||||
scan_images = [i for i in folder_contents if IMAGE_REGEX.search(i)]
|
"""
|
||||||
if file_types == "scan_images":
|
return [i for i in file_list if IMAGE_REGEX.search(i)]
|
||||||
return scan_images
|
|
||||||
|
|
||||||
if file_types in ["all", "stitches"]:
|
def _extract_final_stitches(self, file_list: list[str]):
|
||||||
stitches = [i for i in folder_contents if STITCH_REGEX.search(i)]
|
"""Extract files which match the naming convention for final stitches
|
||||||
if file_types == "stitches":
|
|
||||||
return stitches
|
|
||||||
|
|
||||||
if file_types in ["all", "dzi"]:
|
:param file_list: The list of files to search.
|
||||||
dzi_files = [i for i in folder_contents if i.endswith("dzi")]
|
|
||||||
if file_types == "dzi":
|
|
||||||
return dzi_files
|
|
||||||
|
|
||||||
return scan_images, stitches, dzi_files
|
:returns: The list of files that match the naming convention for final stitches
|
||||||
|
"""
|
||||||
|
return [i for i in file_list if STITCH_REGEX.search(i)]
|
||||||
|
|
||||||
|
def _extract_dzi_files(self, file_list: list[str]):
|
||||||
|
"""Extract files which match the naming convention for dzi_files
|
||||||
|
|
||||||
|
:param file_list: The list of files to search.
|
||||||
|
|
||||||
|
:returns: The list of files that match the naming convention for dzi_files
|
||||||
|
"""
|
||||||
|
return [i for i in file_list if i.endswith("dzi")]
|
||||||
|
|
||||||
def get_final_stitch_name(self) -> Optional[str]:
|
def get_final_stitch_name(self) -> Optional[str]:
|
||||||
"""Return the filename for the final stitch (in the images dir)
|
"""Return the filename for the final stitch (in the images dir)
|
||||||
|
|
||||||
If no final stitch is found, return None
|
If no final stitch is found, return None
|
||||||
"""
|
"""
|
||||||
stitches = self._find_files("stitches")
|
stitches = self._extract_final_stitches(self.get_scan_files())
|
||||||
if not stitches:
|
if not stitches:
|
||||||
return None
|
return None
|
||||||
return stitches[0]
|
return stitches[0]
|
||||||
|
|
@ -299,7 +299,10 @@ class ScanDirectory:
|
||||||
def scan_info(self) -> ScanInfo:
|
def scan_info(self) -> ScanInfo:
|
||||||
"""Return the information for the scan directory as a ScanInfo object"""
|
"""Return the information for the scan directory as a ScanInfo object"""
|
||||||
|
|
||||||
scan_images, stitches, dzi_files = self._find_files("all")
|
scan_files = self.get_scan_files()
|
||||||
|
scan_images = self._extract_scan_images(scan_files)
|
||||||
|
stitches = self._extract_final_stitches(scan_files)
|
||||||
|
dzi_files = self._extract_dzi_files(scan_files)
|
||||||
number_of_images = len(scan_images)
|
number_of_images = len(scan_images)
|
||||||
stitch_available = len(stitches) > 0
|
stitch_available = len(stitches) > 0
|
||||||
dzi = None if not dzi_files else str(dzi_files[0])
|
dzi = None if not dzi_files else str(dzi_files[0])
|
||||||
|
|
@ -349,7 +352,8 @@ class ScanDirectory:
|
||||||
zip_files = []
|
zip_files = []
|
||||||
|
|
||||||
# For each `filename.dzi` we need to skip the `filename_files` directory
|
# For each `filename.dzi` we need to skip the `filename_files` directory
|
||||||
dzi_dirs = [dzi[:-4] + "_files" for dzi in self._find_files("dzi")]
|
dzi_files = self._extract_dzi_files(self.get_scan_files())
|
||||||
|
dzi_dirs = [dzi[:-4] + "_files" for dzi in dzi_files]
|
||||||
|
|
||||||
with zipfile.ZipFile(zip_fname, mode="a") as scan_zip:
|
with zipfile.ZipFile(zip_fname, mode="a") as scan_zip:
|
||||||
for file in self.all_files(skip_dirs=dzi_dirs):
|
for file in self.all_files(skip_dirs=dzi_dirs):
|
||||||
|
|
|
||||||
|
|
@ -401,7 +401,7 @@ def test_none_returned_for_missing_images_dir():
|
||||||
assert scan_dir.get_scan_files() == []
|
assert scan_dir.get_scan_files() == []
|
||||||
|
|
||||||
|
|
||||||
def test_find_files():
|
def test_extracting_files():
|
||||||
"""Test the private _find_files method of ScanDirectories
|
"""Test the private _find_files method of ScanDirectories
|
||||||
|
|
||||||
Add files to directory and check expected returns.
|
Add files to directory and check expected returns.
|
||||||
|
|
@ -410,34 +410,41 @@ def test_find_files():
|
||||||
os.makedirs(os.path.join(BASE_SCAN_DIR, "fake_scan_0001", "images"))
|
os.makedirs(os.path.join(BASE_SCAN_DIR, "fake_scan_0001", "images"))
|
||||||
scan_dir = ScanDirectory("fake_scan_0001", BASE_SCAN_DIR)
|
scan_dir = ScanDirectory("fake_scan_0001", BASE_SCAN_DIR)
|
||||||
|
|
||||||
# For an empty directory, "all" is 3 empty lists
|
# Starting all lists should be empty
|
||||||
assert scan_dir._find_files("all") == ([], [], [])
|
scan_files = scan_dir.get_scan_files()
|
||||||
# Other options are 1 empty list.
|
assert scan_dir._extract_scan_images(scan_files) == []
|
||||||
for file_type in ["scan_images", "stitches", "dzi"]:
|
assert scan_dir._extract_final_stitches(scan_files) == []
|
||||||
assert scan_dir._find_files(file_type) == []
|
assert scan_dir._extract_dzi_files(scan_files) == []
|
||||||
|
|
||||||
# Add a number of images
|
# Add a number of images
|
||||||
for i in range(2321):
|
for i in range(2321):
|
||||||
_add_fake_image(scan_dir)
|
_add_fake_image(scan_dir)
|
||||||
|
|
||||||
assert len(set(scan_dir._find_files("scan_images"))) == 2321
|
scan_files = scan_dir.get_scan_files()
|
||||||
assert len(set(scan_dir._find_files("stitches"))) == 0
|
assert len(set(scan_dir._extract_scan_images(scan_files))) == 2321
|
||||||
assert len(set(scan_dir._find_files("dzi"))) == 0
|
assert len(set(scan_dir._extract_final_stitches(scan_files))) == 0
|
||||||
|
assert len(set(scan_dir._extract_dzi_files(scan_files))) == 0
|
||||||
|
|
||||||
# Add and a stitched image
|
# Add and a stitched image
|
||||||
_add_fake_file(scan_dir, "fake_scan_0001_stitched.jpg", in_im_dir=True)
|
_add_fake_file(scan_dir, "fake_scan_0001_stitched.jpg", in_im_dir=True)
|
||||||
|
|
||||||
assert len(set(scan_dir._find_files("scan_images"))) == 2321
|
scan_files = scan_dir.get_scan_files()
|
||||||
assert len(set(scan_dir._find_files("stitches"))) == 1
|
assert len(set(scan_dir._extract_scan_images(scan_files))) == 2321
|
||||||
assert len(set(scan_dir._find_files("dzi"))) == 0
|
assert len(set(scan_dir._extract_final_stitches(scan_files))) == 1
|
||||||
|
assert len(set(scan_dir._extract_dzi_files(scan_files))) == 0
|
||||||
|
|
||||||
_make_fake_dzi(scan_dir)
|
_make_fake_dzi(scan_dir)
|
||||||
|
|
||||||
assert len(set(scan_dir._find_files("scan_images"))) == 2321
|
# check totals are still correct after adding a dzi with lots of tiles.
|
||||||
assert len(set(scan_dir._find_files("stitches"))) == 1
|
scan_files = scan_dir.get_scan_files()
|
||||||
assert len(set(scan_dir._find_files("dzi"))) == 1
|
scan_images = scan_dir._extract_scan_images(scan_files)
|
||||||
|
stitches = scan_dir._extract_final_stitches(scan_files)
|
||||||
|
dzi_files = scan_dir._extract_dzi_files(scan_files)
|
||||||
|
assert len(set(scan_images)) == 2321
|
||||||
|
assert len(set(stitches)) == 1
|
||||||
|
assert len(set(dzi_files)) == 1
|
||||||
|
|
||||||
_, stitches, dzi_files = scan_dir._find_files("all")
|
# And check the names are as expected
|
||||||
assert stitches[0] == "fake_scan_0001_stitched.jpg"
|
assert stitches[0] == "fake_scan_0001_stitched.jpg"
|
||||||
assert dzi_files[0] == "fake_scan_0001.dzi"
|
assert dzi_files[0] == "fake_scan_0001.dzi"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue