Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 32 additions & 22 deletions src/osekit/public/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -396,10 +396,13 @@ def run(
"""
if transform.name in self.transforms:
message = (
f"Output {transform.name} already exists. "
f"Please choose a different transform name, "
f"or delete the existing output with the "
f"Project.delete_output() method."
f"A transform with the name {transform.name} has already been run. "
f"Please do either one of the following:"
f"\n\t- Choose a different name for the current transform,"
f"\n\t- Rename the previously run transform with the "
f"``Project.rename_transform_with_outputs()`` method,"
f"\n\t- Delete the previously run transform with the "
f"``Project.delete_transform_with_outputs()`` method."
)
raise ValueError(message)

Expand Down Expand Up @@ -671,39 +674,46 @@ def get_output_by_transform_name(
if dataset_values["transform"] == transform_name
]

def rename_output(self, output_name: str, new_output_name: str) -> None:
"""Rename an already ran transform.
def rename_transform_with_outputs(
self,
transform_name: str,
new_transform_name: str,
) -> None:
"""Rename an already run transform.

All outputs of the transform will be renamed as if the tranform
had been originally ran with the ``new_transform_name`` name.

Parameters
----------
output_name: str
transform_name: str
Name of the transform to rename.
new_output_name: str
new_transform_name: str
New name of the transform to rename.

"""
if output_name == new_output_name:
if transform_name == new_transform_name:
return
if output_name == "original":
if transform_name == "original":
msg = "You can't rename the original dataset."
raise ValueError(msg)
if output_name not in self.outputs:
msg = f"Unknown output {output_name}."
if transform_name not in self.outputs:
msg = f"Unknown output {transform_name}."
raise ValueError(msg)
if new_output_name in self.outputs:
msg = f"{new_output_name} already exists."
if new_transform_name in self.outputs:
msg = f"{new_transform_name} already exists."
raise ValueError(msg)

keys_to_rename = {}
for output_dataset in self.outputs.values():
if output_dataset["transform"] == output_name:
output_dataset["transform"] = new_output_name
if output_dataset["transform"] == transform_name:
output_dataset["transform"] = new_transform_name
ds = output_dataset["dataset"]
old_name, new_name = (
ds.name,
new_output_name + (f"_{ds.suffix}" if ds.suffix else ""),
new_transform_name + (f"_{ds.suffix}" if ds.suffix else ""),
)
ds.base_name = new_output_name
ds.base_name = new_transform_name
old_folder = ds.folder
new_folder = ds.folder.parent / new_name
keys_to_rename[old_name] = new_name
Expand All @@ -722,20 +732,20 @@ def rename_output(self, output_name: str, new_output_name: str) -> None:

self.write_json()

def delete_output(self, output_name: str) -> None:
"""Delete all output datasets from a given ran transform name.
def delete_transform_with_outputs(self, transform_name: str) -> None:
"""Delete all output datasets from a given run transform name.

WARNING: all the output files will be deleted.


Parameters
----------
output_name: str
transform_name: str
Name of the transform whose output to delete.

"""
for dataset_to_delete in self.get_output_by_transform_name(
output_name,
transform_name,
):
self._delete_output(dataset_to_delete.name)

Expand Down
29 changes: 16 additions & 13 deletions tests/test_public_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1364,7 +1364,7 @@ def test_delete_output(

assert all(ds.folder.exists() for ds in (datasets_to_keep + datasets_to_delete))

project.delete_output(transform_to_delete.name)
project.delete_transform_with_outputs(transform_to_delete.name)

assert transform_to_keep.name in project.transforms
assert transform_to_delete.name not in project.transforms
Expand Down Expand Up @@ -1406,7 +1406,10 @@ def test_existing_output_warning(
),
)

with pytest.raises(ValueError, match="my_transform already exists"):
with pytest.raises(
ValueError,
match="A transform with the name my_transform has already been run",
):
project.run(
Transform(
output_type=OutputType.SPECTROGRAM,
Expand All @@ -1417,7 +1420,7 @@ def test_existing_output_warning(
),
)

project.delete_output("my_transform")
project.delete_transform_with_outputs("my_transform")

project.run(
Transform(
Expand Down Expand Up @@ -1455,7 +1458,7 @@ def test_rename_transform(

names = (first_name, second_name, second_name) # Tests both renaming and same name
for old, new in itertools.pairwise(names):
project.rename_output(old, new)
project.rename_transform_with_outputs(old, new)

if old != new:
assert old not in project.transforms
Expand All @@ -1482,23 +1485,23 @@ def test_rename_transform(

# RENAME ERRORS
with pytest.raises(ValueError, match=r"You can't rename the original dataset."):
project.rename_output(
output_name="original",
new_output_name="vampire",
project.rename_transform_with_outputs(
transform_name="original",
new_transform_name="vampire",
)

with pytest.raises(ValueError, match=r"original already exists."):
project.rename_output(
output_name=second_name,
new_output_name="original",
project.rename_transform_with_outputs(
transform_name=second_name,
new_transform_name="original",
)

unknown_name = "white"
target_name = "sky"
with pytest.raises(ValueError, match=f"Unknown output {unknown_name}."):
project.rename_output(
output_name=unknown_name,
new_output_name=target_name,
project.rename_transform_with_outputs(
transform_name=unknown_name,
new_transform_name=target_name,
)


Expand Down