Skip to content

Commit 64cdabc

Browse files
committed
Also show message if nothing was transferred.
1 parent 85badd5 commit 64cdabc

File tree

5 files changed

+84
-37
lines changed

5 files changed

+84
-37
lines changed

datashuttle/datashuttle_class.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,10 +1489,7 @@ def _transfer_entire_project(
14891489
i.e. every 'top level folder' (e.g. 'rawdata', 'derivatives').
14901490
See ``upload_custom()`` or ``download_custom()`` for parameters.
14911491
"""
1492-
all_errors: TransferErrors = {
1493-
"file_names": [],
1494-
"messages": [],
1495-
}
1492+
all_errors = rclone.get_empty_errors_dict()
14961493

14971494
for top_level_folder in canonical_folders.get_top_level_folders():
14981495
utils.log_and_message(
@@ -1513,6 +1510,10 @@ def _transfer_entire_project(
15131510
all_errors["file_names"] += errors["file_names"]
15141511
all_errors["messages"] += errors["messages"]
15151512

1513+
key = f"nothing_was_transferred_{top_level_folder}"
1514+
1515+
all_errors[key] = errors[key] # type: ignore
1516+
15161517
rclone.log_rclone_copy_errors_api(all_errors)
15171518

15181519
return all_errors

datashuttle/tui/screens/modal_dialogs.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,26 +242,42 @@ async def handle_transfer_and_update_ui_when_complete(self) -> None:
242242
if success:
243243
errors = output
244244

245+
errors_message = ""
246+
247+
messagebox_kwargs = {}
248+
249+
no_transfer_col = (
250+
"blue"
251+
if self.app.theme == "textual-light"
252+
else "lightblue"
253+
)
254+
255+
if errors["nothing_was_transferred_rawdata"] is True:
256+
errors_message += f"[{no_transfer_col}]\nNote! Nothing was transferred from rawdata[/{no_transfer_col}]\n"
257+
258+
if errors["nothing_was_transferred_derivatives"] is True:
259+
errors_message += f"[{no_transfer_col}]\nNote! Nothing was transferred from derivatives[/{no_transfer_col}]\n"
260+
245261
if any(errors["messages"]):
246262
if errors["file_names"]:
247-
errors_message = (
263+
errors_message += (
248264
"[red]Errors detected! in files:[/red]\n"
249265
)
250266
errors_message += "\n".join(errors["file_names"])
251267
else:
252-
errors_message = "[red]Errors detected![/red]"
268+
errors_message += "[red]Errors detected![/red]"
253269
errors_message += (
254270
"[red]\n\nThe error messages are:[/red]\n"
255271
)
256272
errors_message += "\n\n".join(errors["messages"])
257273
messagebox_kwargs = {"width": "75%", "height": "75%"}
258-
else:
259-
errors_message = "No errors detected"
260-
messagebox_kwargs = {}
274+
275+
if errors_message == "":
276+
errors_message += "No errors detected"
261277

262278
message = (
263-
f"Transfer finished.\n\n"
264-
f"{errors_message}\n\n"
279+
f"Transfer finished.\n"
280+
f"{errors_message}\n"
265281
f"Check the most recent logs for full details."
266282
)
267283

datashuttle/utils/custom_types.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1-
from typing import Any, Literal, Tuple
1+
from typing import Any, Literal, Tuple, TypeAlias, TypedDict
22

3-
DisplayMode = Literal["error", "warn", "print"]
3+
DisplayMode: TypeAlias = Literal["error", "warn", "print"]
44

5-
TopLevelFolder = Literal["rawdata", "derivatives"]
5+
TopLevelFolder: TypeAlias = Literal["rawdata", "derivatives"]
66

7-
OverwriteExistingFiles = Literal["never", "always", "if_source_newer"]
7+
OverwriteExistingFiles: TypeAlias = Literal[
8+
"never", "always", "if_source_newer"
9+
]
810

9-
Prefix = Literal["sub", "ses"]
11+
Prefix: TypeAlias = Literal["sub", "ses"]
1012

11-
InterfaceOutput = Tuple[bool, Any]
13+
InterfaceOutput: TypeAlias = Tuple[bool, Any]
1214

13-
ConnectionMethods = Literal[
15+
ConnectionMethods: TypeAlias = Literal[
1416
"ssh", "local_filesystem", "gdrive", "aws", "local_only"
1517
]
1618

17-
TransferErrors = dict[str, list[str]]
19+
20+
class TransferErrors(TypedDict):
21+
file_names: list[str]
22+
messages: list[str]
23+
nothing_was_transferred_rawdata: bool | None
24+
nothing_was_transferred_derivatives: bool | None

datashuttle/utils/data_transfer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ def run(self):
118118
else:
119119
utils.log_and_message("No files included. None transferred.")
120120
errors = rclone.get_empty_errors_dict()
121+
errors[f"nothing_was_transferred_{self.__top_level_folder}"] = True
121122

122123
return errors
123124

datashuttle/utils/rclone.py

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -489,19 +489,28 @@ def log_rclone_output_python_api(stdout, stderr):
489489

490490
def log_rclone_copy_errors_api(errors):
491491
""""""
492+
message = ""
493+
494+
if errors["nothing_was_transferred_rawdata"] is True:
495+
message += "\n\nNote! Nothing was transferred from rawdata!\n"
496+
497+
if errors["nothing_was_transferred_derivatives"] is True:
498+
message += "\n\nNote! Nothing was transferred from derivatives!\n"
499+
492500
if any(errors["messages"]):
493501
if any(errors["file_names"]):
494-
message = (
502+
message += (
495503
"\n\nErrors were detected! In files:"
496504
"\n-------------------------------\n"
497505
)
498506
message += "\n".join(errors["file_names"])
499507
else:
500-
message = "\n\n[red]Errors detected![/red]"
508+
message += "\n\n[red]Errors detected![/red]"
501509
message += "\n\nThe error messages are:\n-----------------------\n"
502510
message += "\n".join(errors["messages"])
503511
message += "\n"
504-
else:
512+
513+
if message == "":
505514
message = "No transfer errors were detected.\n"
506515

507516
utils.log_and_message(message, use_rich=True)
@@ -510,16 +519,23 @@ def log_rclone_copy_errors_api(errors):
510519
def parse_rclone_copy_output(top_level_folder, output):
511520
""""""
512521
stdout, out_errors = reformat_rclone_copy_output(
513-
output.stdout, capture_errors=True, top_level_folder=top_level_folder
522+
output.stdout, top_level_folder=top_level_folder
514523
)
515524

516525
stderr, err_errors = reformat_rclone_copy_output(
517-
output.stderr, capture_errors=True
526+
output.stderr, top_level_folder=top_level_folder
518527
)
519528

520529
all_errors = {
521-
"file_names": out_errors["file_names"] + err_errors["file_names"],
530+
"file_names": out_errors["file_names"]
531+
+ err_errors["file_names"], # TODO: this is so messy
522532
"messages": out_errors["messages"] + err_errors["messages"],
533+
"nothing_was_transferred_rawdata": err_errors[
534+
"nothing_was_transferred_rawdata"
535+
],
536+
"nothing_was_transferred_derivatives": err_errors[
537+
"nothing_was_transferred_derivatives"
538+
],
523539
}
524540

525541
all_errors["file_names"] = list(set(all_errors["file_names"]))
@@ -531,15 +547,16 @@ def get_empty_errors_dict() -> TransferErrors:
531547
return {
532548
"file_names": [],
533549
"messages": [],
550+
"nothing_was_transferred_rawdata": None,
551+
"nothing_was_transferred_derivatives": None,
534552
}
535553

536554

537555
def reformat_rclone_copy_output(
538556
stream: bytes,
539-
capture_errors: bool = False,
540557
top_level_folder: TopLevelFolder | None = None,
541558
) -> tuple[str, TransferErrors]:
542-
""""""
559+
""":return:"""
543560
split_stream = stream.decode("utf-8").split("\n")
544561

545562
errors = get_empty_errors_dict()
@@ -550,16 +567,21 @@ def reformat_rclone_copy_output(
550567
except json.JSONDecodeError:
551568
continue
552569

553-
if capture_errors:
554-
if line_json["level"] in ["error", "critical"]:
555-
if "object" in line_json:
556-
full_filepath = f"{top_level_folder}/{line_json['object']}"
557-
errors["file_names"].append(full_filepath)
558-
errors["messages"].append(
559-
f"The file {full_filepath} failed to transfer. Reason: {line_json['msg']}"
560-
)
561-
else:
562-
errors["messages"].append(f"ERROR : {line_json['msg']}")
570+
if line_json["level"] in ["error", "critical"]:
571+
if "object" in line_json:
572+
full_filepath = f"{top_level_folder}/{line_json['object']}"
573+
errors["file_names"].append(full_filepath)
574+
errors["messages"].append(
575+
f"The file {full_filepath} failed to transfer. Reason: {line_json['msg']}"
576+
)
577+
else:
578+
errors["messages"].append(f"ERROR : {line_json['msg']}")
579+
580+
elif "stats" in line_json and "totalTransfers" in line_json["stats"]:
581+
if line_json["stats"]["totalTransfers"] == 0:
582+
errors[f"nothing_was_transferred_{top_level_folder}"] = True # type:ignore
583+
else:
584+
errors[f"nothing_was_transferred_{top_level_folder}"] = False # type:ignore
563585

564586
split_stream[idx] = (
565587
f"{line_json['time'][:19]} {line_json['level'].upper()} : {line_json['msg']}"

0 commit comments

Comments
 (0)