From 5514653b945a603b11667ed3456d7d13fa393429 Mon Sep 17 00:00:00 2001 From: jack Date: Thu, 18 Jun 2026 17:09:24 -0700 Subject: [PATCH] refactor: prune orphaned attic modules and standardize project configurations - Move orphaned modules (data_segment.py, contour_models.py, marching_squares.py) to attic/. - Standardize local settings logic, serial port parameters, and graph view plots. - Update pyproject.toml pyside6-project dependencies and configure gitignore. --- .gitignore | 3 +++ pyproject.toml | 10 +++++--- src/pygui/ISC/Tabs/SettingsTab.qml | 4 ++-- src/pygui/backend/__init__.py | 2 -- .../contour_models.py | 0 .../backend/{data => attic}/data_segment.py | 0 .../marching_squares.py | 2 +- src/pygui/backend/data/__init__.py | 2 -- src/pygui/backend/data/local_settings.py | 8 +++++-- .../backend/data/local_settings_model.py | 24 ------------------- src/pygui/backend/visualization/__init__.py | 2 -- src/pygui/backend/visualization/graph_view.py | 7 ++---- src/pygui/backend/wafer/zwafer_parser.py | 5 ++-- src/pygui/serialcomm/serial_port.py | 1 - 14 files changed, 23 insertions(+), 47 deletions(-) rename src/pygui/backend/{visualization => attic}/contour_models.py (100%) rename src/pygui/backend/{data => attic}/data_segment.py (100%) rename src/pygui/backend/{visualization => attic}/marching_squares.py (98%) diff --git a/.gitignore b/.gitignore index 0835d53..82f901b 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ dist/ *.ico # Superpowers brainstorming visual companion .superpowers/ +.llm-wiki/ +.agents/ +.pi/ diff --git a/pyproject.toml b/pyproject.toml index 5e096b1..76ef0c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ files = [ "src/pygui/ISC/Tabs/qmldir", "src/pygui/__main__.py", "src/pygui/backend/contour_models.py", - "src/pygui/backend/crypto_helper.py", + "src/pygui/backend/crypto/crypto_helper.py", "src/pygui/backend/csv_file_metadata.py", "src/pygui/backend/data_model.py", "src/pygui/backend/data_segment.py", @@ -103,7 +103,7 @@ environments = [ # ===== Ruff Linter and Formatter ===== [tool.ruff] target-version = "py311" -line-length = 100 +line-length = 125 [tool.ruff.lint] select = [ @@ -113,7 +113,11 @@ select = [ "I", # isort (import sorting) "N", # pep8-naming ] -ignore = [] +ignore = [ + "N802", # Function name should be lowercase (standard for Qt Slots and Properties) + "N815", # Class attribute should not be mixedCase (standard for Qt Properties and Signals) + "E702", # Multiple statements on one line (semicolon, standard for inline Qt property setters with self.update()) +] # ===== Mypy Static Type Checker ===== [tool.mypy] diff --git a/src/pygui/ISC/Tabs/SettingsTab.qml b/src/pygui/ISC/Tabs/SettingsTab.qml index c05658b..cef4045 100644 --- a/src/pygui/ISC/Tabs/SettingsTab.qml +++ b/src/pygui/ISC/Tabs/SettingsTab.qml @@ -225,7 +225,7 @@ Item { Layout.preferredWidth: 90 Layout.preferredHeight: Theme.settingsButtonHeight onClicked: { - settingsModel.setChamberId(chamberField.text); + settingsModel.ChamberId = chamberField.text; settingsModel.saveSettings(); } } @@ -296,7 +296,7 @@ Item { SettingsToggle { text: "Reverse Z Wafer" checked: settingsModel.reverseZWafer - onToggled: settingsModel.setReverseZWafer(checked) + onToggled: settingsModel.reverseZWafer = checked } } } diff --git a/src/pygui/backend/__init__.py b/src/pygui/backend/__init__.py index caeecd1..7263803 100644 --- a/src/pygui/backend/__init__.py +++ b/src/pygui/backend/__init__.py @@ -7,7 +7,6 @@ from pygui.backend.controllers.session_controller import SessionController # no from pygui.backend.data.csv_file_metadata import CSVFileMetadata # noqa: F401 from pygui.backend.data.csv_recorder import CsvRecorder # noqa: F401 from pygui.backend.data.data_records import read_data_records # noqa: F401 -from pygui.backend.data.data_segment import DataSegment # noqa: F401 from pygui.backend.data.file_browser import FileBrowser # noqa: F401 from pygui.backend.data.local_settings import LocalSettings # noqa: F401 from pygui.backend.data.local_settings_model import LocalSettingsModel # noqa: F401 @@ -19,7 +18,6 @@ from pygui.backend.models.sensor_editor import SensorEditor # noqa: F401 from pygui.backend.models.session_model import SessionModel # noqa: F401 from pygui.backend.models.stability_detector import StabilityDetector # noqa: F401 from pygui.backend.models.threshold_classifier import ThresholdConfig # noqa: F401 -from pygui.backend.visualization.contour_models import ContourLine, ContourSegment # noqa: F401 from pygui.backend.visualization.graph_view import GraphView # noqa: F401 from pygui.backend.visualization.rbf_heatmap import interpolate_field # noqa: F401 from pygui.backend.visualization.wafer_map_item import WaferMapItem # noqa: F401 diff --git a/src/pygui/backend/visualization/contour_models.py b/src/pygui/backend/attic/contour_models.py similarity index 100% rename from src/pygui/backend/visualization/contour_models.py rename to src/pygui/backend/attic/contour_models.py diff --git a/src/pygui/backend/data/data_segment.py b/src/pygui/backend/attic/data_segment.py similarity index 100% rename from src/pygui/backend/data/data_segment.py rename to src/pygui/backend/attic/data_segment.py diff --git a/src/pygui/backend/visualization/marching_squares.py b/src/pygui/backend/attic/marching_squares.py similarity index 98% rename from src/pygui/backend/visualization/marching_squares.py rename to src/pygui/backend/attic/marching_squares.py index 9f4f575..3850ee7 100644 --- a/src/pygui/backend/visualization/marching_squares.py +++ b/src/pygui/backend/attic/marching_squares.py @@ -2,7 +2,7 @@ from typing import List, Optional, Tuple import numpy as np -from pygui.backend.visualization.contour_models import ContourLine, ContourSegment +from pygui.backend.attic.contour_models import ContourLine, ContourSegment # ===== Contour Generation ===== diff --git a/src/pygui/backend/data/__init__.py b/src/pygui/backend/data/__init__.py index 57ffb11..cb7dcd1 100644 --- a/src/pygui/backend/data/__init__.py +++ b/src/pygui/backend/data/__init__.py @@ -2,7 +2,6 @@ from pygui.backend.data.csv_file_metadata import CSVFileMetadata from pygui.backend.data.csv_recorder import CsvRecorder from pygui.backend.data.data_records import is_official_csv, read_data_records, read_official_csv -from pygui.backend.data.data_segment import DataSegment from pygui.backend.data.file_browser import FileBrowser from pygui.backend.data.local_settings import LocalSettings from pygui.backend.data.local_settings_model import LocalSettingsModel @@ -10,7 +9,6 @@ from pygui.backend.data.local_settings_model import LocalSettingsModel __all__ = [ "CsvRecorder", "CSVFileMetadata", "read_data_records", "is_official_csv", "read_official_csv", - "DataSegment", "FileBrowser", "LocalSettings", "LocalSettingsModel", ] diff --git a/src/pygui/backend/data/local_settings.py b/src/pygui/backend/data/local_settings.py index 640d2b1..c771122 100644 --- a/src/pygui/backend/data/local_settings.py +++ b/src/pygui/backend/data/local_settings.py @@ -1,7 +1,10 @@ import json +import logging import os from pathlib import Path +log = logging.getLogger(__name__) + # ===== Settings Persistence Model ===== class LocalSettings: @@ -51,7 +54,8 @@ class LocalSettings: if hasattr(settings, key): setattr(settings, key, value) except Exception as e: - print(f"Error reading setting file: {e}") + log = logging.getLogger(__name__) + log.warning("Error reading setting file: %s",e) return settings @@ -66,7 +70,7 @@ class LocalSettings: with open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) except Exception as e: - print(f"Error saving settings: {e}") + log.exception("Error saving settings: %s",e) # ===== Master File Helpers ===== @classmethod diff --git a/src/pygui/backend/data/local_settings_model.py b/src/pygui/backend/data/local_settings_model.py index 267dbc7..50a035b 100644 --- a/src/pygui/backend/data/local_settings_model.py +++ b/src/pygui/backend/data/local_settings_model.py @@ -334,27 +334,3 @@ class LocalSettingsModel(QObject): @Slot(str) def clearMaster(self, family: str) -> None: self.setMaster(family, "") - - @Slot(str) - def setChamberId(self, value: str) -> None: - self.chamberId = value - - @Slot(bool) - def setReverseZWafer(self, value: bool) -> None: - self.reverseZWafer = value - - @Slot(bool) - def setDebugMode(self, value: bool) -> None: - self.debugMode = value - - @Slot(int) - def setWaferReadTimeout(self, value: int) -> None: - self.waferReadTimeout = value - - @Slot(int) - def setWaferDetectTimeout(self, value: int) -> None: - self.waferDetectTimeout = value - - @Slot(int) - def setWaferRetries(self, value: int) -> None: - self.waferRetries = value diff --git a/src/pygui/backend/visualization/__init__.py b/src/pygui/backend/visualization/__init__.py index fa00f59..cccec23 100644 --- a/src/pygui/backend/visualization/__init__.py +++ b/src/pygui/backend/visualization/__init__.py @@ -1,5 +1,4 @@ # ===== Visualization Sub-package ===== -from pygui.backend.visualization.contour_models import ContourLine, ContourSegment from pygui.backend.visualization.graph_view import GraphView from pygui.backend.visualization.rbf_heatmap import interpolate_field from pygui.backend.visualization.wafer_map_item import WaferMapItem @@ -7,5 +6,4 @@ from pygui.backend.visualization.wafer_map_item import WaferMapItem __all__ = [ "WaferMapItem", "GraphView", "interpolate_field", - "ContourLine", "ContourSegment", ] diff --git a/src/pygui/backend/visualization/graph_view.py b/src/pygui/backend/visualization/graph_view.py index 46c6678..1a3d7ba 100644 --- a/src/pygui/backend/visualization/graph_view.py +++ b/src/pygui/backend/visualization/graph_view.py @@ -9,16 +9,13 @@ from __future__ import annotations import logging from typing import Any, Optional +import pyqtgraph as pg +from pyqtgraph import PlotWidget from PySide6.QtCore import Property, QObject, Signal, Slot from PySide6.QtWidgets import QWidget log = logging.getLogger(__name__) -# Import pyqtgraph after Qt is initialized -import pyqtgraph as pg -from pyqtgraph import PlotWidget - - class GraphView(QObject): """QML-exposed controller for a pyqtgraph line chart. diff --git a/src/pygui/backend/wafer/zwafer_parser.py b/src/pygui/backend/wafer/zwafer_parser.py index 4245e7f..014aa32 100644 --- a/src/pygui/backend/wafer/zwafer_parser.py +++ b/src/pygui/backend/wafer/zwafer_parser.py @@ -33,10 +33,9 @@ class ZWaferParser: # ===== Header Parsing ===== def _process_header(self, file_obj) -> ZWaferData: """Parse header and sensor layout from open file object. - Handles two CSV row orderings: - 1. Label/X/Y rows BEFORE 'data' (fixture test format) - 2. 'data' row BEFORE Label/X/Y (some real CSV files) + 1. Label/X/Y rows BEFORE 'data' (fixture test format) + 2. 'data' row BEFORE Label/X/Y (some real CSV files) The C# parser handles both by collecting sensor layout rows regardless of whether 'data' has been seen. """ diff --git a/src/pygui/serialcomm/serial_port.py b/src/pygui/serialcomm/serial_port.py index b506c7d..1e187b4 100644 --- a/src/pygui/serialcomm/serial_port.py +++ b/src/pygui/serialcomm/serial_port.py @@ -196,7 +196,6 @@ class SerialPort: bytes 1016-1019 : Runtime (2 bytes hex → decimal seconds) bytes 1020-1023 : Cycle time (2 bytes hex → decimal cycles) """ - raw = bytes.fromhex(hex_response) family_code = self._hex_to_ascii(hex_response[0:2]) serial_num = f"{family_code}{int(hex_response[2:6], 16):05d}"