-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathpyproject.toml
More file actions
119 lines (108 loc) · 5.02 KB
/
Copy pathpyproject.toml
File metadata and controls
119 lines (108 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
[project]
name = "corbeausplat"
version = "2.0.0"
description = "Gaussian Splatting toolkit with GUI"
# Upper bound mirrors CorbeauSplat.command, which only accepts 3.10-3.13 and
# rebuilds the venv when it finds a newer one: several wheels (pyobjc) have
# no build for 3.14 yet. No 3.11+ syntax is used in app/, so 3.10 stands.
requires-python = ">=3.10,<3.14"
# Doit rester synchronisé avec requirements.txt (source du lock et de la CI).
# Sans cette section, deptry ne voit aucune dépendance déclarée et remonte
# ~40 faux positifs DEP001 sur PySide6/numpy/plyfile/PIL.
dependencies = [
"PySide6>=6.6,<7",
# requests/urllib3 retirés (deptry DEP002, item A2-M14) : aucun fichier ne
# les importe, tout le réseau passe par urllib.request (stdlib — à ne pas
# confondre avec urllib3). Ils restent installés en dev, tirés par pip-audit.
"numpy>=1.26,<3",
"send2trash>=1.8,<2",
"pyobjc-framework-Cocoa>=10.0,<11; sys_platform == 'darwin'",
"Pillow>=12.3,<13",
"plyfile>=0.7,<1",
"opencv-python-headless>=4.8,<5",
"trimesh>=4.0,<6",
]
[project.optional-dependencies]
dev = [
"ruff>=0.11,<1",
"mypy>=1.15,<2",
"deptry>=0.23,<1",
"pytest>=9.0,<10",
"pytest-qt>=4.4,<5",
"pytest-cov>=7.0,<8",
"pip-audit>=2.8,<3",
"pip-tools>=7.4,<8",
]
[tool.deptry]
# Modules importés dont le nom diffère du nom de paquet : sans cette table,
# deptry ne peut pas faire le lien hors environnement installé.
[tool.deptry.package_module_name_map]
Pillow = ["PIL"]
opencv-python-headless = ["cv2"]
pyobjc-framework-Cocoa = ["AppKit", "Foundation", "objc"]
PySide6 = ["PySide6"]
send2trash = ["send2trash"]
[tool.deptry.per_rule_ignores]
# Imports optionnels, résolus à l'exécution et déjà protégés par try/except :
# backends d'export GLB/SPZ et modules Blender.
# trimesh est désormais déclaré (le lanceur l'installait en douce, hors lock).
DEP001 = ["open3d", "spz", "bpy"]
# Mêmes modules, autre règle : spz est compilé et installé dans le venv par son
# propre installeur (app/scripts/installers/spz.py), jamais par pip depuis
# requirements. deptry le voit donc « installé mais non déclaré » (DEP003) quand
# il est présent, et « non déclaré » (DEP001) sinon — les deux listes doivent
# couvrir le même ensemble pour que le résultat ne dépende pas de l'état du venv.
DEP003 = ["open3d", "spz", "bpy"]
# Outils de dev déclarés dans l'extra [dev], jamais importés par le code.
DEP002 = ["ruff", "mypy", "deptry", "pytest", "pytest-qt", "pytest-cov", "pip-audit", "pip-tools"]
[tool.ruff]
target-version = "py310"
line-length = 160
[tool.ruff.lint]
select = ["E", "F", "I", "W", "UP", "B", "SIM", "ARG001"]
# N (naming) reste désactivée : bruit systématique avec les conventions PySide6
# (camelCase des overrides et des signaux).
# ARG est activée pour ARG001 seulement — les paramètres morts de fonctions
# libres, exactement le cas qui avait laissé passer `project_root` dans
# validate_path_standalone (audit I4). ARG002 (méthodes) et ARG005 (lambdas)
# restent désactivées : les interfaces uniformes (méthodes d'export partageant
# une signature, overrides Qt, installeurs) imposent des paramètres non lus.
ignore = ["SIM117"]
[tool.ruff.lint.per-file-ignores]
# Les décorateurs @patch injectent des arguments que le test n'utilise pas
# toujours ; les signaler n'apprend rien.
"tests/**" = ["ARG001"]
# SIM117 (nested with) : ~40 occurrences, uniquement des blocs mock.patch
# imbriqués dans les tests — réécriture mécanique risquée pour un gain
# purement stylistique.
[tool.mypy]
# strict = true jamais validé : mypy n'était jamais atteint en CI (ruff
# bloquait avant), 2072 erreurs sur ce codebase historiquement non typé.
# Mode par défaut : 29 erreurs réelles, corrigées.
[[tool.mypy.overrides]]
# AppKit/Foundation (pyobjc) and spz ship without stubs or a py.typed marker:
# mypy reports import-untyped for them. Silencing the import only, not their call sites.
module = ["PySide6.*", "cv2.*", "numpy.*", "plyfile.*", "trimesh.*", "open3d.*", "PIL.*", "send2trash.*", "objc.*", "AppKit.*", "Foundation.*", "spz.*"]
ignore_missing_imports = true
# Subprocess tests build real Qt panels (tests/_real_qt.py); without parallel
# mode their data file would overwrite the parent's, and the panels would keep
# reading as untested while being exercised.
[tool.coverage.run]
source = ["app"]
parallel = true
omit = ["*/__pycache__/*"]
[tool.coverage.report]
skip_empty = true
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
# Les tests e2e réels (binaires colmap/brush) sont lents et opt-in : désélectionnés
# par défaut. Pour les lancer : pytest -m e2e
addopts = "-m 'not e2e'"
markers = [
"e2e: pipeline end-to-end réel avec vrais binaires (colmap, brush) — lent, opt-in",
"e2e_sharp: e2e réel Sharp (nécessite .venv_sharp + ffmpeg)",
"e2e_upscale: e2e réel Upscale (nécessite upscayl-bin + modèles)",
"e2e_4dgs: e2e réel 4DGS (nécessite .venv_4dgs + ffmpeg + colmap)",
"e2e_360: e2e réel 360 Extractor (nécessite .venv_360)",
]