Ver código fonte

Rückgabewerte mit Result-Objekten

gc-server3 1 semana atrás
pai
commit
fe74da96f5
6 arquivos alterados com 90 adições e 24 exclusões
  1. 14 2
      archive_logs.py
  2. 9 2
      clients.py
  3. 9 2
      files.py
  4. 16 10
      main.py
  5. 33 6
      move_files.py
  6. 9 2
      summary.py

+ 14 - 2
archive_logs.py

@@ -1,9 +1,17 @@
 import shutil
 import xml.etree.ElementTree as ET
+from dataclasses import dataclass
 from datetime import datetime, timedelta
 from pathlib import Path
 
 
+@dataclass(frozen=True)
+class ArchiveLogsResult:
+    checked_count: int
+    archived_count: int
+    skipped_count: int
+
+
 def find_xml_files(directory: Path) -> list[Path]:
     archive_directory = directory / "Archiv"
     return sorted(
@@ -59,7 +67,7 @@ def remove_empty_directories(directory: Path) -> int:
     return removed_count
 
 
-def run(directory: Path) -> tuple[int, int, int]:
+def run(directory: Path) -> ArchiveLogsResult:
     if not directory.is_dir():
         raise ValueError(f"Das Verzeichnis existiert nicht: {directory}")
 
@@ -83,4 +91,8 @@ def run(directory: Path) -> tuple[int, int, int]:
         archived_count += 1
 
     remove_empty_directories(directory)
-    return checked_count, archived_count, skipped_count
+    return ArchiveLogsResult(
+        checked_count=checked_count,
+        archived_count=archived_count,
+        skipped_count=skipped_count,
+    )

+ 9 - 2
clients.py

@@ -1,10 +1,17 @@
 import csv
 import re
 import xml.etree.ElementTree as ET
+from dataclasses import dataclass
 from datetime import datetime
 from pathlib import Path
 
 
+@dataclass(frozen=True)
+class ClientsResult:
+    xml_count: int
+    row_count: int
+
+
 def extract_clients(xml_path: Path) -> list[dict[str, str]]:
     root = ET.parse(xml_path).getroot()
     session = root.find("Session")
@@ -112,7 +119,7 @@ def find_xml_files(directory: Path) -> list[Path]:
     )
 
 
-def run(directory: Path, output: Path) -> tuple[int, int]:
+def run(directory: Path, output: Path) -> ClientsResult:
     if not directory.is_dir():
         raise ValueError(f"Das Verzeichnis existiert nicht: {directory}")
 
@@ -120,4 +127,4 @@ def run(directory: Path, output: Path) -> tuple[int, int]:
     new_rows = [row for xml_file in xml_files for row in extract_clients(xml_file)]
     rows = merge_clients(read_clients_csv(output), new_rows)
     write_clients_csv(rows, output)
-    return len(xml_files), len(rows)
+    return ClientsResult(xml_count=len(xml_files), row_count=len(rows))

+ 9 - 2
files.py

@@ -1,10 +1,17 @@
 import csv
 import os
 import xml.etree.ElementTree as ET
+from dataclasses import dataclass
 from datetime import datetime
 from pathlib import Path
 
 
