Skip to content

Commit 2e7c763

Browse files
authored
Merge pull request #97 from Nautilus-Cyberneering/issue-96-rename-base-only-when-gold-is-renamed
Rename Base image only when Gold is renamed
2 parents 5631142 + cf214fd commit 2e7c763

File tree

9 files changed

+133
-36
lines changed

9 files changed

+133
-36
lines changed

src/nautilus_librarian/domain/file_locator.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ class FileNotFoundException(Exception):
1010

1111

1212
class BaseImageNotFoundError(FileNotFoundError):
13-
"""Raised when a base image does not exist"""
13+
"""Raised when a Base image does not exist"""
14+
15+
pass
16+
17+
18+
class ExpectedGoldImageError(Exception):
19+
"""Raised when a Gold image is expected"""
1420

1521
pass
1622

@@ -23,7 +29,10 @@ def get_base_image_filename_from_gold_image(gold_image: Filename) -> Filename:
2329
return gold_image.generate_base_image_filename()
2430

2531

26-
def get_base_image_absolute_path(git_repo_dir, gold_image):
32+
def get_base_image_absolute_path_from_gold(git_repo_dir, gold_image: Filename):
33+
if not gold_image.is_gold_image:
34+
raise ExpectedGoldImageError(f"Expected Gold image: {gold_image}")
35+
2736
corresponding_base_image = gold_image.generate_base_image_filename()
2837
corresponding_base_image_relative_path = (
2938
file_locator(corresponding_base_image) + "/" + str(corresponding_base_image)

src/nautilus_librarian/mods/dvc/domain/dvc_diff_parser.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def __init__(self, dvc_diff: dict) -> None:
88
self.added_list = None
99
self.deleted_list = None
1010
self.modified_list = None
11-
self.renamed_list = None
11+
1212
self.parse()
1313

1414
@staticmethod
@@ -68,24 +68,24 @@ def filter(
6868
exclude_renamed=False,
6969
only_basename=False,
7070
):
71-
files = []
71+
all_files = []
7272

7373
if not exclude_added:
74-
files = files + self.added_list
74+
all_files = all_files + self.added_list
7575

7676
if not exclude_deleted:
77-
files = files + self.deleted_list
77+
all_files = all_files + self.deleted_list
7878

7979
if not exclude_modified:
80-
files = files + self.modified_list
80+
all_files = all_files + self.modified_list
8181

8282
if only_basename:
83-
files = self.basenames_of(files)
83+
all_files = self.basenames_of(all_files)
8484

8585
if not exclude_renamed:
8686
if only_basename:
87-
files = files + self.basenames_of_old_and_new(self.renamed_list)
87+
all_files = all_files + self.basenames_of_old_and_new(self.renamed_list)
8888
else:
89-
files = files + self.renamed_list
89+
all_files = all_files + self.renamed_list
9090

91-
return files
91+
return all_files

src/nautilus_librarian/mods/dvc/domain/utils.py

+39-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
from nautilus_librarian.mods.dvc.domain.dvc_diff_parser import DvcDiffParser
2+
from nautilus_librarian.mods.namecodes.domain.filename_filters import (
3+
filter_media_library_files,
4+
)
5+
from nautilus_librarian.mods.namecodes.domain.validate_filenames import (
6+
is_a_library_file,
7+
)
28

9+
# TODO: move this file to app domain. DVC mod should be generic.
310

4-
def extract_added_and_modified_and_renamed_files_from_dvc_diff(
11+
12+
def extract_all_added_and_modified_and_renamed_files_from_dvc_diff(
513
dvc_diff_json, only_basename=True
614
):
715
"""
@@ -16,7 +24,18 @@ def extract_added_and_modified_and_renamed_files_from_dvc_diff(
1624
Output: ['data/000001/32/000001-32.600.2.tif']
1725
"""
1826
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
19-
return dvc_diff.filter(exclude_deleted=True, only_basename=only_basename)
27+
all_files = dvc_diff.filter(exclude_deleted=True, only_basename=only_basename)
28+
return all_files
29+
30+
31+
def extract_added_and_modified_and_renamed_files_from_dvc_diff(
32+
dvc_diff_json, only_basename=True
33+
):
34+
all_files = extract_all_added_and_modified_and_renamed_files_from_dvc_diff(
35+
dvc_diff_json, only_basename
36+
)
37+
files = filter_media_library_files(all_files)
38+
return files
2039

2140

2241
def extract_all_changed_files_from_dvc_diff(dvc_diff_json, only_basename=True):
@@ -32,7 +51,9 @@ def extract_all_changed_files_from_dvc_diff(dvc_diff_json, only_basename=True):
3251
Output: ['data/000001/32/000001-32.600.2.tif']
3352
"""
3453
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
35-
return dvc_diff.filter(only_basename=only_basename)
54+
all_files = dvc_diff.filter(only_basename=only_basename)
55+
files = filter_media_library_files(all_files)
56+
return files
3657

3758

3859
def extract_deleted_files_from_dvc_diff(dvc_diff_json, only_basename=True):
@@ -48,13 +69,15 @@ def extract_deleted_files_from_dvc_diff(dvc_diff_json, only_basename=True):
4869
Output: ['data/000001/32/000001-32.600.2.tif']
4970
"""
5071
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
51-
return dvc_diff.filter(
72+
all_files = dvc_diff.filter(
5273
exclude_added=True,
5374
exclude_modified=True,
5475
exclude_deleted=False,
5576
exclude_renamed=True,
5677
only_basename=only_basename,
5778
)
79+
files = filter_media_library_files(all_files)
80+
return files
5881

5982

6083
def extract_added_and_modified_files_from_dvc_diff(dvc_diff_json, only_basename=True):
@@ -70,9 +93,11 @@ def extract_added_and_modified_files_from_dvc_diff(dvc_diff_json, only_basename=
7093
Output: ['data/000001/32/000001-32.600.2.tif']
7194
"""
7295
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
73-
return dvc_diff.filter(
96+
all_files = dvc_diff.filter(
7497
exclude_deleted=True, exclude_renamed=True, only_basename=only_basename
7598
)
99+
files = filter_media_library_files(all_files)
100+
return files
76101

77102

78103
def extract_modified_files_from_dvc_diff(dvc_diff_json, only_basename=True):
@@ -88,12 +113,14 @@ def extract_modified_files_from_dvc_diff(dvc_diff_json, only_basename=True):
88113
Output: ['data/000001/32/000001-32.600.2.tif']
89114
"""
90115
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
91-
return dvc_diff.filter(
116+
all_files = dvc_diff.filter(
92117
exclude_added=True,
93118
exclude_deleted=True,
94119
exclude_renamed=True,
95120
only_basename=only_basename,
96121
)
122+
files = filter_media_library_files(all_files)
123+
return files
97124

98125

99126
def extract_renamed_files_from_dvc_diff(dvc_diff_json, only_basename=True):
@@ -125,14 +152,19 @@ def extract_renamed_files_from_dvc_diff(dvc_diff_json, only_basename=True):
125152
]
126153
"""
127154
dvc_diff = DvcDiffParser.from_json(dvc_diff_json)
128-
return dvc_diff.filter(
155+
all_files = dvc_diff.filter(
129156
exclude_added=True,
130157
exclude_modified=True,
131158
exclude_deleted=True,
132159
exclude_renamed=False,
133160
only_basename=only_basename,
134161
)
135162

163+
media_files = list(
164+
filter(lambda filename: is_a_library_file(filename["new"]), all_files)
165+
)
166+
return media_files
167+
136168

137169
def extract_list_of_media_file_changes_from_dvc_diff_output(
138170
dvc_diff, only_basename=True

src/nautilus_librarian/typer/commands/workflows/actions/delete_base_images_action.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
)
1212

1313

14-
def get_base_image_absolute_path(git_repo_dir, gold_image):
14+
def get_base_image_absolute_path_from_gold(git_repo_dir, gold_image):
1515
corresponding_base_image = gold_image.generate_base_image_filename()
1616
corresponding_base_image_relative_path = (
1717
file_locator(corresponding_base_image) + "/" + str(corresponding_base_image)
@@ -41,7 +41,9 @@ def delete_base_images(dvc_diff, git_repo_dir):
4141

4242
for filename in filenames:
4343
gold_filename = Filename(filename)
44-
base_filename = get_base_image_absolute_path(git_repo_dir, gold_filename)
44+
base_filename = get_base_image_absolute_path_from_gold(
45+
git_repo_dir, gold_filename
46+
)
4547
if path.exists(f"{base_filename}.dvc"):
4648
remove_base_pointer_and_file_if_exists(base_filename, dvc_services)
4749
messages.append(

src/nautilus_librarian/typer/commands/workflows/actions/rename_base_images_action.py

+18-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from nautilus_librarian.domain.dvc_services_api import DvcServicesApi
44
from nautilus_librarian.domain.file_locator import (
5-
get_base_image_absolute_path,
5+
get_base_image_absolute_path_from_gold,
66
guard_that_base_image_exists,
77
)
88
from nautilus_librarian.mods.dvc.domain.utils import extract_renamed_files_from_dvc_diff
@@ -23,23 +23,33 @@ def rename_base_images(dvc_diff, git_repo_dir):
2323
"""
2424
It renames previously generated base images when gold images are renamed
2525
"""
26-
filenames = extract_renamed_files_from_dvc_diff(dvc_diff, only_basename=False)
26+
all_renamed_files = extract_renamed_files_from_dvc_diff(
27+
dvc_diff, only_basename=False
28+
)
2729

28-
if dvc_diff == "{}" or filenames == []:
30+
# Filter Gold renamed images
31+
gold_renamed_images = list(
32+
filter(
33+
lambda filename: Filename(filename["old"]).is_gold_image(),
34+
all_renamed_files,
35+
)
36+
)
37+
38+
if dvc_diff == "{}" or gold_renamed_images == []:
2939
return ActionResult(
30-
ResultCode.CONTINUE, [Message("No Gold image renames found")]
40+
ResultCode.CONTINUE, [Message("No Gold renamed images found")]
3141
)
3242

3343
messages = []
3444

35-
for filename in filenames:
45+
for filename in gold_renamed_images:
3646
try:
3747
gold_filename_old = Filename(filename["old"])
38-
gold_filename_new = Filename(filename["new"])
39-
base_filename_old = get_base_image_absolute_path(
48+
base_filename_old = get_base_image_absolute_path_from_gold(
4049
git_repo_dir, gold_filename_old
4150
)
42-
base_filename_new = get_base_image_absolute_path(
51+
gold_filename_new = Filename(filename["new"])
52+
base_filename_new = get_base_image_absolute_path_from_gold(
4353
git_repo_dir, gold_filename_new
4454
)
4555
guard_that_base_image_exists(base_filename_old)

src/nautilus_librarian/typer/commands/workflows/actions/validate_filenames.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from nautilus_librarian.mods.dvc.domain.utils import (
2-
extract_list_of_media_file_changes_from_dvc_diff_output,
2+
extract_all_added_and_modified_and_renamed_files_from_dvc_diff,
33
get_new_filepath_if_is_a_renaming_dict,
44
)
55
from nautilus_librarian.mods.namecodes.domain.validate_filenames import (
@@ -15,12 +15,16 @@
1515

1616
def validate_filenames(dvc_diff):
1717
"""
18-
It validates all the media file names in the dvc diff.
18+
It validates all the filenames in the dvc diff.
1919
"""
2020
if dvc_diff == "{}":
21-
return ActionResult(ResultCode.EXIT, [Message("No Gold image changes found")])
21+
return ActionResult(
22+
ResultCode.EXIT, [Message("No filenames to validate, empty DVC diff")]
23+
)
2224

23-
filenames = extract_list_of_media_file_changes_from_dvc_diff_output(dvc_diff)
25+
# TODO: we have to review this function if we add files to DVC which do not belong to a media library.
26+
27+
filenames = extract_all_added_and_modified_and_renamed_files_from_dvc_diff(dvc_diff)
2428

2529
messages = []
2630

tests/test_nautilus_librarian/test_typer/test_commands/test_workflows/test_actions/test_check_images_changes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def given_a_diff_structure_with_changes_it_should_return_an_continue_result_code
3434
dvc_diff_with_added_gold_image = {
3535
"added": [],
3636
"deleted": [
37-
{"path": "path/to/image"},
37+
{"path": "data/000001/52/000001-52.600.2.tif"},
3838
],
3939
"modified": [],
4040
"renamed": [],

tests/test_nautilus_librarian/test_typer/test_commands/test_workflows/test_actions/test_rename_base_images_action.py

+41-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def copy_base_image_to_destination(sample_base_image_absolute_path, destination_
2121
)
2222

2323

24-
def given_a_diff_structure_with_renamed_gold_image_it_should_rename_base_images(
24+
def given_a_diff_structure_with_a_renamed_gold_image_it_should_rename_the_corresponding_base_image(
2525
sample_gold_image_absolute_path,
2626
sample_base_image_absolute_path,
2727
temp_git_dir,
@@ -69,3 +69,43 @@ def given_a_diff_structure_with_renamed_gold_image_it_should_rename_base_images(
6969
assert result.code == ResultCode.CONTINUE
7070
assert path.exists(f"{temp_git_dir}/data/000002/52/000002-52.600.2.tif")
7171
assert result.contains_text("successfully renamed to")
72+
73+
74+
def given_a_diff_structure_with_a_renamed_not_gold_image_it_should_not_rename_any_base_images(
75+
sample_gold_image_absolute_path,
76+
sample_base_image_absolute_path,
77+
temp_git_dir,
78+
temp_dvc_local_remote_storage_dir,
79+
temp_gpg_home_dir,
80+
git_user,
81+
):
82+
83+
dvc_diff_with_renamed_base_image = {
84+
"added": [],
85+
"deleted": [],
86+
"modified": [],
87+
"renamed": [
88+
{
89+
"path": {
90+
"old": "data/000001/52/000001-52.600.2.tif",
91+
"new": "data/000001/52/000002-52.600.2.tif",
92+
}
93+
},
94+
],
95+
}
96+
97+
create_initial_state(
98+
temp_git_dir,
99+
temp_dvc_local_remote_storage_dir,
100+
sample_gold_image_absolute_path,
101+
temp_gpg_home_dir,
102+
git_user,
103+
)
104+
105+
result = rename_base_images(
106+
compact_json(dvc_diff_with_renamed_base_image), temp_git_dir
107+
)
108+
109+
assert result.code == ResultCode.CONTINUE
110+
assert not path.exists(f"{temp_git_dir}/data/000002/52/000002-52.600.2.tif")
111+
assert not result.contains_text("successfully renamed to")

tests/test_nautilus_librarian/test_typer/test_commands/test_workflows/test_gold_images_processing.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def it_should_show_a_message_if_there_is_not_any_change_in_gold_images(
124124
},
125125
)
126126
assert result.exit_code == 0
127-
assert "No Gold image changes found" in result.stdout
127+
assert "No filenames to validate, empty DVC diff" in result.stdout
128128

129129

130130
def copy_media_file_to_its_folder(src_media_file_path, git_dir):
@@ -188,7 +188,7 @@ def test_gold_images_processing_workflow_command(
188188
✓ data/000001/32/000001-32.600.2.tif pulled from dvc storage
189189
✓ Dimensions of data/000001/32/000001-32.600.2.tif are 1740 x 1160
190190
✓ Base image of data/000001/32/000001-32.600.2.tif successfully generated
191-
No Gold image renames found
191+
No Gold renamed images found
192192
No Gold image deletions found
193193
New Gold image found: 000001-32.600.2.tif -> Base image: data/000001/52/000001-52.600.2.tif ✓
194194
"""

0 commit comments

Comments
 (0)