[project] name = "pyssh-client" version = "0.1.0" description = "Client SSH/SFTP local (PySide6) : terminaux, tunnels, snippets, workspaces, assistant IA optionnel" readme = "README.md" requires-python = ">=3.10" # Les dependances (runtime et dev) restent dans requirements.txt / # requirements-dev.txt, deja utilises par setup.bat et la CI : les dupliquer # ici cree un risque de desynchronisation pour aucun benefice reel, puisque # le projet se distribue par PyInstaller (voir PySSHClient.spec), pas par # "pip install". Ce fichier sert de point d'entree unique pour la # configuration des outils (ruff, pytest, pyright). [tool.ruff] line-length = 110 target-version = "py310" extend-exclude = ["venv", "build", "dist"] [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"] ignore = [ "E501", # ligne trop longue : laisse au formateur, pas bloquant en l'etat "E702", # construction compacte "widget = X(); widget.setY(...)" deliberee # dans les panneaux SFTP/tunnels (un widget + sa config tiennent sur # une ligne) : reecrire l'existant pour ca serait pur churn. "E402", # plusieurs tests importent un symbole juste avant la section qui # l'utilise pour la premiere fois, plutot qu'en haut du fichier - # lisible dans des scripts sequentiels longs, et sans risque tant # que l'import n'a pas d'effet de bord ordonne. ] [tool.ruff.lint.isort] known-first-party = ["app"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_all_scripts.py"] [tool.pyright] include = ["app", "main.py"] exclude = ["venv", "build", "dist", "tests"] venvPath = "." venv = "venv" # "basic" plutot que "strict" : le code n'a jamais ete type jusqu'ici, un mode # strict noierait les vrais signaux sous des milliers d'avertissements de # typage progressif. A resserrer progressivement, fichier par fichier. typeCheckingMode = "basic" pythonVersion = "3.10" reportMissingImports = true # Desactive : plus de 200 occurrences sont l'acces "plat" aux enums Qt # (Qt.UserRole, QToolButton.InstantPopup...) - un style PyQt5 historique que # PySide6 continue de supporter a l'execution, mais que ses stubs ne # reconnaissent qu'a travers leur forme imbriquee (Qt.ItemDataRole.UserRole). # Utilise partout dans ce projet, sans exception, et sans le moindre risque # reel : le desactiver evite de noyer les vrais signaux. Le reste (une # vingtaine de cas ou pyright perd le fil sur des patterns dynamiques - le # monkey-patching de pyte dans terminal_widget.py, les QWidget generiques de # split_pane.py) reste dans le rapport, a regarder au cas par cas plutot que # supprime en bloc. reportAttributeAccessIssue = false