-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
123 lines (115 loc) · 4.94 KB
/
Copy pathpyproject.toml
File metadata and controls
123 lines (115 loc) · 4.94 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
[project]
name = "colver"
version = "0.11.1"
description = "Fast Belote Contree game engine with AI agents"
# Le README par défaut du dépôt est en français (`README.md`) : c'est la langue du
# site et des joueurs. La fiche PyPI, elle, s'adresse à qui installe le paquet —
# elle reste en anglais. Les deux fichiers sont tenus en parallèle.
readme = "README.en.md"
license = "MIT"
license-files = ["LICENSE"]
requires-python = ">=3.10"
keywords = ["belote", "card-game", "reinforcement-learning", "mcts"]
classifiers = [
"Development Status :: 4 - Beta",
"Programming Language :: Rust",
"Programming Language :: Python :: 3",
"Topic :: Games/Entertainment :: Board Games",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
# Le strict nécessaire pour `pip install colver`. Rien d'autre : la roue ne livre
# que `python/colver/`, donc ce que les scripts du dépôt importent n'a pas à être
# imposé à qui veut seulement charger un modèle. `matplotlib` (4 scripts de tracé)
# et `runpod` (un script de location de GPU) étaient ici et tiraient à eux seuls
# 103 paquets / 296 Mo, dont fastapi[all], boto3 et paramiko via runpod — contre
# 19 paquets / 94 Mo sans eux, à comportement identique. Ils vivent en groupe dev.
#
# `numpy` reste obligatoire : sans lui l'extension ne panique pas à l'import mais
# au premier appel qui rend un tableau (`legal_action_mask`), ce qui est pire.
# `huggingface_hub` l'est aussi depuis la 0.10 : les poids sont sur le Hub et
# `download_*` les rapatrie sans que l'utilisateur ait rien à installer de plus
# (+15 paquets, +23 Mo — on reste à 94 Mo contre 296 avant l'élagage). Le repli
# GitHub Releases survit à son absence, mais on ne veut pas en dépendre.
# `sentry-sdk` reste volontairement absent — cf. `web/server.py`.
dependencies = [
"numpy",
"huggingface_hub>=0.30",
]
[build-system]
requires = ["maturin>=1.0,<2.0"]
build-backend = "maturin"
[tool.maturin]
module-name = "colver._colver"
manifest-path = "colver-py/Cargo.toml"
python-source = "python"
[tool.uv]
# Local dev installs all extras
default-groups = ["dev"]
[dependency-groups]
# Le site est un GROUPE (PEP 735) et non un extra `[project.optional-dependencies]`,
# et la différence est visible de l'extérieur : un extra descend dans les
# métadonnées de la roue publiée, donc `pip install colver[web]` l'annonce et
# promet un module `colver.web`. Un groupe ne sort jamais du dépôt — il ne sert
# qu'à `uv sync`. Le site n'étant plus destiné à être distribué avec le paquet,
# la roue ne doit plus en porter la trace.
#
# Conséquence pour qui déploie : `--extra web` devient `--group web`, et il faut
# `--no-default-groups` à la place de `--no-dev` (sans quoi `dev`, qui tire torch,
# reviendrait par le défaut déclaré ci-dessus). Les deux lignes du `Dockerfile`.
web = [
"fastapi>=0.100.0",
"uvicorn[standard]>=0.30.0",
"websockets>=12.0",
"aiosqlite>=0.20.0",
"bcrypt>=4.0",
]
dev = [
{include-group = "web"},
"torch>=2.0",
"maturin>=1.0,<2.0",
"pandas>=2.3.3",
"scikit-learn>=1.7.2",
"xgboost>=3.2.0",
"shap>=0.49.1",
"matplotlib>=3.10.8", # scripts/analysis/ : tracés et SHAP
"runpod>=1.8.1", # scripts/training/runpod_race.py, location de GPU
{include-group = "test"},
]
# Séparé de `dev` : la CI installe *ce* groupe, pas torch et scikit-learn.
test = [
{include-group = "web"},
"pytest>=8.0",
"pytest-asyncio>=0.24",
"httpx>=0.27", # requis par fastapi.testclient
"ruff>=0.6",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
# Les tests du serveur sont asynchrones de bout en bout ; sans ce mode il
# faudrait décorer chaque coroutine, et un décorateur oublié fait *passer* le
# test sans rien exécuter — le pire mode d'échec possible pour une suite.
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
# Pas de warnings-as-errors pour l'instant : `server.py` utilise encore
# `@app.on_event`, déprécié par FastAPI (le passage à `lifespan` est prévu avec
# le drain, cf. docs/web_todo.md §2.6). Une règle qui échoue dès l'import ne
# dirait rien de plus que ce qui est déjà noté.
[tool.ruff]
# Le code du site est écrit large (chaînes SQL, messages en clair) ; on cadre
# sans reformater l'existant.
line-length = 110
target-version = "py310"
extend-exclude = ["scripts", "python/colver/_colver.pyi"]
[tool.ruff.lint]
select = ["E", "F", "W", "B", "UP", "C4"]
ignore = [
"E501", # longueur de ligne : le linter la mesure, il ne la corrige pas
"B008", # Depends() en valeur par défaut, l'idiome FastAPI
]
[tool.ruff.lint.per-file-ignores]
# `server.py` résout ses modèles au niveau module, entre deux blocs de
# configuration commentés : l'ordre est le sujet, pas un oubli.
"python/colver/web/server.py" = ["E402"]
# `conftest.py` neutralise les téléchargements de modèles *avant* d'importer
# quoi que ce soit du site — c'est tout l'intérêt du placement.
"tests/conftest.py" = ["E402"]