Skip to content

Commit f4a2954

Browse files
committed
refactor: extract test stubs and fix lint
1 parent f999758 commit f4a2954

8 files changed

+154
-151
lines changed

src/settings_widget.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from PyQt5.QtWidgets import (
44
QWidget,
55
QLabel,
6-
QLineEdit,
76
QGridLayout,
87
QCheckBox,
98
QPushButton,
@@ -17,7 +16,7 @@
1716

1817
from src import locales
1918
from src.settings import sett, APP_PATH, Settings, read_settings
20-
from src.qt_utils import ClickableLineEdit, LineEdit
19+
from src.qt_utils import ClickableLineEdit
2120

2221
import os.path as path
2322
import logging

test/figure_editor_stubs.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import sys
2+
import types
3+
4+
# Stubs for non-Qt dependencies used by FigureEditor
5+
6+
settings_widget_module = types.ModuleType("src.settings_widget")
7+
8+
9+
class SettingsWidget:
10+
def __init__(self, *args, **kwargs):
11+
self.extra_sett_parameters = []
12+
self.translation = {}
13+
14+
def from_settings(self, *args, **kwargs):
15+
return self
16+
17+
def with_delete(self, *args, **kwargs):
18+
return self
19+
20+
def with_sett(self, *args, **kwargs):
21+
return self
22+
23+
24+
settings_widget_module.SettingsWidget = SettingsWidget
25+
sys.modules["src.settings_widget"] = settings_widget_module
26+
27+
settings_module = types.ModuleType("src.settings")
28+
29+
30+
def sett():
31+
return None
32+
33+
34+
settings_module.sett = sett
35+
sys.modules["src.settings"] = settings_module
36+
37+
locales_module = types.ModuleType("src.locales")
38+
locales_module.getLocale = lambda x: x
39+
sys.modules["src.locales"] = locales_module

test/figure_editor_test.py

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,7 @@
1-
import sys
2-
import types
31
import unittest
42

53
import qt_stubs # noqa: F401
6-
7-
# Stub out project-specific modules that depend on PyQt5
8-
settings_widget_module = types.ModuleType("src.settings_widget")
9-
10-
11-
class SettingsWidget:
12-
def __init__(self, *args, **kwargs):
13-
self.extra_sett_parameters = []
14-
self.translation = {}
15-
16-
def from_settings(self, *args, **kwargs):
17-
return self
18-
19-
def with_delete(self, *args, **kwargs):
20-
return self
21-
22-
def with_sett(self, *args, **kwargs):
23-
return self
24-
25-
26-
settings_widget_module.SettingsWidget = SettingsWidget
27-
sys.modules["src.settings_widget"] = settings_widget_module
28-
29-
settings_module = types.ModuleType("src.settings")
30-
31-
32-
def sett():
33-
return None
34-
35-
36-
settings_module.sett = sett
37-
sys.modules["src.settings"] = settings_module
38-
39-
locales_module = types.ModuleType("src.locales")
40-
locales_module.getLocale = lambda x: x
41-
sys.modules["src.locales"] = locales_module
42-
43-
# --- End stubs ---
4+
import figure_editor_stubs # noqa: F401
445

456
from src.figure_editor import FigureEditor
467

test/gcode_stubs.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import sys
2+
import types
3+
import importlib
4+
5+
# Stubs for heavy dependencies not required for gcode parser tests
6+
7+
8+
def _prepare_transform(*args, **kwargs):
9+
class _Tf:
10+
def TransformPoint(self, pt):
11+
return pt
12+
13+
return _Tf()
14+
15+
16+
gui_utils_module = types.ModuleType("src.gui_utils")
17+
gui_utils_module.prepareTransform = _prepare_transform
18+
sys.modules["src.gui_utils"] = gui_utils_module
19+
sys.modules["vtk"] = types.ModuleType("vtk")
20+
sys.modules["stk"] = types.ModuleType("stk")
21+
22+
settings_module = types.ModuleType("src.settings")
23+
24+
25+
class _Hardware:
26+
rotation_center_x = 0
27+
rotation_center_y = 0
28+
rotation_center_z = 0
29+
30+
31+
class _Slicing:
32+
print_time = 0
33+
consumption_material = 0
34+
planes_contact_with_nozzle = ""
35+
36+
37+
_settings = types.SimpleNamespace(hardware=_Hardware(), slicing=_Slicing())
38+
39+
40+
def sett():
41+
return _settings
42+
43+
44+
settings_module.sett = sett
45+
sys.modules["src.settings"] = settings_module
46+
47+
src_pkg = importlib.import_module("src")
48+
src_pkg.settings = settings_module

test/gcode_test.py

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,14 @@
11
import unittest
2-
import sys
32
import types
4-
import os
53

6-
# Ensure the src package can be imported
7-
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
4+
import gcode_stubs # noqa: F401
85

9-
10-
# Stub heavy dependencies not required for parser logic
11-
def _prepare_transform(*args, **kwargs):
12-
class _Tf:
13-
def TransformPoint(self, pt):
14-
return pt
15-
16-
return _Tf()
17-
18-
19-
gui_utils_module = types.ModuleType("src.gui_utils")
20-
gui_utils_module.prepareTransform = _prepare_transform
21-
sys.modules["src.gui_utils"] = gui_utils_module
22-
sys.modules["vtk"] = types.ModuleType("vtk")
23-
sys.modules["stk"] = types.ModuleType("stk")
24-
25-
settings_module = types.ModuleType("src.settings")
26-
27-
28-
class _Hardware:
29-
rotation_center_x = 0
30-
rotation_center_y = 0
31-
rotation_center_z = 0
32-
33-
34-
class _Slicing:
35-
print_time = 0
36-
consumption_material = 0
37-
planes_contact_with_nozzle = ""
38-
39-
40-
_settings = types.SimpleNamespace(hardware=_Hardware(), slicing=_Slicing())
41-
42-
43-
def sett():
44-
return _settings
45-
46-
47-
settings_module.sett = sett
48-
49-
import importlib
50-
51-
src_pkg = importlib.import_module("src")
52-
src_pkg.settings = settings_module
53-
sys.modules["src.settings"] = settings_module
54-
55-
from src.gcode import parseRotation, Rotation, parseGCode, Printer
6+
from src.gcode import parseRotation, parseGCode, Printer
567

578

589
def parseArgs(args, X, Y, Z, abs_pos=True):
5910
"""Wrapper around Printer to mimic legacy parseArgs behaviour."""
60-
printer = Printer(sett())
11+
printer = Printer(gcode_stubs.sett())
6112
printer.currPos = types.SimpleNamespace(X=X, Y=Y, Z=Z, U=0, V=0, E=0)
6213
if abs_pos:
6314
printer.setAbsPos(args)

test/qt_stubs.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,4 +318,3 @@ def setLocale(self, *args, **kwargs):
318318
sys.modules["PyQt5.QtCore"] = qtcore
319319
sys.modules["PyQt5.QtGui"] = qtgui
320320
sys.modules["sip"] = sip
321-

test/settings_widget_reload_test.py

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,8 @@
1-
import sys
2-
import types
31
import unittest
42

53
import qt_stubs # noqa: F401
4+
import settings_widget_stubs # noqa: F401
65

7-
# Stubs for non-Qt dependencies used by SettingsWidget
8-
vtk = types.ModuleType("vtk")
9-
10-
11-
class vtkNamedColors:
12-
def GetColor3d(self, key):
13-
return (0, 0, 0)
14-
15-
16-
vtk.vtkNamedColors = vtkNamedColors
17-
sys.modules["vtk"] = vtk
18-
19-
qt_utils_stub = types.ModuleType("src.qt_utils")
20-
qt_utils_stub.ClickableLineEdit = qt_stubs.QLineEdit
21-
qt_utils_stub.LineEdit = qt_stubs.QLineEdit
22-
sys.modules["src.qt_utils"] = qt_utils_stub
23-
24-
settings_module = sys.modules.get("src.settings", types.ModuleType("src.settings"))
25-
26-
27-
class Settings:
28-
def __init__(self, data=None):
29-
if data is None:
30-
data = {}
31-
for k, v in data.items():
32-
if isinstance(v, dict):
33-
v = Settings(v)
34-
setattr(self, k, v)
35-
36-
37-
settings_module.Settings = Settings
38-
settings_module.read_settings = lambda filename=None: {"slicing": {"fill_density": 0}}
39-
settings_module.APP_PATH = ""
40-
sys.modules["src.settings"] = settings_module
41-
42-
# Stub locales module expected by SettingsWidget
43-
locales_module = types.ModuleType("src.locales")
44-
45-
46-
class Locale:
47-
GroupNames = {}
48-
Settings = "Settings"
49-
FillDensity = "Fill Density"
50-
51-
def __getattr__(self, item):
52-
return item
53-
54-
55-
locales_module.Locale = Locale
56-
locales_module.getLocale = lambda: Locale()
57-
sys.modules["src.locales"] = locales_module
58-
59-
sys.modules.pop("src.settings_widget", None)
606
from src.settings_widget import SettingsWidget
617
from src.settings import Settings
628

@@ -74,4 +20,3 @@ def test_reload_repopulates(self):
7420

7521
if __name__ == "__main__":
7622
unittest.main()
77-

test/settings_widget_stubs.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import sys
2+
import types
3+
4+
import qt_stubs # noqa: F401
5+
6+
# Ensure real SettingsWidget can be imported even if previous tests stubbed it
7+
sys.modules.pop("src.settings_widget", None)
8+
9+
# Stub vtk dependency
10+
vtk = types.ModuleType("vtk")
11+
12+
13+
class vtkNamedColors:
14+
def GetColor3d(self, key):
15+
return (0, 0, 0)
16+
17+
18+
vtk.vtkNamedColors = vtkNamedColors
19+
sys.modules["vtk"] = vtk
20+
21+
# Stub Qt utility helpers
22+
qt_utils_stub = types.ModuleType("src.qt_utils")
23+
qt_utils_stub.ClickableLineEdit = qt_stubs.QLineEdit
24+
qt_utils_stub.LineEdit = qt_stubs.QLineEdit
25+
sys.modules["src.qt_utils"] = qt_utils_stub
26+
27+
# Stub settings module used by SettingsWidget
28+
settings_module = sys.modules.get("src.settings", types.ModuleType("src.settings"))
29+
30+
31+
class Settings:
32+
def __init__(self, data=None):
33+
if data is None:
34+
data = {}
35+
for k, v in data.items():
36+
if isinstance(v, dict):
37+
v = Settings(v)
38+
setattr(self, k, v)
39+
40+
41+
settings_module.Settings = Settings
42+
settings_module.read_settings = lambda filename=None: {"slicing": {"fill_density": 0}}
43+
settings_module.APP_PATH = ""
44+
sys.modules["src.settings"] = settings_module
45+
46+
# Stub locales expected by SettingsWidget
47+
locales_module = types.ModuleType("src.locales")
48+
49+
50+
class Locale:
51+
GroupNames = {}
52+
Settings = "Settings"
53+
FillDensity = "Fill Density"
54+
55+
def __getattr__(self, item):
56+
return item
57+
58+
59+
locales_module.Locale = Locale
60+
locales_module.getLocale = lambda: Locale()
61+
sys.modules["src.locales"] = locales_module

0 commit comments

Comments
 (0)