Skip to content

Commit a66b63b

Browse files
authored
Merge pull request #157 from ColinMaudry/release/2.6.0
Release/2.6.0
2 parents b4210f0 + 1dccb7f commit a66b63b

26 files changed

+1288
-789
lines changed

.github/workflows/test.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Tests et couverture
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
branches: [ main ]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
- name: Set up Python
15+
uses: actions/setup-python@v4
16+
with:
17+
python-version: '3.10'
18+
- name: Install dependencies
19+
run: |
20+
pip install -e .[dev]
21+
- name: Run tests with coverage
22+
run: pytest --cov=src --cov-report=term

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ logs
66
.venv
77
*.egg-info
88
*.parquet
9+
!tests/data/sirene/*.parquet
910
!code_officiel_geographique.parquet
1011
*.gz
1112
*.zip

CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
1+
### 2.6.0 2025-12-12
2+
3+
- Abandon des données consolidées par le MINEF, récupération des données à la source ([#151](https://github.com/ColinMaudry/decp-processing/issues/151))
4+
- Xmarchés
5+
- AWS (officiel et legacy)
6+
- PES marché (avant et après 2024)
7+
- Dematis / e-marchespublics
8+
- Ajout du champ `dureeRestanteMois` ([#135](https://github.com/ColinMaudry/decp-processing/issues/135))
9+
- Amélioration des noms des titulaires (personnes physiques et non-diffusibles) ([#145](https://github.com/ColinMaudry/decp-processing/issues/145))
10+
- Ajout de nombreux tests unitaires
11+
- Amélioration de la gestion des modifications ([#148](https://github.com/ColinMaudry/decp-processing/issues/148))
12+
- Traitement des ressources en parallèle ([#113](https://github.com/ColinMaudry/decp-processing/issues/113))
13+
- Optimisation de la consommation de mémoire (matérialisation en parquet) ([#153](https://github.com/ColinMaudry/decp-processing/issues/153))
14+
- Résilience contre les erreurs pendant get_clean (seule la ressource échoue, pas tout le process)
15+
- Mise en place d'un système de cache custom (parquet)
16+
- Protection contre la publication par erreur sur data.gouv.fr ([ffaf0535](https://github.com/ColinMaudry/decp-processing/commit/ffaf0535))
17+
- Utilisation de polars 1.35.2 plutôt que 1.36.1 qui semble ne pas marcher avec polars-ds
18+
119
### 2.5.0 2025-11-21
220

3-
- Ajout de la durée restante dans le marché en mois ([#35](https://github.com/ColinMaudry/decp-processing/issues/135))
421
- Amélioration de la conso mémoire de la correction des titulaires ([#146](https://github.com/ColinMaudry/decp-processing/issues/146))
522
- Vérfication de la structude des données scrapées (AWS)
623
- Gestion propre des erreurs 429 Too Many Redirects ([6fbd71e0](https://github.com/ColinMaudry/decp-processing/commit/6fbd71e0bca0534ee360dc172f3565607dac5bef))

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# DECP processing
22

3-
> version 2.5.0 ([notes de version](https://github.com/ColinMaudry/decp-processing/blob/main/CHANGELOG.md))
3+
> version 2.6.0 ([notes de version](https://github.com/ColinMaudry/decp-processing/blob/main/CHANGELOG.md))
44
55
Projet de traitement et de publication de meilleures données sur les marchés publics attribués en France. Vous pouvez consulter, filtrer et télécharger
66
ces données sur le site [decp.info](https://decp.info). Enfin la section [À propos](https://decp.info/a-propos) décrit les objectifs du projet et regroupe toutes les informations clés.
@@ -59,7 +59,7 @@ source .venv/bin/activate
5959
Installez les dépendances :
6060

6161
```bash
62-
pip install .
62+
pip install -e .
6363
```
6464

6565
Pour les contributeurices, installez les dépendances de développement et l'auto-formatage au moment des commits :
@@ -110,7 +110,7 @@ Déploiement des flows (exécution programmée de main ou ponctuelle de dev) :
110110
Le pré-traitement des données SIRENE doit être fait une fois pour que le traitement principal soit fonctionnel.
111111

112112
```bash
113-
pytest tests/test_sirene_preprocess.py
113+
python run_flow.py sirene_preprocess
114114
```
115115

116116
Lancement du traitement principal (data_tables + decp.info) via un serveur prefect à usage unique

data/source_datasets.json

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,6 @@
239239
"owner_org_name": "ATEXO - DECP",
240240
"code": "atexo_mp_596280"
241241
},
242-
{
243-
"id": "5cd57bf68b4c4179299eb0e9",
244-
"name": "Données essentielles de la commande publique - fichiers consolidés",
245-
"owner_org_name": "Ministère de l'économie, des Finances et de l'Industrie",
246-
"code": "decp_minef"
247-
},
248242
{
249243
"id": "65f18014e9923e9e71f5f258",
250244
"name": "Données essentielles du profil acheteur Mégalis Bretagne - schéma arrêtés 2022",
@@ -275,10 +269,46 @@
275269
"code": "aws_marches-publics.info",
276270
"owner_org_name": "AWSolutions"
277271
},
272+
{
273+
"id": "5cdb1722634f41416ffe90e2",
274+
"name": "Données de marches-publics.info (AWS) - legacy",
275+
"code": "aws_marches-publics.info_legacy",
276+
"owner_org_name": "MINEF"
277+
},
278278
{
279279
"id": "68caf6b135f19236a4f37a32",
280280
"name": "Données de marches-publics.info (AWS) - scraping",
281281
"code": "scrap_marches-publics.info",
282282
"owner_org_name": "Colin Maudry"
283+
},
284+
{
285+
"id": "651eb149add2f419788c36ef",
286+
"name": "Données essentielles des marchés publics - Xmarchés",
287+
"code": "xmarches",
288+
"owner_org_name": "SPL-XDEMAT"
289+
},
290+
{
291+
"id": "65cf3c55ec910b5a8e2fc084",
292+
"name": "Données essentielles PES marché depuis 2024",
293+
"code": "pes_marche_2024",
294+
"owner_org_name": "MINEF"
295+
},
296+
{
297+
"id": "6932eab9f5ef60c27eba22ff",
298+
"name": "Données essentielles PES marché avant 2024 (legacy)",
299+
"code": "pes_marche_legacy",
300+
"owner_org_name": "Colin Maudry"
301+
},
302+
{
303+
"id": "5c0a7845634f4139b2ee8883",
304+
"name": "Données essentielles des marchés publics - e-marchespublics.com",
305+
"code": "e-marchespublics.com_dematis",
306+
"owner_org_name": "Dematis"
307+
},
308+
{
309+
"id": "6780e55f813a85efbd2c6557",
310+
"name": "Les Personnes placées sous main de justice - IDF 2024",
311+
"code": "ppsmj",
312+
"owner_org_name": "Yael Siksik"
283313
}
284314
]

pyproject.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ authors = [
99
dependencies = [
1010
"python-dotenv",
1111
"pandas", # nécessaire pour l'écriture en base de données
12-
"polars==1.33.1",
12+
"polars==1.35.2",
1313
"pyarrow",
1414
"frictionless",
1515
"ipykernel",
16-
"prefect==3.4.17",
16+
"prefect==3.6.6",
17+
"prefect[email]==3.6.6",
1718
"orjson",
1819
"ijson==3.4.0",
1920
"lxml",
@@ -29,6 +30,7 @@ dev = [
2930
"pre-commit",
3031
"pytest-env",
3132
"pytest",
33+
"pytest-cov"
3234
]
3335

3436
[tool.pytest.ini_options]
@@ -40,9 +42,10 @@ testpaths = [
4042
]
4143
env = [
4244
"DATASETS_REFERENCE_FILEPATH=tests/data/source_datasets_test.json",
45+
"SIRENE_DATA_DIR=tests/data/sirene",
4346
"PREFECT_API_URL=",
4447
"DECP_PROCESSING_PUBLISH=",
45-
"PREFECT_TASKS_REFRESH_CACHE=true"
48+
"DECP_USE_CACHE=false"
4649
]
4750
addopts = "-p no:warnings"
4851

src/config.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
from dotenv import find_dotenv, load_dotenv
1111
from ijson import sendable_list
1212

13-
from src.schemas import SCHEMA_MARCHE_2019, SCHEMA_MARCHE_2022
14-
1513
dotenv_path = find_dotenv()
1614
if dotenv_path == "":
1715
print("Création du fichier .env à partir de template.env")
@@ -71,6 +69,9 @@ def make_path_from_env(env: str, alternative_path: Path) -> Path:
7169
# Clé d'API data.gouv.fr
7270
DATAGOUVFR_API_KEY = os.getenv("DATAGOUVFR_API_KEY", "")
7371

72+
# URL API Prefect
73+
PREFECT_API_URL = os.getenv("PREFECT_API_URL")
74+
7475
# Dossier racine
7576
BASE_DIR = make_path_from_env("DECP_BASE_DIR", Path(__file__).absolute().parent.parent)
7677
print(f"{'BASE_DIR':<40}", BASE_DIR)
@@ -80,6 +81,9 @@ def make_path_from_env(env: str, alternative_path: Path) -> Path:
8081
DATA_DIR.mkdir(exist_ok=True, parents=True)
8182
print(f"{'DATA_DIR':<40}", DATA_DIR)
8283

84+
RESOURCE_CACHE_DIR = DATA_DIR / "resource_cache"
85+
RESOURCE_CACHE_DIR.mkdir(exist_ok=True, parents=True)
86+
8387
DIST_DIR = make_path_from_env("DECP_DIST_DIR", BASE_DIR / "dist")
8488
DIST_DIR.mkdir(exist_ok=True, parents=True, mode=777)
8589
print(f"{'DIST_DIR':<40}", DIST_DIR)
@@ -97,7 +101,15 @@ def make_sirene_data_dir(sirene_data_parent_dir) -> Path:
97101

98102

99103
SIRENE_DATA_PARENT_DIR = make_path_from_env("SIRENE_DATA_PARENT_DIR", DATA_DIR)
100-
SIRENE_DATA_DIR = make_sirene_data_dir(SIRENE_DATA_PARENT_DIR)
104+
105+
# SIRENE_DATA_DIR ne doit être spécifié que pour les tests. Laisser vide dans .env et laisser make_sirene_data_dir
106+
# le déterminer
107+
SIRENE_DATA_DIR = os.getenv(
108+
"SIRENE_DATA_DIR", make_sirene_data_dir(SIRENE_DATA_PARENT_DIR)
109+
)
110+
if isinstance(SIRENE_DATA_DIR, str):
111+
SIRENE_DATA_DIR = Path(os.path.join(BASE_DIR, SIRENE_DATA_DIR))
112+
101113
# SIRENE_DATA_DIR on ne le crée que si nécessaire, dans flows.py
102114
print(f"{'SIRENE_DATA_PARENT_DIR':<40}", SIRENE_DATA_PARENT_DIR)
103115
print(f"{'SIRENE_DATA_DIR':<40}", SIRENE_DATA_DIR)
@@ -113,6 +125,8 @@ def make_sirene_data_dir(sirene_data_parent_dir) -> Path:
113125
SCRAPING_TARGET = os.getenv("SCRAPING_TARGET")
114126
print(f"{'SCRAPING_TARGET':<40}", SCRAPING_TARGET)
115127

128+
# Lecture ou non des ressource en cache
129+
DECP_USE_CACHE = os.getenv("DECP_USE_CACHE", "false").lower() == "true"
116130

117131
# Dossier de stockage des résultats de tâches et du cache
118132
# https://docs.prefect.io/v3/advanced/results#default-persistence-configuration
@@ -204,8 +218,4 @@ class DecpFormat:
204218
coroutine_ijson: Coroutine | None = None
205219

206220

207-
DECP_FORMAT_2019 = DecpFormat("DECP 2019", SCHEMA_MARCHE_2019, "marches")
208-
DECP_FORMAT_2022 = DecpFormat("DECP 2022", SCHEMA_MARCHE_2022, "marches.marche")
209-
DECP_FORMATS = [DECP_FORMAT_2019, DECP_FORMAT_2022]
210-
211221
print("")

0 commit comments

Comments
 (0)