+@dataclass(frozen=True)
+class FilesResult:
+    xml_count: int
+    row_count: int
+
+
 def find_xml_files(directory: Path) -> list[Path]:
     return sorted(
         path
@@ -98,7 +105,7 @@ def write_files_csv(rows: list[dict[str, str]], csv_path: Path) -> None:
         writer.writerows(rows)
 
 
-def run(directory: Path, output: Path, ignore_timestamp: bool = False) -> tuple[int, int]:
+def run(directory: Path, output: Path, ignore_timestamp: bool = False) -> FilesResult:
     if not directory.is_dir():
         raise ValueError(f"Das Verzeichnis existiert nicht: {directory}")
 
@@ -111,4 +118,4 @@ def run(directory: Path, output: Path, ignore_timestamp: bool = False) -> tuple[
         sorted(unique_rows.values(), key=lambda row: (row["ParticipantName"].casefold(), row["FilePath"].casefold())),
         output,
     )
-    return len(xml_files), len(unique_rows)
+    return FilesResult(xml_count=len(xml_files), row_count=len(unique_rows))

+ 16 - 10
main.py

@@ -34,10 +34,10 @@ def clients_command(
     """Importiert Client-Daten aus Session-XML-Dateien."""
     directory = directory or default_session_history()
     try:
-        xml_count, row_count = run(directory, output)
+        result = run(directory, output)
     except ValueError as error:
         raise typer.BadParameter(str(error), param_hint="directory") from error
-    typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} Einträge nach {output} geschrieben.")
+    typer.echo(f"{result.xml_count} XML-Dateien gelesen, {result.row_count} Einträge nach {output} geschrieben.")
 
 
 @app.command("files")
@@ -53,10 +53,12 @@ def files_command(
     """Importiert vorhandene Dateien aus ReceivedFile-Elementen."""
     directory = directory or default_session_history()
     try:
-        xml_count, row_count = run_files(directory, output, ignore_timestamp=ignore_timestamp)
+        result = run_files(directory, output, ignore_timestamp=ignore_timestamp)
     except ValueError as error:
         raise typer.BadParameter(str(error), param_hint="directory") from error
-    typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} vorhandene Dateien nach {output} geschrieben.")
+    typer.echo(
+        f"{result.xml_count} XML-Dateien gelesen, {result.row_count} vorhandene Dateien nach {output} geschrieben."
+    )
 
 
 @app.command("move-files")
@@ -76,7 +78,7 @@ def move_files_command(
     """Verschiebt gefundene Dateien in Desktop/PC-Visit/Kunde."""
     directory = directory or default_session_history()
     try:
-        _, _, moved_count, skipped_count, missing_client_count = refresh_and_move(
+        result = refresh_and_move(
             directory,
             files_csv,
             clients_csv,
@@ -86,7 +88,8 @@ def move_files_command(
     except ValueError as error:
         raise typer.BadParameter(str(error)) from error
     typer.echo(
-        f"{moved_count} Dateien verschoben, {skipped_count} übersprungen, " f"{missing_client_count} ohne Kunde."
+        f"{result.moved_count} Dateien verschoben, {result.skipped_count} übersprungen, "
+        f"{result.missing_client_count} ohne Kunde."
     )
 
 
@@ -97,10 +100,13 @@ def archive_logs_command(
     """Archiviert Session-XML-Dateien nach Jahr."""
     directory = directory or default_session_history()
     try:
-        checked_count, archived_count, skipped_count = run_archive_logs(directory)
+        result = run_archive_logs(directory)
     except ValueError as error:
         raise typer.BadParameter(str(error), param_hint="directory") from error
-    typer.echo(f"{checked_count} XML-Dateien geprüft, {archived_count} archiviert, " f"{skipped_count} übersprungen.")
+    typer.echo(
+        f"{result.checked_count} XML-Dateien geprüft, {result.archived_count} archiviert, "
+        f"{result.skipped_count} übersprungen."
+    )
 
 
 @app.command("summary")
@@ -111,10 +117,10 @@ def summary_command(
     """Erstellt eine Sitzungs- und Dauersumme pro Kunde."""
     directory = directory or default_session_history()
     try:
-        xml_count, customer_count = run_summary(directory, output)
+        result = run_summary(directory, output)
     except ValueError as error:
         raise typer.BadParameter(str(error), param_hint="directory") from error
-    typer.echo(f"{xml_count} XML-Dateien geprüft, {customer_count} Kunden nach {output} geschrieben.")
+    typer.echo(f"{result.xml_count} XML-Dateien geprüft, {result.customer_count} Kunden nach {output} geschrieben.")
 
 
 @app.command("watch")

+ 33 - 6
move_files.py

@@ -1,9 +1,26 @@
 import csv
 import os
 import shutil
+from dataclasses import dataclass
 from pathlib import Path
 
 
+@dataclass(frozen=True)
+class MoveFilesResult:
+    moved_count: int
+    skipped_count: int
+    missing_client_count: int
+
+
+@dataclass(frozen=True)
+class RefreshAndMoveResult:
+    xml_count: int
+    file_count: int
+    moved_count: int
+    skipped_count: int
+    missing_client_count: int
+
+
 def default_desktop() -> Path:
     user_profile = Path(os.environ.get("USERPROFILE", str(Path.home())))
     return user_profile / "Desktop"
@@ -21,7 +38,7 @@ def move_files(
     files_csv: Path,
     clients_csv: Path,
     desktop_directory: Path | None = None,
-) -> tuple[int, int, int]:
+) -> MoveFilesResult:
     desktop_directory = desktop_directory or default_desktop()
     client_rows = read_csv(clients_csv)
     client_names = {
@@ -54,7 +71,11 @@ def move_files(
         print(f"Datei verschoben: {source} -> {target}")
         moved_count += 1
 
-    return moved_count, skipped_count, missing_client_count
+    return MoveFilesResult(
+        moved_count=moved_count,
+        skipped_count=skipped_count,
+        missing_client_count=missing_client_count,
+    )
 
 
 def refresh_and_move(
@@ -63,9 +84,15 @@ def refresh_and_move(
     clients_csv: Path,
     desktop_directory: Path | None = None,
     ignore_timestamp: bool = False,
-) -> tuple[int, int, int, int, int]:
+) -> RefreshAndMoveResult:
     from files import run as run_files
 
-    xml_count, file_count = run_files(directory, files_csv, ignore_timestamp=ignore_timestamp)
-    moved_count, skipped_count, missing_client_count = move_files(files_csv, clients_csv, desktop_directory)
-    return xml_count, file_count, moved_count, skipped_count, missing_client_count
+    files_result = run_files(directory, files_csv, ignore_timestamp=ignore_timestamp)
+    move_result = move_files(files_csv, clients_csv, desktop_directory)
+    return RefreshAndMoveResult(
+        xml_count=files_result.xml_count,
+        file_count=files_result.row_count,
+        moved_count=move_result.moved_count,
+        skipped_count=move_result.skipped_count,
+        missing_client_count=move_result.missing_client_count,
+    )

+ 9 - 2
summary.py

@@ -1,12 +1,19 @@
 import csv
 import xml.etree.ElementTree as ET
 from collections import defaultdict
+from dataclasses import dataclass
 from decimal import Decimal, InvalidOperation
 from pathlib import Path
 
 from clients import calculate_customer, find_xml_files
 
 
+@dataclass(frozen=True)
+class SummaryResult:
+    xml_count: int
+    customer_count: int
+
+
 def extract_session(xml_path: Path) -> tuple[str, Decimal] | None:
     try:
         root = ET.parse(xml_path).getroot()
@@ -44,7 +51,7 @@ def format_duration(duration: Decimal) -> str:
     return value or "0"
 
 
-def run(directory: Path, output: Path) -> tuple[int, int]:
+def run(directory: Path, output: Path) -> SummaryResult:
     if not directory.is_dir():
         raise ValueError(f"Das Verzeichnis existiert nicht: {directory}")
 
@@ -68,4 +75,4 @@ def run(directory: Path, output: Path) -> tuple[int, int]:
         for customer, values in sorted(totals.items(), key=lambda item: item[0].casefold())
     ]
     write_summary(rows, output)
-    return checked_count, len(rows)
+    return SummaryResult(xml_count=checked_count, customer_count=len(rows))