Refactor: Code-Duplikation reduziert und Dead Code entfernt
- blake2b-Hash-Berechnung in zentrale Utility-Funktion extrahiert (src/utils.py) mit chunk-basiertem Hashing für bessere RAM-Effizienz - _transform_all_xml_files und _transform_all_xml_files_force zu einer Methode mit force-Parameter zusammengeführt - Project-Lookup-Methoden (getXsl, getJavaVm, etc.) über gemeinsame _lookup()-Hilfsmethode konsolidiert - Duplizierte XML-Sammel-Methoden entfernt, Set-basierte Duplikatsprüfung eingeführt - Ungenutzte Imports, Dead Code und wirkungslose Ausdrücke entfernt Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,9 +5,8 @@ Dieses Mixin enthält alle Methoden zur blake2b-Hash-Berechnung,
|
||||
XML-Datei-Zuordnung und Duplikatserkennung für das MainWindow.
|
||||
"""
|
||||
|
||||
import time
|
||||
import hashlib
|
||||
import shutil
|
||||
import time
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
@@ -17,6 +16,7 @@ from PySide6.QtWidgets import QMessageBox
|
||||
from conf import TreeNode, XslFile, XmlFile
|
||||
from ui.XmlToXslAssignDialog import XmlToXslAssignDialog
|
||||
from ui.threads import XmlHashCalculatorThread
|
||||
from utils import calculate_blake2b_hash
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -185,14 +185,14 @@ class HashCalculationMixin:
|
||||
nodes: Liste der zu durchsuchenden Nodes
|
||||
xml_files: Liste zum Sammeln der XML-Dateien
|
||||
"""
|
||||
seen_paths = {xf.xml for xf in xml_files}
|
||||
for node in nodes:
|
||||
if isinstance(node, XslFile) and node.xmls:
|
||||
# Füge alle XML-Dateien dieser XSL-Datei hinzu
|
||||
for xml_file in node.xmls:
|
||||
if xml_file not in xml_files: # Vermeide Duplikate
|
||||
if xml_file.xml not in seen_paths:
|
||||
xml_files.append(xml_file)
|
||||
seen_paths.add(xml_file.xml)
|
||||
elif isinstance(node, TreeNode) and node.children:
|
||||
# Rekursiv in Kinder-Nodes suchen
|
||||
self._collect_xml_files_recursive(node.children, xml_files)
|
||||
|
||||
def _on_hash_calculated(self, xml_file: XmlFile, hash_value: str):
|
||||
@@ -253,68 +253,22 @@ class HashCalculationMixin:
|
||||
logger.debug(f"Hash bereits vorhanden für {xml_file.xml}: {xml_file.hashsum}")
|
||||
return
|
||||
|
||||
# Prüfe ob Projekt verfügbar ist
|
||||
if not self.project or not self.project.project_dir:
|
||||
logger.warning("Kein Projekt-Verzeichnis für Hash-Berechnung verfügbar")
|
||||
return
|
||||
|
||||
xml_file_path = Path(self.project.project_dir) / xml_file.xml
|
||||
|
||||
if not xml_file_path.exists():
|
||||
logger.warning(f"XML-Datei nicht gefunden: {xml_file_path}")
|
||||
return
|
||||
|
||||
# Datei binär lesen und Hash berechnen
|
||||
with open(xml_file_path, "rb") as f:
|
||||
file_content = f.read()
|
||||
hash_obj = hashlib.blake2b(file_content)
|
||||
hash_hex = hash_obj.hexdigest()
|
||||
|
||||
# Hash mit Präfix setzen
|
||||
xml_file.hashsum = f"blake2b:{hash_hex}"
|
||||
logger.debug(f"Hash berechnet für {xml_file.xml}: {xml_file.hashsum}")
|
||||
hash_value = calculate_blake2b_hash(xml_file_path)
|
||||
if hash_value:
|
||||
xml_file.hashsum = hash_value
|
||||
logger.debug(f"Hash berechnet für {xml_file.xml}: {xml_file.hashsum}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Berechnen des Hash für {xml_file.xml}: {e}")
|
||||
|
||||
def _get_all_project_xml_files(self) -> List[XmlFile]:
|
||||
"""
|
||||
Sammelt alle XmlFile-Objekte aus dem gesamten Projekt für Hash-Vergleiche.
|
||||
|
||||
Returns:
|
||||
List[XmlFile]: Liste aller XML-Dateien im Projekt
|
||||
"""
|
||||
xml_files = []
|
||||
|
||||
try:
|
||||
if self.pdf_project and self.pdf_project.nodes:
|
||||
self._collect_xml_files_for_hash_comparison(self.pdf_project.nodes, xml_files)
|
||||
|
||||
logger.debug(f"Hash-Vergleich: {len(xml_files)} XML-Dateien im Projekt gefunden")
|
||||
return xml_files
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Sammeln der XML-Dateien für Hash-Vergleich: {e}")
|
||||
return []
|
||||
|
||||
def _collect_xml_files_for_hash_comparison(self, nodes, xml_files: List[XmlFile]):
|
||||
"""
|
||||
Sammelt rekursiv alle XML-Dateien aus den Nodes für Hash-Vergleiche.
|
||||
|
||||
Args:
|
||||
nodes: Liste der zu durchsuchenden Nodes
|
||||
xml_files: Liste zum Sammeln der XML-Dateien
|
||||
"""
|
||||
for node in nodes:
|
||||
if isinstance(node, XslFile) and node.xmls:
|
||||
# Füge alle XML-Dateien dieser XSL-Datei hinzu
|
||||
for xml_file in node.xmls:
|
||||
# Vermeide Duplikate basierend auf Pfad
|
||||
if not any(existing.xml == xml_file.xml for existing in xml_files):
|
||||
xml_files.append(xml_file)
|
||||
elif isinstance(node, TreeNode) and node.children:
|
||||
# Rekursiv in Kinder-Nodes suchen
|
||||
self._collect_xml_files_for_hash_comparison(node.children, xml_files)
|
||||
"""Sammelt alle XmlFile-Objekte aus dem gesamten Projekt."""
|
||||
return self._collect_all_xml_files()
|
||||
|
||||
def _find_xml_file_by_hash(self, target_hash: str) -> XmlFile | None:
|
||||
"""
|
||||
@@ -410,34 +364,8 @@ class HashCalculationMixin:
|
||||
return True # Im Zweifelsfall annehmen, dass der Name verwendet wird
|
||||
|
||||
def _calculate_hash_for_file(self, file_path: Path) -> str | None:
|
||||
"""
|
||||
Berechnet synchron den blake2b-Hash für eine Datei.
|
||||
|
||||
Args:
|
||||
file_path: Pfad zur Datei
|
||||
|
||||
Returns:
|
||||
str|None: Hash-Wert mit blake2b: Präfix oder None bei Fehler
|
||||
"""
|
||||
try:
|
||||
if not file_path.exists():
|
||||
logger.warning(f"Datei für Hash-Berechnung nicht gefunden: {file_path}")
|
||||
return None
|
||||
|
||||
# Datei binär lesen und Hash berechnen
|
||||
with open(file_path, "rb") as f:
|
||||
file_content = f.read()
|
||||
hash_obj = hashlib.blake2b(file_content)
|
||||
hash_hex = hash_obj.hexdigest()
|
||||
|
||||
# Hash mit Präfix zurückgeben
|
||||
hash_value = f"blake2b:{hash_hex}"
|
||||
logger.debug(f"Hash berechnet für {file_path}: {hash_value}")
|
||||
return hash_value
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Berechnen des Hash für {file_path}: {e}")
|
||||
return None
|
||||
"""Berechnet synchron den blake2b-Hash für eine Datei."""
|
||||
return calculate_blake2b_hash(file_path)
|
||||
|
||||
def _assign_existing_xml_to_nodes(self, existing_xml: XmlFile, selected_xsl_nodes: list):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user