Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
161 lines (149 loc) · 6.29 KB
/
Copy pathpyproject.toml
File metadata and controls
161 lines (149 loc) · 6.29 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
[project]
name = "netcross"
version = "1.0.0"
description = "Analyse croisee de captures reseau multi-points (pcap_parser/tshark, netcross_core, netcross_report, CLI, GUI GTK4)"
requires-python = ">=3.10"
# >=3.10 (et non >=3.9, la cible historique de `ruff target-version`
# ci-dessous, qui ne fixe que la syntaxe autorisee, jamais l'interpreteur
# minimal d'execution) : import-linter>=2.13 (extra dev) exige lui-meme
# Python>=3.10 -- `uv lock` echoue sinon sur la resolution de l'extra
# dev ("No solution found ... python_full_version > '3.9' and < '3.10'"),
# meme si le code applicatif de netcross reste compatible 3.9. Aucun
# changement de syntaxe necessaire dans src/ pour cette session.
# Memes bornes que requirements.txt (source historique, conservee pour
# l'installation systeme via install.sh -- voir commentaire [tool.uv]
# ci-dessous). GTK4/PyGObject INTENTIONNELLEMENT absent : bibliotheque
# systeme, jamais installable proprement via pip/uv, voir install.sh.
dependencies = [
"cryptography>=41.0",
"loguru>=0.7",
"reportlab>=4.0",
"matplotlib>=3.6",
"networkx>=2.8",
]
[project.optional-dependencies]
# Memes bornes que requirements-dev.txt -- outillage qualite uniquement,
# jamais installe en production (voir requirements-dev.txt).
dev = [
"pytest>=8.0",
"pytest-cov>=5.0",
"ruff==0.16.4",
"import-linter>=2.13",
"pre-commit>=4.0",
"mypy>=1.10",
# validation des bundles STIX 2.1 dans les tests (issue #279) ; 3.3.x est
# publie sans les schemas OASIS (schemas-2.1 absent du wheel)
"stix2-validator>=3.2,<3.3",
# lecture des workflows GitHub Actions dans les tests (issue #334) : deja
# tiree par pre-commit, declaree ici pour ne pas dependre d'une dependance
# transitive
"pyyaml>=6.0",
]
# API REST (issue #209) : jamais obligatoire pour le cœur ou les rapports.
# Installé avec : pip install -e ".[api]" ou uv sync --extra api
api = [
"fastapi>=0.100",
"uvicorn>=0.20",
"python-multipart>=0.0.6",
"httpx>=0.24", # pour TestClient dans les tests
]
# Module IA/ML local (issue #146) : jamais obligatoire -- sans lui, seules
# les options --ai-anomalies/--ai-classify le signalent.
# Installe avec : pip install -e ".[ai]" ou uv sync --extra ai
ai = [
"scikit-learn>=1.5",
]
# Documentation navigable (issue #282) : MkDocs Material + extensions.
# Installe avec : uv sync --extra docs
docs = [
"mkdocs>=1.6",
"mkdocs-material>=9.5",
"pymdown-extensions>=10.7",
]
[tool.uv]
# `package = false` : netcross est une application lancee via
# `PYTHONPATH=src` (voir pytest.ini/README.md), pas une bibliotheque
# distribuee comme wheel -- uv gere alors la resolution/le lock
# (uv.lock) et l'environnement (.venv) sans exiger de [build-system]/
# backend de build, exactement le meme modele que le pip+requirements.txt
# remplace par cette migration (aucune trace de poetry trouvee dans le
# projet avant cette session -- pyproject.toml n'avait qu'une section
# [tool.ruff]/[tool.importlinter], jamais de [tool.poetry] -- migration
# donc interpretee comme pip+requirements.txt -> uv, voir CLAUDE.md/
# docs/sessions/session-55.md).
package = false
[tool.ruff]
line-length = 120
target-version = "py39"
[tool.ruff.lint]
# TID : necessaire pour que `ban-relative-imports` ci-dessous soit reellement applique --
# sans TID dans ce `select`, la regle TID252 n'est jamais evaluee et le ban est silencieusement
# inoperant (verifie : 0 violation TID252 remontee sans TID, 76 avec, sur le meme code).
select = ["E", "W", "F", "I", "B", "C4", "UP", "SIM", "N", "PERF", "RUF", "TID"]
# RUF100 : ignore les "noqa inutiles" -- le projet utilise des noqa (BLE001, RUF007)
# pour des regles hors de ce `select`; les garder documente une decision volontaire.
ignore = ["RUF100"]
[tool.ruff.lint.flake8-tidy-imports]
ban-relative-imports = "all"
[tool.importlinter]
root_packages = ["netcross_gtk4", "netcross_report", "netcross_api", "netcross_ai", "netcross_core", "pcap_parser"]
include_external_packages = true
[[tool.importlinter.contracts]]
name = "Pas de cycles internes"
type = "layers"
# netcross_gtk4 et netcross_api sont deux surfaces independantes (aucune
# n'importe l'autre), au-dessus de netcross_report : l'API sert le meme
# rapport structure que la CLI et la GUI (issue #330).
layers = [
"netcross_gtk4 | netcross_api",
"netcross_report",
"netcross_ai",
"netcross_core",
"pcap_parser",
]
[tool.mypy]
# Configuration permissive de base (issue #281) : le code est largement
# annote mais rien ne le verifiait. On active mypy en CI de facon NON
# BLOQUANTE d abord, avec une baseline progressive par module.
# Les modules migres en strict sont listes ci-dessous -- la liste ne
# recule jamais.
python_version = "3.14"
files = ["src"]
ignore_missing_imports = true
warn_unused_ignores = true
warn_redundant_casts = true
# Exclut les stubs numpy (incompatibles avec certaines versions Python).
exclude = [".venv/"]
# Etat de reference (22/09/2026, Python 3.14) : 13 erreurs sur 7 fichiers.
# netcross_core : 12 erreurs (analysis, application/dns, application/http,
# fingerprint/report, naming, security/lateral_movement)
# pcap_parser : 1 erreur (capfile, no-redef)
# Objectif : migrer module par module, du plus stable au plus mouvant.
[[tool.mypy.overrides]]
# Aucun module en strict pour l instant -- cette section grandira
# au fur et a mesure des migrations.
module = []
disallow_untyped_defs = true
strict_optional = true
[tool.coverage.run]
# Mesure la couverture du code source uniquement (pas des tests eux-memes).
# branch=true : suit aussi la couverture des branches (if/else), pas
# seulement des lignes -- plus fidele qu'un comptage de lignes seul.
source = ["src"]
branch = true
[tool.coverage.report]
precision = 1
# Seuil bloquant (issue #246), decide APRES le traitement de app.py (#285)
# comme le demandait l'issue : 82,2 % mesures sur dev le 2026-09-23, avec
# ou sans tshark. Deux points de marge pour absorber une PR qui ajoute du
# code GTK non testable, pas davantage : au-dela, le seuil ne retiendrait
# plus rien. Ne s'applique qu'aux executions avec --cov (la CI) ; relever
# ce chiffre quand la base monte, ne jamais le baisser pour faire passer
# une PR. Detail : docs/quality/seuil-couverture.md.
fail_under = 80
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"if __name__ == .__main__.:",
"raise NotImplementedError",
]